galaxy-commits
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 15302 discussions
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/29957b479e5d/
changeset: 29957b479e5d
user: jgoecks
date: 2012-12-18 19:35:56
summary: Bowtie2 wrapper: move read group parameters out of full parameter settings and into own group.
affected #: 1 file
diff -r e6030730bb85b532534f7229c79751efadcd1eb7 -r 29957b479e5d1e376a2b47dfdf7bd76dcd980fc6 tools/sr_mapping/bowtie2_wrapper.xml
--- a/tools/sr_mapping/bowtie2_wrapper.xml
+++ b/tools/sr_mapping/bowtie2_wrapper.xml
@@ -46,11 +46,11 @@
#end if
## Read group information.
- #if $params.readGroup.specReadGroup == "yes"
- --rgid="$params.readGroup.rgid"
- --rglb="$params.readGroup.rglb"
- --rgpl="$params.readGroup.rgpl"
- --rgsm="$params.readGroup.rgsm"
+ #if $readGroup.specReadGroup == "yes"
+ --rgid="$readGroup.rgid"
+ --rglb="$readGroup.rglb"
+ --rgpl="$readGroup.rgpl"
+ --rgsm="$readGroup.rgsm"
#end if
</command><inputs>
@@ -114,21 +114,21 @@
</when><when value="No" /></conditional>
- <conditional name="readGroup">
- <param name="specReadGroup" type="select" label="Specify the read group for this file?">
- <option value="yes">Yes</option>
- <option value="no" selected="True">No</option>
- </param>
- <when value="yes">
- <param name="rgid" type="text" size="25" label="Read group identifier (ID). Each @RG line must have a unique ID. The value of ID is used in the RG tags of alignment records. Must be unique among all read groups in header section." help="Required if RG specified. Read group IDs may be modified when merging SAM files in order to handle collisions." />
- <param name="rglb" type="text" size="25" label="Library name (LB)" help="Required if RG specified" />
- <param name="rgpl" type="text" size="25" label="Platform/technology used to produce the reads (PL)" help="Required if RG specified. Valid values : CAPILLARY, LS454, ILLUMINA, SOLID, HELICOS, IONTORRENT and PACBIO" />
- <param name="rgsm" type="text" size="25" label="Sample (SM)" help="Required if RG specified. Use pool name where a pool is being sequenced" />
- </when>
- <when value="no" />
- </conditional></when><!-- full --></conditional><!-- params -->
+ <conditional name="readGroup">
+ <param name="specReadGroup" type="select" label="Specify the read group for this file?">
+ <option value="yes">Yes</option>
+ <option value="no" selected="True">No</option>
+ </param>
+ <when value="yes">
+ <param name="rgid" type="text" size="25" label="Read group identifier (ID). Each @RG line must have a unique ID. The value of ID is used in the RG tags of alignment records. Must be unique among all read groups in header section." help="Required if RG specified. Read group IDs may be modified when merging SAM files in order to handle collisions." />
+ <param name="rglb" type="text" size="25" label="Library name (LB)" help="Required if RG specified" />
+ <param name="rgpl" type="text" size="25" label="Platform/technology used to produce the reads (PL)" help="Required if RG specified. Valid values : CAPILLARY, LS454, ILLUMINA, SOLID, HELICOS, IONTORRENT and PACBIO" />
+ <param name="rgsm" type="text" size="25" label="Sample (SM)" help="Required if RG specified. Use pool name where a pool is being sequenced" />
+ </when>
+ <when value="no" />
+ </conditional><!-- readGroup --></inputs><outputs>
https://bitbucket.org/galaxy/galaxy-central/changeset/715063d652ab/
changeset: 715063d652ab
user: jgoecks
date: 2012-12-18 20:02:12
summary: Add simple read group options to Tophat2 wrapper.
affected #: 2 files
diff -r 29957b479e5d1e376a2b47dfdf7bd76dcd980fc6 -r 715063d652abc9dc3197617012763284143e7ab2 tools/ngs_rna/tophat2_wrapper.py
--- a/tools/ngs_rna/tophat2_wrapper.py
+++ b/tools/ngs_rna/tophat2_wrapper.py
@@ -83,6 +83,12 @@
parser.add_option( '', '--single-paired', dest='single_paired', help='' )
parser.add_option( '', '--settings', dest='settings', help='' )
+ # Read group options.
+ parser.add_option( '', '--rgid', dest='rgid', help='Read group identifier' )
+ parser.add_option( '', '--rglb', dest='rglb', help='Library name' )
+ parser.add_option( '', '--rgpl', dest='rgpl', help='Platform/technology used to produce the reads' )
+ parser.add_option( '', '--rgsm', dest='rgsm', help='Sample' )
+
(options, args) = parser.parse_args()
# Color or base space
@@ -137,6 +143,15 @@
opts += ' -r %s' % options.mate_inner_dist
if options.report_discordant_pairs:
opts += ' --report-discordant-pair-alignments'
+ # Read group options.
+ if options.rgid:
+ if not options.rglb or not options.rgpl or not options.rgsm:
+ stop_err( 'If you want to specify read groups, you must include the ID, LB, PL, and SM tags.' )
+ opts += ' --rg-id %s' % options.rgid
+ opts += ' --rg-library %s' % options.rglb
+ opts += ' --rg-platform %s' % options.rgpl
+ opts += ' --rg-sample %s' % options.rgsm
+
if options.settings == 'preSet':
cmd = cmd % ( opts, index_path, reads )
else:
diff -r 29957b479e5d1e376a2b47dfdf7bd76dcd980fc6 -r 715063d652abc9dc3197617012763284143e7ab2 tools/ngs_rna/tophat2_wrapper.xml
--- a/tools/ngs_rna/tophat2_wrapper.xml
+++ b/tools/ngs_rna/tophat2_wrapper.xml
@@ -113,6 +113,14 @@
#end if
#end if
+
+ ## Read group information.
+ #if $readGroup.specReadGroup == "yes"
+ --rgid="$readGroup.rgid"
+ --rglb="$readGroup.rglb"
+ --rgpl="$readGroup.rgpl"
+ --rgsm="$readGroup.rgsm"
+ #end if
</command><inputs><conditional name="singlePaired">
@@ -291,6 +299,19 @@
</conditional></when><!-- full --></conditional><!-- params -->
+ <conditional name="readGroup">
+ <param name="specReadGroup" type="select" label="Specify read group?">
+ <option value="yes">Yes</option>
+ <option value="no" selected="True">No</option>
+ </param>
+ <when value="yes">
+ <param name="rgid" type="text" size="25" label="Read group identifier (ID). Each @RG line must have a unique ID. The value of ID is used in the RG tags of alignment records. Must be unique among all read groups in header section." help="Required if RG specified. Read group IDs may be modified when merging SAM files in order to handle collisions." />
+ <param name="rglb" type="text" size="25" label="Library name (LB)" help="Required if RG specified" />
+ <param name="rgpl" type="text" size="25" label="Platform/technology used to produce the reads (PL)" help="Required if RG specified. Valid values : CAPILLARY, LS454, ILLUMINA, SOLID, HELICOS, IONTORRENT and PACBIO" />
+ <param name="rgsm" type="text" size="25" label="Sample (SM)" help="Required if RG specified. Use pool name where a pool is being sequenced" />
+ </when>
+ <when value="no" />
+ </conditional><!-- readGroup --></inputs><outputs>
@@ -387,6 +408,7 @@
<param name="genomeSource" value="indexed" /><param name="index" value="tophat_test" /><param name="settingsType" value="preSet" />
+ <param name="specReadGroup" value="No" /><output name="junctions" file="tophat_out1j.bed" /><output name="accepted_hits" file="tophat_out1h.bam" compare="sim_size" /></test>
@@ -404,6 +426,7 @@
<param name="ownFile" ftype="fasta" value="tophat_in1.fasta" /><param name="mate_inner_distance" value="20" /><param name="settingsType" value="preSet" />
+ <param name="specReadGroup" value="No" /><output name="junctions" file="tophat2_out2j.bed" /><output name="accepted_hits" file="tophat_out2h.bam" compare="sim_size" /></test>
@@ -452,6 +475,7 @@
<param name="multireads" value="4" /><param name="multipairs" value="5" /><param name="ignore_chromosomes" value="chrM"/>
+ <param name="specReadGroup" value="No" /><output name="insertions" file="tophat_out3i.bed" /><output name="deletions" file="tophat_out3d.bed" /><output name="junctions" file="tophat2_out3j.bed" />
@@ -500,6 +524,7 @@
<param name="multireads" value="4" /><param name="multipairs" value="5" /><param name="ignore_chromosomes" value="chrM"/>
+ <param name="specReadGroup" value="No" /><output name="junctions" file="tophat2_out4j.bed" /><output name="accepted_hits" file="tophat_out4h.bam" compare="sim_size" /></test>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
18 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/e6030730bb85/
changeset: e6030730bb85
user: inithello
date: 2012-12-18 18:41:13
summary: Functional tests to verify batch reset of repository metadata on tool shed and galaxy side. Made functional test scripts possible to run independently. Cleaned up common methods in tool_shed/base/twilltestcase.py.
affected #: 16 files
diff -r 8e1eec8c56cc5f62f5541c754f31607675347285 -r e6030730bb85b532534f7229c79751efadcd1eb7 test/tool_shed/base/test_db_util.py
--- a/test/tool_shed/base/test_db_util.py
+++ b/test/tool_shed/base/test_db_util.py
@@ -14,6 +14,10 @@
def flush( obj ):
sa_session.add( obj )
sa_session.flush()
+def get_all_repositories():
+ return sa_session.query( model.Repository ).all()
+def get_all_installed_repositories():
+ return ga_session.query( galaxy.model.ToolShedRepository ).all()
def get_category_by_name( name ):
return sa_session.query( model.Category ) \
.filter( model.Category.table.c.name == name ) \
diff -r 8e1eec8c56cc5f62f5541c754f31607675347285 -r e6030730bb85b532534f7229c79751efadcd1eb7 test/tool_shed/base/twilltestcase.py
--- a/test/tool_shed/base/twilltestcase.py
+++ b/test/tool_shed/base/twilltestcase.py
@@ -139,21 +139,13 @@
errmsg = "%i occurrences of '%s' found (min. %i, max. %i).\npage content written to '%s' " % \
( pattern_count, pattern, min_count, max_count, fname )
raise AssertionError( errmsg )
- def create_category( self, category_name, category_description ):
+ def create_category( self, **kwd ):
+ category = test_db_util.get_category_by_name( kwd[ 'name' ] )
+ if category is not None:
+ return category
self.visit_url( '/admin/manage_categories?operation=create' )
- tc.fv( "1", "name", category_name )
- tc.fv( "1", "description", category_description )
- tc.submit( "create_category_button" )
- def create_repository( self, repository_name, repository_description, repository_long_description=None, categories=[], strings_displayed=[], strings_not_displayed=[] ):
- self.visit_url( '/repository/create_repository' )
- tc.fv( "1", "name", repository_name )
- tc.fv( "1", "description", repository_description )
- if repository_long_description is not None:
- tc.fv( "1", "long_description", repository_long_description )
- for category in categories:
- tc.fv( "1", "category_id", "+%s" % category )
- tc.submit( "create_repository_button" )
- self.check_for_strings( strings_displayed, strings_not_displayed )
+ self.submit_form( form_no=1, button="create_category_button", **kwd )
+ return test_db_util.get_category_by_name( kwd[ 'name' ] )
def create_user_in_galaxy( self, cntrller='user', email='test(a)bx.psu.edu', password='testuser', username='admin-user', redirect='' ):
self.visit_galaxy_url( "/user/create?cntrller=%s&use_panels=False" % cntrller )
tc.fv( '1', 'email', email )
@@ -325,6 +317,14 @@
return os.path.abspath( os.path.join( filepath, filename ) )
else:
return os.path.abspath( os.path.join( self.file_dir, filename ) )
+ def get_or_create_repository( self, owner=None, strings_displayed=[], strings_not_displayed=[], **kwd ):
+ repository = test_db_util.get_repository_by_name_and_owner( kwd[ 'name' ], owner )
+ if repository is None:
+ self.visit_url( '/repository/create_repository' )
+ self.submit_form( 1, 'create_repository_button', **kwd )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
+ repository = test_db_util.get_repository_by_name_and_owner( kwd[ 'name' ], owner )
+ return repository
def get_repo_path( self, repository ):
# An entry in the hgweb.config file looks something like: repos/test/mira_assembler = database/community_files/000/repo_123
lhs = "repos/%s/%s" % ( repository.user.username, repository.name )
@@ -387,7 +387,12 @@
tc.fv( "3", "allow_push", '+%s' % username )
tc.submit( 'user_access_button' )
self.check_for_strings( strings_displayed, strings_not_displayed )
- def install_repository( self, name, owner, install_tool_dependencies=False, changeset_revision=None, strings_displayed=[], strings_not_displayed=[] ):
+ def install_repository( self, name, owner, category_name, install_tool_dependencies=False, changeset_revision=None, strings_displayed=[], strings_not_displayed=[] ):
+ if test_db_util.get_installed_repository_by_name_owner( name, owner ) is not None:
+ return
+ self.browse_tool_shed( url=self.url )
+ self.browse_category( test_db_util.get_category_by_name( category_name ) )
+ self.preview_repository_in_tool_shed( name, common.test_user_1_name, strings_displayed=[] )
repository = test_db_util.get_repository_by_name_and_owner( name, owner )
repository_id = self.security.encode_id( repository.id )
if changeset_revision is None:
@@ -446,6 +451,14 @@
url = '/admin_toolshed/reset_repository_metadata?id=%s' % self.security.encode_id( repository.id )
self.visit_galaxy_url( url )
self.check_for_strings( [ 'Metadata has been reset' ] )
+ def reset_metadata_on_selected_repositories( self, repository_ids ):
+ self.visit_url( '/admin/reset_metadata_on_selected_repositories_in_tool_shed' )
+ kwd = dict( repository_ids=repository_ids )
+ self.submit_form( form_no=1, button="reset_metadata_on_selected_repositories_button", **kwd )
+ def reset_metadata_on_selected_installed_repositories( self, repository_ids ):
+ self.visit_galaxy_url( '/admin_toolshed/reset_metadata_on_selected_installed_repositories' )
+ kwd = dict( repository_ids=repository_ids )
+ self.submit_form( form_no=1, button="reset_metadata_on_selected_repositories_button", **kwd )
def reset_repository_metadata( self, repository ):
url = '/repository/reset_all_metadata?id=%s' % self.security.encode_id( repository.id )
self.visit_url( url )
@@ -496,25 +509,10 @@
self.check_for_strings( strings_displayed, strings_not_displayed )
def verify_installed_repository_metadata_unchanged( self, name, owner ):
installed_repository = test_db_util.get_installed_repository_by_name_owner( name, owner )
- differs = False
metadata = installed_repository.metadata
self.reset_installed_repository_metadata( installed_repository )
new_metadata = installed_repository.metadata
- # This test assumes that the different metadata components will always appear in the same order. If this is ever not
- # the case, this test must be updated.
- for metadata_key in [ 'datatypes', 'tools', 'tool_dependencies', 'repository_dependencies', 'workflows' ]:
- if ( metadata_key in metadata and metadata_key not in new_metadata ) or \
- ( metadata_key not in metadata and metadata_key in new_metadata ):
- differs = True
- break
- elif metadata_key not in metadata and metadata_key not in new_metadata:
- continue
- else:
- if metadata[ metadata_key ] != new_metadata[ metadata_key ]:
- differs = True
- break
- if differs:
- raise AssertionError( 'Metadata for installed repository %s differs after metadata reset.' % name )
+ assert metadata == new_metadata, 'Metadata for installed repository %s differs after metadata reset.' % name
def verify_installed_repository_on_browse_page( self, installed_repository, strings_displayed=[], strings_not_displayed=[] ):
url = '/admin_toolshed/browse_repositories'
self.visit_galaxy_url( url )
@@ -544,10 +542,14 @@
self.visit_galaxy_url( url )
self.check_for_strings( strings, strings_not_displayed )
def verify_unchanged_repository_metadata( self, repository ):
- self.check_repository_changelog( repository )
- html = self.last_page()
+ old_metadata = dict()
+ new_metadata = dict()
+ for metadata in self.get_repository_metadata( repository ):
+ old_metadata[ metadata.changeset_revision ] = metadata.metadata
self.reset_repository_metadata( repository )
- self.check_repository_changelog( repository, strings_displayed=[ html ] )
+ for metadata in self.get_repository_metadata( repository ):
+ new_metadata[ metadata.changeset_revision ] = metadata.metadata
+ assert old_metadata == new_metadata, 'Metadata changed after reset on repository %s.' % repository.name
def visit_galaxy_url( self, url ):
url = '%s%s' % ( self.galaxy_url, url )
self.visit_url( url )
diff -r 8e1eec8c56cc5f62f5541c754f31607675347285 -r e6030730bb85b532534f7229c79751efadcd1eb7 test/tool_shed/functional/test_0000_basic_repository_features.py
--- a/test/tool_shed/functional/test_0000_basic_repository_features.py
+++ b/test/tool_shed/functional/test_0000_basic_repository_features.py
@@ -11,7 +11,7 @@
"""Create necessary user accounts and login as an admin user."""
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
test_user_1 = test_db_util.get_user( common.test_user_1_email )
- assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % common.test_user_1_email
test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
self.logout()
self.login( email=common.admin_email, username=common.admin_username )
@@ -20,22 +20,21 @@
admin_user_private_role = test_db_util.get_private_role( admin_user )
def test_0005_create_categories( self ):
"""Create categories for this test suite"""
- self.create_category( 'Test 0000 Basic Repository Features 1', 'Test 0000 Basic Repository Features 1' )
- self.create_category( 'Test 0000 Basic Repository Features 2', 'Test 0000 Basic Repository Features 2' )
+ self.create_category( name='Test 0000 Basic Repository Features 1', description='Test 0000 Basic Repository Features 1' )
+ self.create_category( name='Test 0000 Basic Repository Features 2', description='Test 0000 Basic Repository Features 2' )
def test_0010_create_repository( self ):
"""Create the filtering repository"""
self.logout()
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
- test_user_1 = test_db_util.get_user( common.test_user_1_email )
- assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
- test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
+ category = test_db_util.get_category_by_name( 'Test 0000 Basic Repository Features 1' )
strings_displayed = [ 'Repository %s' % "'%s'" % repository_name,
'Repository %s has been created' % "'%s'" % repository_name ]
- self.create_repository( repository_name,
- repository_description,
- repository_long_description=repository_long_description,
- categories=[ 'Test 0000 Basic Repository Features 1' ],
- strings_displayed=strings_displayed )
+ self.get_or_create_repository( name=repository_name,
+ description=repository_description,
+ long_description=repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=strings_displayed )
def test_0015_edit_repository( self ):
"""Edit the repository name, description, and long description"""
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
diff -r 8e1eec8c56cc5f62f5541c754f31607675347285 -r e6030730bb85b532534f7229c79751efadcd1eb7 test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py
--- a/test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py
+++ b/test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py
@@ -21,17 +21,18 @@
admin_user_private_role = test_db_util.get_private_role( admin_user )
def test_0005_create_category( self ):
"""Create a category for this test suite"""
- self.create_category( 'Test 0010 Repository With Tool Dependencies', 'Tests for a repository with tool dependencies.' )
+ self.create_category( name='Test 0010 Repository With Tool Dependencies', description='Tests for a repository with tool dependencies.' )
def test_0010_create_freebayes_repository_and_upload_tool_xml( self ):
'''Create freebayes repository and upload freebayes.xml without tool_data_table_conf.xml.sample. This should result in an error message and invalid tool.'''
self.logout()
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
- self.create_repository( repository_name,
- repository_description,
- repository_long_description=repository_long_description,
- categories=[ 'Test 0010 Repository With Tool Dependencies' ],
- strings_displayed=[] )
- repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ category = test_db_util.get_category_by_name( 'Test 0010 Repository With Tool Dependencies' )
+ repository = self.get_or_create_repository( name=repository_name,
+ description=repository_description,
+ long_description=repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
self.upload_file( repository,
'freebayes/freebayes.xml',
valid_tools_only=False,
diff -r 8e1eec8c56cc5f62f5541c754f31607675347285 -r e6030730bb85b532534f7229c79751efadcd1eb7 test/tool_shed/functional/test_0020_basic_repository_dependencies.py
--- a/test/tool_shed/functional/test_0020_basic_repository_dependencies.py
+++ b/test/tool_shed/functional/test_0020_basic_repository_dependencies.py
@@ -25,17 +25,18 @@
admin_user_private_role = test_db_util.get_private_role( admin_user )
def test_0005_create_category( self ):
"""Create a category for this test suite"""
- self.create_category( 'Test 0020 Basic Repository Dependencies', 'Testing basic repository dependency features.' )
+ self.create_category( name='Test 0020 Basic Repository Dependencies', description='Testing basic repository dependency features.' )
def test_0010_create_emboss_datatypes_repository_and_upload_tarball( self ):
'''Create and populate the emboss_datatypes repository.'''
self.logout()
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
- self.create_repository( datatypes_repository_name,
- datatypes_repository_description,
- repository_long_description=datatypes_repository_long_description,
- categories=[ 'Test 0020 Basic Repository Dependencies' ],
- strings_displayed=[] )
- repository = test_db_util.get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
+ category = test_db_util.get_category_by_name( 'Test 0020 Basic Repository Dependencies' )
+ repository = self.get_or_create_repository( name=datatypes_repository_name,
+ description=datatypes_repository_description,
+ long_description=datatypes_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
self.upload_file( repository, 'emboss/datatypes/datatypes_conf.xml', commit_message='Uploaded datatypes_conf.xml.' )
def test_0015_verify_datatypes_in_datatypes_repository( self ):
'''Verify that the emboss_datatypes repository contains datatype entries.'''
@@ -43,12 +44,13 @@
self.display_manage_repository_page( repository, strings_displayed=[ 'Datatypes', 'equicktandem', 'hennig86', 'vectorstrip' ] )
def test_0020_create_emboss_5_repository_and_upload_files( self ):
'''Create and populate the emboss_5_0020 repository.'''
- self.create_repository( emboss_repository_name,
- emboss_repository_description,
- repository_long_description=emboss_repository_long_description,
- categories=[ 'Test 0020 Basic Repository Dependencies' ],
- strings_displayed=[] )
- repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ category = test_db_util.get_category_by_name( 'Test 0020 Basic Repository Dependencies' )
+ repository = self.get_or_create_repository( name=emboss_repository_name,
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
self.upload_file( repository, 'emboss/emboss.tar', commit_message='Uploaded emboss_5.tar' )
def test_0025_generate_and_upload_repository_dependencies_xml( self ):
'''Generate and upload the repository_dependencies.xml file'''
diff -r 8e1eec8c56cc5f62f5541c754f31607675347285 -r e6030730bb85b532534f7229c79751efadcd1eb7 test/tool_shed/functional/test_0030_repository_dependency_revisions.py
--- a/test/tool_shed/functional/test_0030_repository_dependency_revisions.py
+++ b/test/tool_shed/functional/test_0030_repository_dependency_revisions.py
@@ -27,48 +27,36 @@
admin_user_private_role = test_db_util.get_private_role( admin_user )
def test_0005_create_category( self ):
"""Create a category for this test suite"""
- self.create_category( 'Test 0030 Repository Dependency Revisions', 'Testing repository dependencies by revision.' )
+ self.create_category( name='Test 0030 Repository Dependency Revisions', description='Testing repository dependencies by revision.' )
def test_0010_create_repositories( self ):
'''Create the emboss_5_0030, emboss_6_0030, emboss_datatypes_0030, and emboss_0030 repositories and populate the emboss_datatypes repository.'''
self.logout()
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
- emboss_5_repository = test_db_util.get_repository_by_name_and_owner( emboss_5_repository_name, common.test_user_1_name )
- if emboss_5_repository is None:
- self.create_repository( emboss_5_repository_name,
- emboss_repository_description,
- repository_long_description=emboss_repository_long_description,
- categories=[ 'Test 0030 Repository Dependency Revisions' ],
- strings_displayed=[] )
- emboss_5_repository = test_db_util.get_repository_by_name_and_owner( emboss_5_repository_name, common.test_user_1_name )
- self.upload_file( emboss_5_repository, 'emboss/emboss.tar', commit_message='Uploaded tool tarball.' )
- emboss_6_repository = test_db_util.get_repository_by_name_and_owner( emboss_6_repository_name, common.test_user_1_name )
- if emboss_6_repository is None:
- self.create_repository( emboss_6_repository_name,
- emboss_repository_description,
- repository_long_description=emboss_repository_long_description,
- categories=[ 'Test 0030 Repository Dependency Revisions' ],
- strings_displayed=[] )
- emboss_6_repository = test_db_util.get_repository_by_name_and_owner( emboss_6_repository_name, common.test_user_1_name )
- self.upload_file( emboss_6_repository, 'emboss/emboss.tar', commit_message='Uploaded tool tarball..' )
- datatypes_repository = test_db_util.get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
- if datatypes_repository is None:
- self.create_repository( datatypes_repository_name,
- datatypes_repository_description,
- repository_long_description=datatypes_repository_long_description,
- categories=[ 'Test 0030 Repository Dependency Revisions' ],
- strings_displayed=[] )
- datatypes_repository = test_db_util.get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
- if self.repository_is_new( datatypes_repository ):
- self.upload_file( datatypes_repository, 'emboss/datatypes/datatypes_conf.xml', commit_message='Uploaded datatypes_conf.xml.' )
- emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
- if emboss_repository is None:
- self.create_repository( emboss_repository_name,
- emboss_repository_description,
- repository_long_description=emboss_repository_long_description,
- categories=[ 'Test 0030 Repository Dependency Revisions' ],
- strings_displayed=[] )
- emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
- self.upload_file( emboss_repository, 'emboss/emboss.tar', commit_message='Uploaded tool tarball.' )
+ category = test_db_util.get_category_by_name( 'Test 0030 Repository Dependency Revisions' )
+ emboss_5_repository = self.get_or_create_repository( name=emboss_5_repository_name,
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ) )
+ emboss_6_repository = self.get_or_create_repository( name=emboss_6_repository_name,
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ) )
+ datatypes_repository = self.get_or_create_repository( name=datatypes_repository_name,
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ) )
+ emboss_repository = self.get_or_create_repository( name=emboss_repository_name,
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ) )
+ self.upload_file( emboss_5_repository, 'emboss/emboss.tar', commit_message='Uploaded tool tarball.' )
+ self.upload_file( emboss_6_repository, 'emboss/emboss.tar', commit_message='Uploaded tool tarball.' )
+ self.upload_file( datatypes_repository, 'emboss/datatypes/datatypes_conf.xml', commit_message='Uploaded datatypes_conf.xml.' )
+ self.upload_file( emboss_repository, 'emboss/emboss.tar', commit_message='Uploaded tool tarball.' )
def test_0015_generate_repository_dependencies_for_emboss_5( self ):
'''Generate a repository_dependencies.xml file specifying emboss_datatypes and upload it to the emboss_5 repository.'''
datatypes_repository = test_db_util.get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
diff -r 8e1eec8c56cc5f62f5541c754f31607675347285 -r e6030730bb85b532534f7229c79751efadcd1eb7 test/tool_shed/functional/test_0040_repository_circular_dependencies.py
--- a/test/tool_shed/functional/test_0040_repository_circular_dependencies.py
+++ b/test/tool_shed/functional/test_0040_repository_circular_dependencies.py
@@ -25,17 +25,17 @@
admin_user_private_role = test_db_util.get_private_role( admin_user )
def test_0005_create_category( self ):
"""Create a category for this test suite"""
- self.create_category( 'test_0040_repository_circular_dependencies', 'Testing handling of circular repository dependencies.' )
+ self.create_category( name='test_0040_repository_circular_dependencies', description='Testing handling of circular repository dependencies.' )
def test_0010_create_freebayes_repository_name( self ):
'''Create and populate freebayes_0040.'''
self.logout()
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
- self.create_repository( freebayes_repository_name,
- freebayes_repository_name_description,
- repository_long_description=freebayes_repository_name_long_description,
- categories=[ 'test_0040_repository_circular_dependencies' ],
- strings_displayed=[] )
- repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
+ repository = self.get_or_create_repository( name=freebayes_repository_name,
+ description=freebayes_repository_name_description,
+ long_description=freebayes_repository_name_long_description,
+ owner=common.test_user_1_name,
+ categories=[ 'test_0040_repository_circular_dependencies' ],
+ strings_displayed=[] )
self.upload_file( repository,
'freebayes/freebayes.tar',
strings_displayed=[],
@@ -44,12 +44,12 @@
'''Create and populate filtering_0040.'''
self.logout()
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
- self.create_repository( filtering_repository_name,
- filtering_repository_description,
- repository_long_description=filtering_repository_long_description,
- categories=[ 'test_0040_repository_circular_dependencies' ],
- strings_displayed=[] )
- repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
+ repository = self.get_or_create_repository( name=filtering_repository_name,
+ description=filtering_repository_description,
+ long_description=filtering_repository_long_description,
+ owner=common.test_user_1_name,
+ categories=[ 'test_0040_repository_circular_dependencies' ],
+ strings_displayed=[] )
self.upload_file( repository,
'filtering/filtering_1.1.0.tar',
strings_displayed=[],
diff -r 8e1eec8c56cc5f62f5541c754f31607675347285 -r e6030730bb85b532534f7229c79751efadcd1eb7 test/tool_shed/functional/test_0050_circular_dependencies_4_levels.py
--- /dev/null
+++ b/test/tool_shed/functional/test_0050_circular_dependencies_4_levels.py
@@ -0,0 +1,158 @@
+from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
+import tool_shed.base.test_db_util as test_db_util
+
+emboss_datatypes_repository_name = 'emboss_datatypes_0050'
+emboss_datatypes_repository_description = "Datatypes for emboss"
+emboss_datatypes_repository_long_description = "Long description of Emboss' datatypes"
+
+emboss_repository_name = 'emboss_0050'
+emboss_repository_description = "Galaxy's emboss tool"
+emboss_repository_long_description = "Long description of Galaxy's emboss tool"
+
+filtering_repository_name = 'filtering_0050'
+filtering_repository_description = "Galaxy's filtering tool"
+filtering_repository_long_description = "Long description of Galaxy's filtering tool"
+
+freebayes_repository_name = 'freebayes_0050'
+freebayes_repository_description = "Galaxy's freebayes tool"
+freebayes_repository_long_description = "Long description of Galaxy's freebayes tool"
+
+default_category = 'test_0050_repository_n_level_circular_dependencies'
+default_category_description = 'Testing handling of circular repository dependencies to n levels.'
+
+class TestRepositoryCircularDependenciesToNLevels( ShedTwillTestCase ):
+ '''Verify that the code correctly handles circular dependencies down to n levels.'''
+ def test_0000_initiate_users( self ):
+ """Create necessary user accounts."""
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
+ def test_0005_create_category( self ):
+ """Create a category for this test suite"""
+ self.create_category( name=default_category, description=default_category_description )
+ def test_0010_create_emboss_datatypes_repository( self ):
+ '''Create and populate emboss_datatypes_0050.'''
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = self.get_or_create_repository( name=emboss_datatypes_repository_name,
+ description=emboss_datatypes_repository_description,
+ long_description=emboss_datatypes_repository_long_description,
+ owner=common.test_user_1_name,
+ categories=[ default_category ],
+ strings_displayed=[] )
+ self.upload_file( repository,
+ 'emboss/datatypes/datatypes_conf.xml',
+ strings_displayed=[],
+ commit_message='Uploaded datatypes_conf.xml.' )
+ def test_0015_create_emboss_repository( self ):
+ '''Create and populate emboss_0050.'''
+ repository = self.get_or_create_repository( name=emboss_repository_name,
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ categories=[ default_category ],
+ strings_displayed=[] )
+ self.upload_file( repository,
+ 'emboss/emboss.tar',
+ strings_displayed=[],
+ commit_message='Uploaded tool tarball.' )
+ datatypes_repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
+ repository_dependencies_path = self.generate_temp_path( 'test_0050', additional_paths=[ 'emboss' ] )
+ self.generate_repository_dependency_xml( [ datatypes_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
+ dependency_description='Emboss depends on the emboss_datatypes repository.' )
+ self.upload_file( repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded dependency on emboss_datatypes.' )
+ def test_0020_create_filtering_repository( self ):
+ '''Create and populate filtering_0050.'''
+ filtering_repository = self.get_or_create_repository( name=filtering_repository_name,
+ description=filtering_repository_description,
+ long_description=filtering_repository_long_description,
+ owner=common.test_user_1_name,
+ categories=[ default_category ],
+ strings_displayed=[] )
+ self.upload_file( filtering_repository,
+ 'filtering/filtering_1.1.0.tar',
+ strings_displayed=[],
+ commit_message='Uploaded filtering.tar.' )
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ repository_dependencies_path = self.generate_temp_path( 'test_0050', additional_paths=[ 'filtering' ] )
+ self.generate_repository_dependency_xml( [ emboss_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
+ dependency_description='Filtering depends on the emboss repository.' )
+ self.upload_file( filtering_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded dependency on emboss.' )
+ def test_0025_create_freebayes_repository( self ):
+ '''Create and populate freebayes_0050.'''
+ repository = self.get_or_create_repository( name=freebayes_repository_name,
+ description=freebayes_repository_description,
+ long_description=freebayes_repository_long_description,
+ owner=common.test_user_1_name,
+ categories=[ default_category ],
+ strings_displayed=[] )
+ self.upload_file( repository,
+ 'freebayes/freebayes.tar',
+ strings_displayed=[],
+ commit_message='Uploaded freebayes.tar.' )
+ emboss_datatypes_repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ filtering_repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
+ repository_dependencies_path = self.generate_temp_path( 'test_0050', additional_paths=[ 'freebayes' ] )
+ self.generate_repository_dependency_xml( [ filtering_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
+ dependency_description='Emboss depends on the filtering repository.' )
+ self.upload_file( emboss_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded dependency on filtering.' )
+ previous_tip = self.get_repository_tip( repository )
+ self.generate_repository_dependency_xml( [ emboss_datatypes_repository, emboss_repository, filtering_repository, repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
+ dependency_description='Freebayes depends on the filtering repository.' )
+ self.upload_file( repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded dependency on filtering.' )
+ self.display_manage_repository_page( repository, strings_not_displayed=[ previous_tip ] )
+ def test_0030_verify_repository_dependencies( self ):
+ '''Verify that the generated dependency circle does not cause an infinite loop.
+
+ Expected structure:
+
+ id: 2 key: http://localhost:8634__ESEP__freebayes_0050__ESEP__user1__ESEP__2e73d8e1b59d
+ ['http://localhost:8634', 'emboss_datatypes_0050', 'user1', '596029c334b1']
+ ['http://localhost:8634', 'emboss_0050', 'user1', '9f1503046640']
+ id: 3 key: http://localhost:8634__ESEP__filtering_0050__ESEP__user1__ESEP__eefdd8bc0db9
+ ['http://localhost:8634', 'emboss_0050', 'user1', '9f1503046640']
+ id: 4 key: http://localhost:8634__ESEP__emboss_0050__ESEP__user1__ESEP__9f1503046640
+ ['http://localhost:8634', 'emboss_datatypes_0050', 'user1', '596029c334b1']
+ '''
+ emboss_datatypes_repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ filtering_repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
+ freebayes_repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
+ for repository in [ emboss_datatypes_repository, emboss_repository, filtering_repository ]:
+ self.check_repository_dependency( freebayes_repository, repository, self.get_repository_tip( repository ) )
+ for changeset_revision in self.get_repository_metadata_revisions( emboss_repository ):
+ self.check_repository_dependency( freebayes_repository, emboss_repository, changeset_revision )
+ self.display_manage_repository_page( freebayes_repository,
+ strings_displayed=[ 'Freebayes depends on the filtering repository.' ] )
+ def test_0035_verify_repository_metadata( self ):
+ '''Verify that resetting the metadata does not change it.'''
+ emboss_datatypes_repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ filtering_repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
+ freebayes_repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
+ for repository in [ emboss_datatypes_repository, emboss_repository, freebayes_repository, filtering_repository ]:
+ self.verify_unchanged_repository_metadata( repository )
diff -r 8e1eec8c56cc5f62f5541c754f31607675347285 -r e6030730bb85b532534f7229c79751efadcd1eb7 test/tool_shed/functional/test_0050_circular_n_levels.py
--- a/test/tool_shed/functional/test_0050_circular_n_levels.py
+++ /dev/null
@@ -1,157 +0,0 @@
-from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
-import tool_shed.base.test_db_util as test_db_util
-
-emboss_datatypes_repository_name = 'emboss_datatypes_0050'
-emboss_datatypes_repository_description = "Datatypes for emboss"
-emboss_datatypes_repository_long_description = "Long description of Emboss' datatypes"
-
-emboss_repository_name = 'emboss_0050'
-emboss_repository_description = "Galaxy's emboss tool"
-emboss_repository_long_description = "Long description of Galaxy's emboss tool"
-
-freebayes_repository_name = 'freebayes_0050'
-freebayes_repository_description = "Galaxy's freebayes tool"
-freebayes_repository_long_description = "Long description of Galaxy's freebayes tool"
-
-filtering_repository_name = 'filtering_0050'
-filtering_repository_description = "Galaxy's filtering tool"
-filtering_repository_long_description = "Long description of Galaxy's filtering tool"
-
-default_category = 'test_0050_repository_n_level_circular_dependencies'
-default_category_description = 'Testing handling of circular repository dependencies to n levels.'
-
-class TestRepositoryCircularDependenciesToNLevels( ShedTwillTestCase ):
- '''Verify that the code correctly handles circular dependencies down to n levels.'''
- def test_0000_initiate_users( self ):
- """Create necessary user accounts."""
- self.logout()
- self.login( email=common.test_user_1_email, username=common.test_user_1_name )
- test_user_1 = test_db_util.get_user( common.test_user_1_email )
- assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
- test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
- self.logout()
- self.login( email=common.admin_email, username=common.admin_username )
- admin_user = test_db_util.get_user( common.admin_email )
- assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
- admin_user_private_role = test_db_util.get_private_role( admin_user )
- def test_0005_create_category( self ):
- """Create a category for this test suite"""
- self.create_category( default_category, default_category_description )
- def test_0010_create_emboss_datatypes_repository( self ):
- '''Create and populate emboss_datatypes_0050.'''
- self.logout()
- self.login( email=common.test_user_1_email, username=common.test_user_1_name )
- self.create_repository( emboss_datatypes_repository_name,
- emboss_datatypes_repository_description,
- repository_long_description=emboss_datatypes_repository_long_description,
- categories=[ default_category ],
- strings_displayed=[] )
- repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
- self.upload_file( repository,
- 'emboss/datatypes/datatypes_conf.xml',
- strings_displayed=[],
- commit_message='Uploaded datatypes_conf.xml.' )
- def test_0015_create_emboss_repository( self ):
- '''Create and populate emboss_0050.'''
- self.create_repository( emboss_repository_name,
- emboss_repository_description,
- repository_long_description=emboss_repository_long_description,
- categories=[ default_category ],
- strings_displayed=[] )
- repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
- self.upload_file( repository,
- 'emboss/emboss.tar',
- strings_displayed=[],
- commit_message='Uploaded tool tarball.' )
- datatypes_repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
- repository_dependencies_path = self.generate_temp_path( 'test_0050', additional_paths=[ 'emboss' ] )
- self.generate_repository_dependency_xml( [ datatypes_repository ],
- self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
- dependency_description='Emboss depends on the emboss_datatypes repository.' )
- self.upload_file( repository,
- 'repository_dependencies.xml',
- filepath=repository_dependencies_path,
- commit_message='Uploaded dependency on emboss_datatypes.' )
- def test_0020_create_filtering_repository( self ):
- '''Create and populate filtering_0050.'''
- self.create_repository( filtering_repository_name,
- filtering_repository_description,
- repository_long_description=filtering_repository_long_description,
- categories=[ default_category ],
- strings_displayed=[] )
- filtering_repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
- self.upload_file( filtering_repository,
- 'filtering/filtering_1.1.0.tar',
- strings_displayed=[],
- commit_message='Uploaded filtering.tar.' )
- emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
- repository_dependencies_path = self.generate_temp_path( 'test_0050', additional_paths=[ 'filtering' ] )
- self.generate_repository_dependency_xml( [ emboss_repository ],
- self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
- dependency_description='Filtering depends on the emboss repository.' )
- self.upload_file( filtering_repository,
- 'repository_dependencies.xml',
- filepath=repository_dependencies_path,
- commit_message='Uploaded dependency on emboss.' )
- def test_0025_create_freebayes_repository( self ):
- '''Create and populate freebayes_0050.'''
- self.create_repository( freebayes_repository_name,
- freebayes_repository_description,
- repository_long_description=freebayes_repository_long_description,
- categories=[ default_category ],
- strings_displayed=[] )
- repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
- self.upload_file( repository,
- 'freebayes/freebayes.tar',
- strings_displayed=[],
- commit_message='Uploaded freebayes.tar.' )
- emboss_datatypes_repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
- emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
- filtering_repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
- repository_dependencies_path = self.generate_temp_path( 'test_0050', additional_paths=[ 'freebayes' ] )
- self.generate_repository_dependency_xml( [ filtering_repository ],
- self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
- dependency_description='Emboss depends on the filtering repository.' )
- self.upload_file( emboss_repository,
- 'repository_dependencies.xml',
- filepath=repository_dependencies_path,
- commit_message='Uploaded dependency on filtering.' )
- previous_tip = self.get_repository_tip( repository )
- self.generate_repository_dependency_xml( [ emboss_datatypes_repository, emboss_repository, filtering_repository, repository ],
- self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
- dependency_description='Freebayes depends on the filtering repository.' )
- self.upload_file( repository,
- 'repository_dependencies.xml',
- filepath=repository_dependencies_path,
- commit_message='Uploaded dependency on filtering.' )
- self.display_manage_repository_page( repository, strings_not_displayed=[ previous_tip ] )
- def test_0030_verify_repository_dependencies( self ):
- '''Verify that the generated dependency circle does not cause an infinite loop.
-
- Expected structure:
-
- id: 2 key: http://localhost:8634__ESEP__freebayes_0050__ESEP__user1__ESEP__2e73d8e1b59d
- ['http://localhost:8634', 'emboss_datatypes_0050', 'user1', '596029c334b1']
- ['http://localhost:8634', 'emboss_0050', 'user1', '9f1503046640']
- id: 3 key: http://localhost:8634__ESEP__filtering_0050__ESEP__user1__ESEP__eefdd8bc0db9
- ['http://localhost:8634', 'emboss_0050', 'user1', '9f1503046640']
- id: 4 key: http://localhost:8634__ESEP__emboss_0050__ESEP__user1__ESEP__9f1503046640
- ['http://localhost:8634', 'emboss_datatypes_0050', 'user1', '596029c334b1']
- '''
- emboss_datatypes_repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
- emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
- filtering_repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
- freebayes_repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
- for repository in [ emboss_datatypes_repository, emboss_repository, filtering_repository ]:
- self.check_repository_dependency( freebayes_repository, repository, self.get_repository_tip( repository ) )
- for changeset_revision in self.get_repository_metadata_revisions( emboss_repository ):
- self.check_repository_dependency( freebayes_repository, emboss_repository, changeset_revision )
- self.display_manage_repository_page( freebayes_repository, strings_displayed=[ 'Freebayes depends on the filtering repository.' ] )
- def test_0035_verify_repository_metadata( self ):
- '''Verify that resetting the metadata does not change it.'''
- emboss_datatypes_repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
- emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
- filtering_repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
- freebayes_repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
- for repository in [ emboss_datatypes_repository, emboss_repository, freebayes_repository, filtering_repository ]:
- self.verify_unchanged_repository_metadata( repository )
diff -r 8e1eec8c56cc5f62f5541c754f31607675347285 -r e6030730bb85b532534f7229c79751efadcd1eb7 test/tool_shed/functional/test_0060_workflows.py
--- a/test/tool_shed/functional/test_0060_workflows.py
+++ b/test/tool_shed/functional/test_0060_workflows.py
@@ -23,16 +23,17 @@
admin_user_private_role = test_db_util.get_private_role( admin_user )
def test_0005_create_categories( self ):
"""Create categories for this test suite"""
- self.create_category( 'Test 0060 Workflow Features', 'Test 0060 - Workflow Features' )
+ self.create_category( name='Test 0060 Workflow Features', description='Test 0060 - Workflow Features' )
def test_0010_create_repository( self ):
"""Create and populate the filtering repository"""
self.logout()
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
- self.create_repository( repository_name,
- repository_description,
- repository_long_description=repository_long_description,
- categories=[ 'Test 0060 Workflow Features' ],
- strings_displayed=[] )
+ self.get_or_create_repository( name=repository_name,
+ description=repository_description,
+ long_description=repository_long_description,
+ owner=common.test_user_1_name,
+ categories=[ 'Test 0060 Workflow Features' ],
+ strings_displayed=[] )
def test_0015_upload_workflow( self ):
'''Upload a workflow with a missing tool, and verify that the tool specified is marked as missing.'''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
diff -r 8e1eec8c56cc5f62f5541c754f31607675347285 -r e6030730bb85b532534f7229c79751efadcd1eb7 test/tool_shed/functional/test_0300_reset_all_metadata.py
--- /dev/null
+++ b/test/tool_shed/functional/test_0300_reset_all_metadata.py
@@ -0,0 +1,255 @@
+from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
+import tool_shed.base.test_db_util as test_db_util
+
+datatypes_repository_name = 'emboss_datatypes_0020'
+datatypes_repository_description = "Galaxy applicable data formats used by Emboss tools."
+datatypes_repository_long_description = "Galaxy applicable data formats used by Emboss tools. This repository contains no tools."
+emboss_repository_description = 'Galaxy wrappers for Emboss version 5.0.0 tools'
+emboss_repository_long_description = 'Galaxy wrappers for Emboss version 5.0.0 tools'
+workflow_filename = 'Workflow_for_0060_filter_workflow_repository.ga'
+workflow_name = 'Workflow for 0060_filter_workflow_repository'
+
+class TestResetAllRepositoryMetadata( ShedTwillTestCase ):
+ '''Verify that the "Reset selected metadata" feature works.'''
+ def test_0000_initiate_users( self ):
+ """Create necessary user accounts."""
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
+ def test_0005_create_repositories_and_categories( self ):
+ category_0000 = self.create_category( name='Test 0000 Basic Repository Features 1', description='Test 0000 Basic Repository Features 1' )
+ category_0001 = self.create_category( name='Test 0000 Basic Repository Features 2', description='Test 0000 Basic Repository Features 2' )
+ category_0010 = self.create_category( name='Test 0010 Repository With Tool Dependencies', description='Tests for a repository with tool dependencies.' )
+ category_0020 = self.create_category( name='Test 0020 Basic Repository Dependencies', description='Testing basic repository dependency features.' )
+ category_0030 = self.create_category( name='Test 0030 Repository Dependency Revisions', description='Testing repository dependencies by revision.' )
+ category_0040 = self.create_category( name='test_0040_repository_circular_dependencies', description='Testing handling of circular repository dependencies.' )
+ category_0050 = self.create_category( name='test_0050_repository_n_level_circular_dependencies', description='Testing handling of circular repository dependencies to n levels.' )
+ category_0060 = self.create_category( name='Test 0060 Workflow Features', description='Test 0060 - Workflow Features' )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = self.get_or_create_repository( name='filtering_0000',
+ description="Galaxy's filtering tool",
+ long_description="Long description of Galaxy's filtering tool",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0000.id ) )
+ if self.repository_is_new( repository ):
+ self.upload_file( repository, 'filtering/filtering_1.1.0.tar', commit_message="Uploaded filtering 1.1.0" )
+ self.upload_file( repository, 'filtering/filtering_2.2.0.tar', commit_message="Uploaded filtering 2.2.0" )
+ repository = self.get_or_create_repository( name='freebayes_0010',
+ description="Galaxy's freebayes tool",
+ long_description="Long description of Galaxy's freebayes tool",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0000.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( repository ):
+ self.upload_file( repository, 'freebayes/freebayes.xml', valid_tools_only=False, commit_message='Uploaded.', strings_displayed=[] )
+ self.upload_file( repository, 'freebayes/tool_data_table_conf.xml.sample', valid_tools_only=False, commit_message='Uploaded.', strings_displayed=[] )
+ self.upload_file( repository, 'freebayes/sam_fa_indices.loc.sample', valid_tools_only=False, commit_message='Uploaded.', strings_displayed=[] )
+ self.upload_file( repository, 'freebayes/tool_dependencies.xml', commit_message='Uploaded.' )
+ repository = self.get_or_create_repository( name='emboss_datatypes_0020',
+ description="Galaxy applicable data formats used by Emboss tools.",
+ long_description="Galaxy applicable data formats used by Emboss tools. This repository contains no tools.",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0010.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( repository ):
+ self.upload_file( repository, 'emboss/datatypes/datatypes_conf.xml', commit_message='Uploaded datatypes_conf.xml.' )
+ repository = self.get_or_create_repository( name='emboss_0020',
+ description='Galaxy wrappers for Emboss version 5.0.0 tools',
+ long_description='Galaxy wrappers for Emboss version 5.0.0 tools',
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0020.id ),
+ strings_displayed=[] )
+ self.upload_file( repository, 'emboss/emboss.tar', commit_message='Uploaded emboss_5.tar' )
+ datatypes_repository = self.get_or_create_repository( name='emboss_datatypes_0030',
+ description=datatypes_repository_description,
+ long_description=datatypes_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0030.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( datatypes_repository ):
+ self.upload_file( datatypes_repository, 'emboss/datatypes/datatypes_conf.xml', commit_message='Uploaded datatypes_conf.xml.' )
+ emboss_5_repository = self.get_or_create_repository( name='emboss_5_0030',
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0030.id ),
+ strings_displayed=[] )
+ self.upload_file( emboss_5_repository, 'emboss/emboss.tar', commit_message='Uploaded emboss.tar' )
+ repository_dependencies_path = self.generate_temp_path( 'test_0330', additional_paths=[ 'emboss', '5' ] )
+ self.generate_repository_dependency_xml( [ datatypes_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ) )
+ self.upload_file( emboss_5_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded repository_dependencies.xml' )
+ emboss_6_repository = self.get_or_create_repository( name='emboss_6_0030',
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0030.id ),
+ strings_displayed=[] )
+ self.upload_file( emboss_6_repository, 'emboss/emboss.tar', commit_message='Uploaded emboss.tar' )
+ repository_dependencies_path = self.generate_temp_path( 'test_0330', additional_paths=[ 'emboss', '6' ] )
+ self.generate_repository_dependency_xml( [ datatypes_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ) )
+ self.upload_file( emboss_6_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded repository_dependencies.xml' )
+ emboss_repository = self.get_or_create_repository( name='emboss_0030',
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0030.id ),
+ strings_displayed=[] )
+ self.upload_file( emboss_repository, 'emboss/emboss.tar', commit_message='Uploaded emboss.tar' )
+ repository_dependencies_path = self.generate_temp_path( 'test_0330', additional_paths=[ 'emboss', '5' ] )
+ self.generate_repository_dependency_xml( [ emboss_5_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ) )
+ self.upload_file( emboss_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded repository_dependencies.xml' )
+ self.generate_repository_dependency_xml( [ emboss_6_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ) )
+ self.upload_file( emboss_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded repository_dependencies.xml' )
+ repository = self.get_or_create_repository( name='freebayes_0040',
+ description="Galaxy's freebayes tool",
+ long_description="Long description of Galaxy's freebayes tool",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0040.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( repository ):
+ self.upload_file( repository, 'freebayes/freebayes.tar', commit_message='Uploaded freebayes.tar.' )
+ repository = self.get_or_create_repository( name='filtering_0040',
+ description="Galaxy's filtering tool",
+ long_description="Long description of Galaxy's filtering tool",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0040.id ),
+ strings_displayed=[] )
+ self.upload_file( repository, 'filtering/filtering_1.1.0.tar', commit_message='Uploaded filtering.tar.' )
+ freebayes_repository = test_db_util.get_repository_by_name_and_owner( 'freebayes_0040', common.test_user_1_name )
+ filtering_repository = test_db_util.get_repository_by_name_and_owner( 'filtering_0040', common.test_user_1_name )
+ repository_dependencies_path = self.generate_temp_path( 'test_0340', additional_paths=[ 'dependencies' ] )
+ self.generate_repository_dependency_xml( [ freebayes_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
+ dependency_description='Filtering 1.1.0 depends on the freebayes repository.' )
+ self.upload_file( filtering_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded dependency on freebayes' )
+ self.generate_repository_dependency_xml( [ filtering_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
+ dependency_description='Freebayes depends on the filtering repository.' )
+ self.upload_file( freebayes_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded dependency on filtering' )
+ datatypes_repository = self.get_or_create_repository( name='emboss_datatypes_0050',
+ description="Datatypes for emboss",
+ long_description="Long description of Emboss' datatypes",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0050.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( datatypes_repository ):
+ emboss_repository = self.get_or_create_repository( name='emboss_0050',
+ description="Galaxy's emboss tool",
+ long_description="Long description of Galaxy's emboss tool",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0050.id ),
+ strings_displayed=[] )
+ filtering_repository = self.get_or_create_repository( name='filtering_0050',
+ description="Galaxy's filtering tool",
+ long_description="Long description of Galaxy's filtering tool",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0050.id ),
+ strings_displayed=[] )
+ freebayes_repository = self.get_or_create_repository( name='freebayes_0050',
+ description="Galaxy's freebayes tool",
+ long_description="Long description of Galaxy's freebayes tool",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0050.id ),
+ strings_displayed=[] )
+ self.upload_file( datatypes_repository, 'emboss/datatypes/datatypes_conf.xml', commit_message='Uploaded datatypes_conf.xml.' )
+ self.upload_file( emboss_repository, 'emboss/emboss.tar', commit_message='Uploaded tool tarball.' )
+ self.upload_file( freebayes_repository, 'freebayes/freebayes.tar', commit_message='Uploaded freebayes.tar.' )
+ self.upload_file( filtering_repository, 'filtering/filtering_1.1.0.tar', commit_message='Uploaded filtering.tar.' )
+ repository_dependencies_path = self.generate_temp_path( 'test_0350', additional_paths=[ 'emboss' ] )
+ self.generate_repository_dependency_xml( [ datatypes_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
+ dependency_description='Emboss depends on the emboss_datatypes repository.' )
+ self.upload_file( emboss_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded dependency on emboss_datatypes.' )
+ repository_dependencies_path = self.generate_temp_path( 'test_0350', additional_paths=[ 'filtering' ] )
+ self.generate_repository_dependency_xml( [ emboss_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
+ dependency_description='Filtering depends on the emboss repository.' )
+ self.upload_file( filtering_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded dependency on emboss.' )
+ repository_dependencies_path = self.generate_temp_path( 'test_0350', additional_paths=[ 'freebayes' ] )
+ self.generate_repository_dependency_xml( [ filtering_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
+ dependency_description='Emboss depends on the filtering repository.' )
+ self.upload_file( emboss_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded dependency on filtering.' )
+ self.generate_repository_dependency_xml( [ datatypes_repository, emboss_repository, filtering_repository, freebayes_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
+ dependency_description='Freebayes depends on the filtering repository.' )
+ self.upload_file( freebayes_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded dependency on filtering.' )
+ workflow_repository = self.get_or_create_repository( name='filtering_0060',
+ description="Galaxy's filtering tool",
+ long_description="Long description of Galaxy's filtering tool",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0060.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( workflow_repository ):
+ workflow = file( self.get_filename( 'filtering_workflow/Workflow_for_0060_filter_workflow_repository.ga' ), 'r' ).read()
+ workflow = workflow.replace( '__TEST_TOOL_SHED_URL__', self.url.replace( 'http://', '' ) )
+ workflow_filepath = self.generate_temp_path( 'test_0360', additional_paths=[ 'filtering_workflow' ] )
+ os.makedirs( workflow_filepath )
+ file( os.path.join( workflow_filepath, workflow_filename ), 'w+' ).write( workflow )
+ self.upload_file( workflow_repository,
+ workflow_filename,
+ filepath=workflow_filepath,
+ commit_message='Uploaded filtering workflow.' )
+ self.upload_file( workflow_repository,
+ 'filtering/filtering_2.2.0.tar',
+ commit_message='Uploaded filtering tool.' )
+ def test_0010_reset_metadata_on_all_repositories( self ):
+ '''Reset metadata on all repositories, then verify that it has not changed.'''
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ old_metadata = dict()
+ new_metadata = dict()
+ repositories = test_db_util.get_all_repositories()
+ for repository in repositories:
+ old_metadata[ self.security.encode_id( repository.id ) ] = dict()
+ for metadata in self.get_repository_metadata( repository ):
+ old_metadata[ self.security.encode_id( repository.id ) ][ metadata.changeset_revision ] = metadata.metadata
+ self.reset_metadata_on_selected_repositories( old_metadata.keys() )
+ for repository in repositories:
+ new_metadata[ self.security.encode_id( repository.id ) ] = dict()
+ for metadata in self.get_repository_metadata( repository ):
+ new_metadata[ self.security.encode_id( repository.id ) ][ metadata.changeset_revision ] = metadata.metadata
+ if old_metadata[ self.security.encode_id( repository.id ) ] != new_metadata[ self.security.encode_id( repository.id ) ]:
+ raise AssertionError( 'Metadata changed after reset for repository %s.' % repository.name )
diff -r 8e1eec8c56cc5f62f5541c754f31607675347285 -r e6030730bb85b532534f7229c79751efadcd1eb7 test/tool_shed/functional/test_1000_install_basic_repository.py
--- a/test/tool_shed/functional/test_1000_install_basic_repository.py
+++ b/test/tool_shed/functional/test_1000_install_basic_repository.py
@@ -5,30 +5,58 @@
'''Test installing a basic repository.'''
def test_0000_initiate_users( self ):
"""Create necessary user accounts."""
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
self.galaxy_logout()
self.galaxy_login( email=common.admin_email, username=common.admin_username )
- admin_user = test_db_util.get_galaxy_user( common.admin_email )
- assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
- admin_user_private_role = test_db_util.get_galaxy_private_role( admin_user )
- def test_0005_browse_tool_sheds( self ):
+ galaxy_admin_user = test_db_util.get_galaxy_user( common.admin_email )
+ assert galaxy_admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
+ galaxy_admin_user_private_role = test_db_util.get_galaxy_private_role( galaxy_admin_user )
+ def test_0005_ensure_repositories_and_categories_exist( self ):
+ '''Create the 0000 category and upload the filtering repository to it, if necessary.'''
+ category = self.create_category( name='Test 0000 Basic Repository Features 1', description='Test 0000 Basic Repository Features 1' )
+ self.create_category( name='Test 0000 Basic Repository Features 2', description='Test 0000 Basic Repository Features 2' )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = self.get_or_create_repository( name='filtering_0000',
+ description="Galaxy's filtering tool",
+ long_description="Long description of Galaxy's filtering tool",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ) )
+ if self.repository_is_new( repository ):
+ self.upload_file( repository, 'filtering/filtering_1.1.0.tar', commit_message="Uploaded filtering 1.1.0" )
+ self.upload_file( repository, 'filtering/filtering_0000.txt', commit_message="Uploaded readme for 1.1.0", remove_repo_files_not_in_tar='No' )
+ self.upload_file( repository, 'filtering/filtering_2.2.0.tar', commit_message="Uploaded filtering 2.2.0", remove_repo_files_not_in_tar='No' )
+ self.upload_file( repository, 'readme.txt', commit_message="Uploaded readme for 2.2.0", remove_repo_files_not_in_tar='No' )
+ def test_0010_browse_tool_sheds( self ):
"""Browse the available tool sheds in this Galaxy instance."""
+ self.galaxy_logout()
+ self.galaxy_login( email=common.admin_email, username=common.admin_username )
self.visit_galaxy_url( '/admin_toolshed/browse_tool_sheds' )
self.check_page_for_string( 'Embedded tool shed for functional tests' )
self.browse_tool_shed( url=self.url, strings_displayed=[ 'Test 0000 Basic Repository Features 1', 'Test 0000 Basic Repository Features 2' ] )
- def test_0010_browse_test_0000_category( self ):
+ def test_0015_browse_test_0000_category( self ):
'''Browse the category created in test 0000. It should contain the filtering_0000 repository also created in that test.'''
category = test_db_util.get_category_by_name( 'Test 0000 Basic Repository Features 1' )
self.browse_category( category, strings_displayed=[ 'filtering_0000' ] )
- def test_0015_preview_filtering_repository( self ):
+ def test_0020_preview_filtering_repository( self ):
'''Load the preview page for the filtering_0000 repository in the tool shed.'''
self.preview_repository_in_tool_shed( 'filtering_0000', common.test_user_1_name, strings_displayed=[ 'filtering_0000', 'Valid tools' ] )
- def test_0020_install_filtering_repository( self ):
- self.install_repository( 'filtering_0000', common.test_user_1_name )
+ def test_0025_install_filtering_repository( self ):
+ self.install_repository( 'filtering_0000', common.test_user_1_name, 'Test 0000 Basic Repository Features 1' )
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'filtering_0000', common.test_user_1_name )
self.verify_installed_repository_on_browse_page( installed_repository )
self.display_installed_repository_manage_page( installed_repository,
strings_displayed=[ 'Installed tool shed repository', 'Tools', 'Filter1' ] )
self.verify_tool_metadata_for_installed_repository( installed_repository )
- def test_0025_verify_installed_repository_metadata( self ):
+ def test_0030_verify_installed_repository_metadata( self ):
'''Verify that resetting the metadata on an installed repository does not change the metadata.'''
self.verify_installed_repository_metadata_unchanged( 'filtering_0000', common.test_user_1_name )
diff -r 8e1eec8c56cc5f62f5541c754f31607675347285 -r e6030730bb85b532534f7229c79751efadcd1eb7 test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
--- a/test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
+++ b/test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
@@ -10,15 +10,62 @@
admin_user = test_db_util.get_galaxy_user( common.admin_email )
assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
admin_user_private_role = test_db_util.get_galaxy_private_role( admin_user )
- def test_0005_browse_tool_shed( self ):
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
+ def test_0005_ensure_repositories_and_categories_exist( self ):
+ '''Create the 0010 category and upload the freebayes repository to it, if necessary.'''
+ category = self.create_category( name='Test 0010 Repository With Tool Dependencies', description='Tests for a repository with tool dependencies.' )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = self.get_or_create_repository( name='freebayes_0010',
+ description="Galaxy's freebayes tool",
+ long_description="Long description of Galaxy's freebayes tool",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ) )
+ if self.repository_is_new( repository ):
+ self.upload_file( repository,
+ 'freebayes/freebayes.xml',
+ valid_tools_only=False,
+ commit_message="Uploaded freebayes.xml." )
+ self.upload_file( repository,
+ 'freebayes/tool_data_table_conf.xml.sample',
+ valid_tools_only=False,
+ commit_message="Uploaded tool_data_table_conf.xml.",
+ remove_repo_files_not_in_tar='No' )
+ self.upload_file( repository,
+ 'freebayes/sam_fa_indices.loc.sample',
+ commit_message="Uploaded sam_fa_indices.loc.sample.",
+ valid_tools_only=False,
+ remove_repo_files_not_in_tar='No' )
+ self.upload_file( repository,
+ 'freebayes/invalid_tool_dependencies/tool_dependencies.xml',
+ valid_tools_only=False,
+ commit_message="Uploaded invalid_tool_dependencies/tool_dependencies.xml.",
+ remove_repo_files_not_in_tar='No' )
+ self.upload_file( repository,
+ 'freebayes/tool_dependencies.xml',
+ valid_tools_only=False,
+ commit_message="Uploaded tool_dependencies.xml",
+ remove_repo_files_not_in_tar='No' )
+ def test_0010_browse_tool_shed( self ):
"""Browse the available tool sheds in this Galaxy instance and preview the freebayes tool."""
+ self.galaxy_logout()
+ self.galaxy_login( email=common.admin_email, username=common.admin_username )
self.browse_tool_shed( url=self.url, strings_displayed=[ 'Test 0010 Repository With Tool Dependencies' ] )
category = test_db_util.get_category_by_name( 'Test 0010 Repository With Tool Dependencies' )
self.browse_category( category, strings_displayed=[ 'freebayes_0010' ] )
self.preview_repository_in_tool_shed( 'freebayes_0010', common.test_user_1_name, strings_displayed=[ 'freebayes_0010', 'Valid tools' ] )
def test_0015_install_freebayes_repository( self ):
'''Install the freebayes repository without installing tool dependencies.'''
- self.install_repository( 'freebayes_0010', common.test_user_1_name, install_tool_dependencies=False )
+ self.install_repository( 'freebayes_0010', common.test_user_1_name, 'Test 0010 Repository With Tool Dependencies', install_tool_dependencies=False )
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'freebayes_0010', common.test_user_1_name )
self.verify_installed_repository_on_browse_page( installed_repository )
self.display_installed_repository_manage_page( installed_repository,
diff -r 8e1eec8c56cc5f62f5541c754f31607675347285 -r e6030730bb85b532534f7229c79751efadcd1eb7 test/tool_shed/functional/test_1020_install_repository_with_repository_dependencies.py
--- a/test/tool_shed/functional/test_1020_install_repository_with_repository_dependencies.py
+++ b/test/tool_shed/functional/test_1020_install_repository_with_repository_dependencies.py
@@ -1,24 +1,71 @@
from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
import tool_shed.base.test_db_util as test_db_util
+datatypes_repository_name = 'emboss_datatypes_0020'
+datatypes_repository_description = "Galaxy applicable data formats used by Emboss tools."
+datatypes_repository_long_description = "Galaxy applicable data formats used by Emboss tools. This repository contains no tools."
+
+emboss_repository_name = 'emboss_0020'
+emboss_repository_description = 'Galaxy wrappers for Emboss version 5.0.0 tools'
+emboss_repository_long_description = 'Galaxy wrappers for Emboss version 5.0.0 tools'
+
class ToolWithRepositoryDependencies( ShedTwillTestCase ):
'''Test installing a repository with repository dependencies.'''
def test_0000_initiate_users( self ):
"""Create necessary user accounts."""
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
self.galaxy_logout()
self.galaxy_login( email=common.admin_email, username=common.admin_username )
- admin_user = test_db_util.get_galaxy_user( common.admin_email )
- assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
- admin_user_private_role = test_db_util.get_galaxy_private_role( admin_user )
- def test_0005_browse_tool_shed( self ):
+ galaxy_admin_user = test_db_util.get_galaxy_user( common.admin_email )
+ assert galaxy_admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
+ galaxy_admin_user_private_role = test_db_util.get_galaxy_private_role( galaxy_admin_user )
+ def test_0005_ensure_repositories_and_categories_exist( self ):
+ '''Create the 0020 category and any missing repositories.'''
+ category = self.create_category( name='Test 0020 Basic Repository Dependencies', description='Test 0020 Basic Repository Dependencies' )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ datatypes_repository = self.get_or_create_repository( name=datatypes_repository_name,
+ description=datatypes_repository_description,
+ long_description=datatypes_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( datatypes_repository ):
+ self.upload_file( datatypes_repository, 'emboss/datatypes/datatypes_conf.xml', commit_message='Uploaded datatypes_conf.xml.' )
+ emboss_repository = self.get_or_create_repository( name=emboss_repository_name,
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ self.upload_file( emboss_repository, 'emboss/emboss.tar', commit_message='Uploaded emboss_5.tar' )
+ repository_dependencies_path = self.generate_temp_path( 'test_1020', additional_paths=[ 'emboss', '5' ] )
+ self.generate_repository_dependency_xml( [ datatypes_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ) )
+ self.upload_file( emboss_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded repository_dependencies.xml' )
+ def test_0010_browse_tool_shed( self ):
"""Browse the available tool sheds in this Galaxy instance and preview the emboss tool."""
+ self.galaxy_logout()
+ self.galaxy_login( email=common.admin_email, username=common.admin_username )
self.browse_tool_shed( url=self.url, strings_displayed=[ 'Test 0020 Basic Repository Dependencies' ] )
category = test_db_util.get_category_by_name( 'Test 0020 Basic Repository Dependencies' )
self.browse_category( category, strings_displayed=[ 'emboss_0020' ] )
self.preview_repository_in_tool_shed( 'emboss_0020', common.test_user_1_name, strings_displayed=[ 'emboss_0020', 'Valid tools' ] )
def test_0015_install_emboss_repository( self ):
'''Install the emboss repository without installing tool dependencies.'''
- self.install_repository( 'emboss_0020', common.test_user_1_name, install_tool_dependencies=False )
+ self.install_repository( 'emboss_0020', common.test_user_1_name, 'Test 0020 Basic Repository Dependencies', install_tool_dependencies=False )
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'emboss_0020', common.test_user_1_name )
self.verify_installed_repository_on_browse_page( installed_repository )
self.display_installed_repository_manage_page( installed_repository,
diff -r 8e1eec8c56cc5f62f5541c754f31607675347285 -r e6030730bb85b532534f7229c79751efadcd1eb7 test/tool_shed/functional/test_1030_install_repository_with_dependency_revisions.py
--- a/test/tool_shed/functional/test_1030_install_repository_with_dependency_revisions.py
+++ b/test/tool_shed/functional/test_1030_install_repository_with_dependency_revisions.py
@@ -1,17 +1,100 @@
from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
import tool_shed.base.test_db_util as test_db_util
+datatypes_repository_name = 'emboss_datatypes_0030'
+datatypes_repository_description = "Galaxy applicable data formats used by Emboss tools."
+datatypes_repository_long_description = "Galaxy applicable data formats used by Emboss tools. This repository contains no tools."
+
+emboss_repository_name = 'emboss_0030'
+emboss_5_repository_name = 'emboss_5_0030'
+emboss_6_repository_name = 'emboss_6_0030'
+emboss_repository_description = 'Galaxy wrappers for Emboss version 5.0.0 tools'
+emboss_repository_long_description = 'Galaxy wrappers for Emboss version 5.0.0 tools'
+
class RepositoryWithDependencyRevisions( ShedTwillTestCase ):
'''Test installing a repository with dependency revisions.'''
def test_0000_initiate_users( self ):
"""Create necessary user accounts."""
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
self.galaxy_logout()
self.galaxy_login( email=common.admin_email, username=common.admin_username )
- admin_user = test_db_util.get_galaxy_user( common.admin_email )
- assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
- admin_user_private_role = test_db_util.get_galaxy_private_role( admin_user )
- def test_0005_browse_tool_shed( self ):
+ galaxy_admin_user = test_db_util.get_galaxy_user( common.admin_email )
+ assert galaxy_admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
+ galaxy_admin_user_private_role = test_db_util.get_galaxy_private_role( galaxy_admin_user )
+ def test_0005_ensure_repositories_and_categories_exist( self ):
+ '''Create the 0030 category and add repositories to it, if necessary.'''
+ category = self.create_category( name='Test 0030 Repository Dependency Revisions', description='Test 0030 Repository Dependency Revisions' )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ datatypes_repository = self.get_or_create_repository( name=datatypes_repository_name,
+ description=datatypes_repository_description,
+ long_description=datatypes_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( datatypes_repository ):
+ self.upload_file( datatypes_repository, 'emboss/datatypes/datatypes_conf.xml', commit_message='Uploaded datatypes_conf.xml.' )
+ emboss_5_repository = self.get_or_create_repository( name=emboss_5_repository_name,
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ self.upload_file( emboss_5_repository, 'emboss/emboss.tar', commit_message='Uploaded emboss.tar' )
+ repository_dependencies_path = self.generate_temp_path( 'test_1030', additional_paths=[ 'emboss', '5' ] )
+ self.generate_repository_dependency_xml( [ datatypes_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ) )
+ self.upload_file( emboss_5_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded repository_dependencies.xml' )
+ emboss_6_repository = self.get_or_create_repository( name=emboss_6_repository_name,
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ self.upload_file( emboss_6_repository, 'emboss/emboss.tar', commit_message='Uploaded emboss.tar' )
+ repository_dependencies_path = self.generate_temp_path( 'test_1030', additional_paths=[ 'emboss', '6' ] )
+ self.generate_repository_dependency_xml( [ datatypes_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ) )
+ self.upload_file( emboss_6_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded repository_dependencies.xml' )
+ emboss_repository = self.get_or_create_repository( name=emboss_repository_name,
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=[] )
+ self.upload_file( emboss_repository, 'emboss/emboss.tar', commit_message='Uploaded emboss.tar' )
+ repository_dependencies_path = self.generate_temp_path( 'test_1030', additional_paths=[ 'emboss', '5' ] )
+ self.generate_repository_dependency_xml( [ emboss_5_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ) )
+ self.upload_file( emboss_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded repository_dependencies.xml' )
+ self.generate_repository_dependency_xml( [ emboss_6_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ) )
+ self.upload_file( emboss_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded repository_dependencies.xml' )
+ def test_0010_browse_tool_shed( self ):
"""Browse the available tool sheds in this Galaxy instance and preview the emboss tool."""
+ self.galaxy_logout()
+ self.galaxy_login( email=common.admin_email, username=common.admin_username )
self.browse_tool_shed( url=self.url, strings_displayed=[ 'Test 0030 Repository Dependency Revisions' ] )
category = test_db_util.get_category_by_name( 'Test 0030 Repository Dependency Revisions' )
self.browse_category( category, strings_displayed=[ 'emboss_0030' ] )
@@ -20,7 +103,11 @@
'''Install the emboss repository without installing tool dependencies.'''
repository = test_db_util.get_repository_by_name_and_owner( 'emboss_0030', common.test_user_1_name )
revisions = self.get_repository_metadata_revisions( repository )
- self.install_repository( 'emboss_0030', common.test_user_1_name, changeset_revision=revisions[1], install_tool_dependencies=False )
+ self.install_repository( 'emboss_0030',
+ common.test_user_1_name,
+ 'Test 0030 Repository Dependency Revisions',
+ changeset_revision=revisions[1],
+ install_tool_dependencies=False )
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'emboss_0030', common.test_user_1_name )
self.verify_installed_repository_on_browse_page( installed_repository )
self.display_installed_repository_manage_page( installed_repository,
diff -r 8e1eec8c56cc5f62f5541c754f31607675347285 -r e6030730bb85b532534f7229c79751efadcd1eb7 test/tool_shed/functional/test_1300_reset_all_metadata.py
--- /dev/null
+++ b/test/tool_shed/functional/test_1300_reset_all_metadata.py
@@ -0,0 +1,269 @@
+from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
+import tool_shed.base.test_db_util as test_db_util
+
+datatypes_repository_name = 'emboss_datatypes_0020'
+datatypes_repository_description = "Galaxy applicable data formats used by Emboss tools."
+datatypes_repository_long_description = "Galaxy applicable data formats used by Emboss tools. This repository contains no tools."
+emboss_repository_description = 'Galaxy wrappers for Emboss version 5.0.0 tools'
+emboss_repository_long_description = 'Galaxy wrappers for Emboss version 5.0.0 tools'
+workflow_filename = 'Workflow_for_0060_filter_workflow_repository.ga'
+workflow_name = 'Workflow for 0060_filter_workflow_repository'
+
+class TestResetInstalledRepositoryMetadata( ShedTwillTestCase ):
+ '''Verify that the "Reset selected metadata" feature works.'''
+ def test_0000_initiate_users( self ):
+ """Create necessary user accounts."""
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
+ def test_0005_create_repositories_and_categories( self ):
+ '''Ensure that the necessary categories and repositories exist for these tests.'''
+ category_0000 = self.create_category( name='Test 0000 Basic Repository Features 1', description='Test 0000 Basic Repository Features 1' )
+ category_0001 = self.create_category( name='Test 0000 Basic Repository Features 2', description='Test 0000 Basic Repository Features 2' )
+ category_0010 = self.create_category( name='Test 0010 Repository With Tool Dependencies', description='Tests for a repository with tool dependencies.' )
+ category_0020 = self.create_category( name='Test 0020 Basic Repository Dependencies', description='Testing basic repository dependency features.' )
+ category_0030 = self.create_category( name='Test 0030 Repository Dependency Revisions', description='Testing repository dependencies by revision.' )
+ category_0040 = self.create_category( name='test_0040_repository_circular_dependencies', description='Testing handling of circular repository dependencies.' )
+ category_0050 = self.create_category( name='test_0050_repository_n_level_circular_dependencies', description='Testing handling of circular repository dependencies to n levels.' )
+ category_0060 = self.create_category( name='Test 0060 Workflow Features', description='Test 0060 - Workflow Features' )
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = self.get_or_create_repository( name='filtering_0000',
+ description="Galaxy's filtering tool",
+ long_description="Long description of Galaxy's filtering tool",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0000.id ) )
+ if self.repository_is_new( repository ):
+ self.upload_file( repository, 'filtering/filtering_1.1.0.tar', commit_message="Uploaded filtering 1.1.0" )
+ self.upload_file( repository, 'filtering/filtering_2.2.0.tar', commit_message="Uploaded filtering 2.2.0" )
+ repository = self.get_or_create_repository( name='freebayes_0010',
+ description="Galaxy's freebayes tool",
+ long_description="Long description of Galaxy's freebayes tool",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0010.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( repository ):
+ self.upload_file( repository, 'freebayes/freebayes.xml', valid_tools_only=False, commit_message='Uploaded.', strings_displayed=[] )
+ self.upload_file( repository, 'freebayes/tool_data_table_conf.xml.sample', valid_tools_only=False, commit_message='Uploaded.', strings_displayed=[] )
+ self.upload_file( repository, 'freebayes/sam_fa_indices.loc.sample', valid_tools_only=False, commit_message='Uploaded.', strings_displayed=[] )
+ self.upload_file( repository, 'freebayes/tool_dependencies.xml', commit_message='Uploaded.' )
+ repository = self.get_or_create_repository( name='emboss_datatypes_0020',
+ description="Galaxy applicable data formats used by Emboss tools.",
+ long_description="Galaxy applicable data formats used by Emboss tools. This repository contains no tools.",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0010.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( repository ):
+ self.upload_file( repository, 'emboss/datatypes/datatypes_conf.xml', commit_message='Uploaded datatypes_conf.xml.' )
+ repository = self.get_or_create_repository( name='emboss_0020',
+ description='Galaxy wrappers for Emboss version 5.0.0 tools',
+ long_description='Galaxy wrappers for Emboss version 5.0.0 tools',
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0020.id ),
+ strings_displayed=[] )
+ self.upload_file( repository, 'emboss/emboss.tar', commit_message='Uploaded emboss_5.tar' )
+ datatypes_repository = self.get_or_create_repository( name='emboss_datatypes_0030',
+ description=datatypes_repository_description,
+ long_description=datatypes_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0030.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( datatypes_repository ):
+ self.upload_file( datatypes_repository, 'emboss/datatypes/datatypes_conf.xml', commit_message='Uploaded datatypes_conf.xml.' )
+ emboss_5_repository = self.get_or_create_repository( name='emboss_5_0030',
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0030.id ),
+ strings_displayed=[] )
+ self.upload_file( emboss_5_repository, 'emboss/emboss.tar', commit_message='Uploaded emboss.tar' )
+ repository_dependencies_path = self.generate_temp_path( 'test_0330', additional_paths=[ 'emboss', '5' ] )
+ self.generate_repository_dependency_xml( [ datatypes_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ) )
+ self.upload_file( emboss_5_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded repository_dependencies.xml' )
+ emboss_6_repository = self.get_or_create_repository( name='emboss_6_0030',
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0030.id ),
+ strings_displayed=[] )
+ self.upload_file( emboss_6_repository, 'emboss/emboss.tar', commit_message='Uploaded emboss.tar' )
+ repository_dependencies_path = self.generate_temp_path( 'test_0330', additional_paths=[ 'emboss', '6' ] )
+ self.generate_repository_dependency_xml( [ datatypes_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ) )
+ self.upload_file( emboss_6_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded repository_dependencies.xml' )
+ emboss_repository = self.get_or_create_repository( name='emboss_0030',
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0030.id ),
+ strings_displayed=[] )
+ self.upload_file( emboss_repository, 'emboss/emboss.tar', commit_message='Uploaded emboss.tar' )
+ repository_dependencies_path = self.generate_temp_path( 'test_0330', additional_paths=[ 'emboss', '5' ] )
+ self.generate_repository_dependency_xml( [ emboss_5_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ) )
+ self.upload_file( emboss_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded repository_dependencies.xml' )
+ self.generate_repository_dependency_xml( [ emboss_6_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ) )
+ self.upload_file( emboss_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded repository_dependencies.xml' )
+ repository = self.get_or_create_repository( name='freebayes_0040',
+ description="Galaxy's freebayes tool",
+ long_description="Long description of Galaxy's freebayes tool",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0040.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( repository ):
+ self.upload_file( repository, 'freebayes/freebayes.tar', commit_message='Uploaded freebayes.tar.' )
+ repository = self.get_or_create_repository( name='filtering_0040',
+ description="Galaxy's filtering tool",
+ long_description="Long description of Galaxy's filtering tool",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0040.id ),
+ strings_displayed=[] )
+ self.upload_file( repository, 'filtering/filtering_1.1.0.tar', commit_message='Uploaded filtering.tar.' )
+ freebayes_repository = test_db_util.get_repository_by_name_and_owner( 'freebayes_0040', common.test_user_1_name )
+ filtering_repository = test_db_util.get_repository_by_name_and_owner( 'filtering_0040', common.test_user_1_name )
+ repository_dependencies_path = self.generate_temp_path( 'test_0340', additional_paths=[ 'dependencies' ] )
+ self.generate_repository_dependency_xml( [ freebayes_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
+ dependency_description='Filtering 1.1.0 depends on the freebayes repository.' )
+ self.upload_file( filtering_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded dependency on freebayes' )
+ self.generate_repository_dependency_xml( [ filtering_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
+ dependency_description='Freebayes depends on the filtering repository.' )
+ self.upload_file( freebayes_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded dependency on filtering' )
+ datatypes_repository = self.get_or_create_repository( name='emboss_datatypes_0050',
+ description="Datatypes for emboss",
+ long_description="Long description of Emboss' datatypes",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0050.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( datatypes_repository ):
+ emboss_repository = self.get_or_create_repository( name='emboss_0050',
+ description="Galaxy's emboss tool",
+ long_description="Long description of Galaxy's emboss tool",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0050.id ),
+ strings_displayed=[] )
+ filtering_repository = self.get_or_create_repository( name='filtering_0050',
+ description="Galaxy's filtering tool",
+ long_description="Long description of Galaxy's filtering tool",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0050.id ),
+ strings_displayed=[] )
+ freebayes_repository = self.get_or_create_repository( name='freebayes_0050',
+ description="Galaxy's freebayes tool",
+ long_description="Long description of Galaxy's freebayes tool",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0050.id ),
+ strings_displayed=[] )
+ self.upload_file( datatypes_repository, 'emboss/datatypes/datatypes_conf.xml', commit_message='Uploaded datatypes_conf.xml.' )
+ self.upload_file( emboss_repository, 'emboss/emboss.tar', commit_message='Uploaded tool tarball.' )
+ self.upload_file( freebayes_repository, 'freebayes/freebayes.tar', commit_message='Uploaded freebayes.tar.' )
+ self.upload_file( filtering_repository, 'filtering/filtering_1.1.0.tar', commit_message='Uploaded filtering.tar.' )
+ repository_dependencies_path = self.generate_temp_path( 'test_0350', additional_paths=[ 'emboss' ] )
+ self.generate_repository_dependency_xml( [ datatypes_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
+ dependency_description='Emboss depends on the emboss_datatypes repository.' )
+ self.upload_file( emboss_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded dependency on emboss_datatypes.' )
+ repository_dependencies_path = self.generate_temp_path( 'test_0350', additional_paths=[ 'filtering' ] )
+ self.generate_repository_dependency_xml( [ emboss_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
+ dependency_description='Filtering depends on the emboss repository.' )
+ self.upload_file( filtering_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded dependency on emboss.' )
+ repository_dependencies_path = self.generate_temp_path( 'test_0350', additional_paths=[ 'freebayes' ] )
+ self.generate_repository_dependency_xml( [ filtering_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
+ dependency_description='Emboss depends on the filtering repository.' )
+ self.upload_file( emboss_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded dependency on filtering.' )
+ self.generate_repository_dependency_xml( [ datatypes_repository, emboss_repository, filtering_repository, freebayes_repository ],
+ self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
+ dependency_description='Freebayes depends on the filtering repository.' )
+ self.upload_file( freebayes_repository,
+ 'repository_dependencies.xml',
+ filepath=repository_dependencies_path,
+ commit_message='Uploaded dependency on filtering.' )
+ workflow_repository = self.get_or_create_repository( name='filtering_0060',
+ description="Galaxy's filtering tool",
+ long_description="Long description of Galaxy's filtering tool",
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category_0060.id ),
+ strings_displayed=[] )
+ if self.repository_is_new( workflow_repository ):
+ workflow = file( self.get_filename( 'filtering_workflow/Workflow_for_0060_filter_workflow_repository.ga' ), 'r' ).read()
+ workflow = workflow.replace( '__TEST_TOOL_SHED_URL__', self.url.replace( 'http://', '' ) )
+ workflow_filepath = self.generate_temp_path( 'test_0360', additional_paths=[ 'filtering_workflow' ] )
+ os.makedirs( workflow_filepath )
+ file( os.path.join( workflow_filepath, workflow_filename ), 'w+' ).write( workflow )
+ self.upload_file( workflow_repository,
+ workflow_filename,
+ filepath=workflow_filepath,
+ commit_message='Uploaded filtering workflow.' )
+ self.upload_file( workflow_repository,
+ 'filtering/filtering_2.2.0.tar',
+ commit_message='Uploaded filtering tool.' )
+ def test_0010_install_all_missing_repositories( self ):
+ '''Call the install_repository method to ensure that all required repositories are installed.'''
+ self.galaxy_logout()
+ self.galaxy_login( email=common.admin_email, username=common.admin_username )
+ category_0000 = 'Test 0000 Basic Repository Features 1'
+ category_0001 = 'Test 0000 Basic Repository Features 2'
+ category_0010 = 'Test 0010 Repository With Tool Dependencies'
+ category_0020 = 'Test 0020 Basic Repository Dependencies'
+ category_0030 = 'Test 0030 Repository Dependency Revisions'
+ category_0040 = 'test_0040_repository_circular_dependencies'
+ category_0050 = 'test_0050_repository_n_level_circular_dependencies'
+ category_0060 = 'Test 0060 Workflow Features'
+ self.install_repository( 'filtering_0000', common.test_user_1_name, category_0000, strings_displayed=[] )
+ self.install_repository( 'freebayes_0010', common.test_user_1_name, category_0010, strings_displayed=[] )
+ self.install_repository( 'emboss_0020', common.test_user_1_name, category_0020, strings_displayed=[] )
+ self.install_repository( 'emboss_5_0030', common.test_user_1_name, category_0030, strings_displayed=[] )
+ self.install_repository( 'filtering_0040', common.test_user_1_name, category_0040, strings_displayed=[] )
+ self.install_repository( 'freebayes_0050', common.test_user_1_name, category_0050, strings_displayed=[] )
+ self.install_repository( 'filtering_0060', common.test_user_1_name, category_0060, strings_displayed=[] )
+ def test_0015_reset_metadata_on_all_repositories( self ):
+ '''Reset metadata on all repositories, then verify that it has not changed.'''
+ repository_metadata = dict()
+ repositories = test_db_util.get_all_installed_repositories()
+ for repository in repositories:
+ repository_metadata[ self.security.encode_id( repository.id ) ] = repository.metadata
+ self.reset_metadata_on_selected_installed_repositories( repository_metadata.keys() )
+ for repository in repositories:
+ test_db_util.ga_refresh( repository )
+ old_metadata = repository_metadata[ self.security.encode_id( repository.id ) ]
+ assert repository.metadata == old_metadata, 'Metadata for installed repository %s changed after reset.' % repository.name
+
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
3 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/22ef970cfdcd/
changeset: 22ef970cfdcd
user: jgoecks
date: 2012-12-18 18:02:56
summary: Use slideUp rather than hide for pretty hiding of HDAs when re=
moved.
affected #: 2 files
diff -r 166303bbdd86eefc263d9947b35c65ec3847ddc9 -r 22ef970cfdcd9c82841634e=
d2dcfff4a4ae14c04 static/scripts/mvc/dataset/hda-edit.js
--- a/static/scripts/mvc/dataset/hda-edit.js
+++ b/static/scripts/mvc/dataset/hda-edit.js
@@ -119,7 +119,7 @@
icon_class : 'delete',
on_click : function() {
// Provide feedback by hiding from view immediately.
- self.$el.hide();
+ self.$el.slideUp();
=20
// Delete the dataset on the server and update HDA + view =
depending on success/failure.
// FIXME: when HDA-delete is implemented in the API, can c=
all set(), then save directly=20
diff -r 166303bbdd86eefc263d9947b35c65ec3847ddc9 -r 22ef970cfdcd9c82841634e=
d2dcfff4a4ae14c04 static/scripts/packed/mvc/dataset/hda-edit.js
--- a/static/scripts/packed/mvc/dataset/hda-edit.js
+++ b/static/scripts/packed/mvc/dataset/hda-edit.js
@@ -1,1 +1,1 @@
-var HDAEditView=3DHDABaseView.extend(LoggableMixin).extend({initialize:fun=
ction(a){HDABaseView.prototype.initialize.call(this,a);this.defaultPrimaryA=
ctionButtonRenderers=3D[this._render_showParamsButton,this._render_rerunBut=
ton]},_render_warnings:function(){return $(jQuery.trim(HDABaseView.template=
s.messages(_.extend(this.model.toJSON(),{urls:this.urls}))))},_render_title=
Buttons:function(){var a=3D$('<div class=3D"historyItemButtons"></div>');a.=
append(this._render_displayButton());a.append(this._render_editButton());a.=
append(this._render_deleteButton());return a},_render_editButton:function()=
{if((this.model.get("state")=3D=3D=3DHistoryDatasetAssociation.STATES.UPLOA=
D)||(this.model.get("state")=3D=3D=3DHistoryDatasetAssociation.STATES.NOT_V=
IEWABLE)||(!this.model.get("accessible"))){this.editButton=3Dnull;return nu=
ll}var c=3Dthis.model.get("purged"),a=3Dthis.model.get("deleted"),b=3D{titl=
e:_l("Edit Attributes"),href:this.urls.edit,target:"galaxy_main",icon_class=
:"edit"};if(a||c){b.enabled=3Dfalse;if(c){b.title=3D_l("Cannot edit attribu=
tes of datasets removed from disk")}else{if(a){b.title=3D_l("Undelete datas=
et to edit attributes")}}}this.editButton=3Dnew IconButtonView({model:new I=
conButton(b)});return this.editButton.render().$el},_render_deleteButton:fu=
nction(){if((this.model.get("state")=3D=3D=3DHistoryDatasetAssociation.STAT=
ES.NOT_VIEWABLE)||(!this.model.get("accessible"))){this.deleteButton=3Dnull=
;return null}var a=3Dthis,b=3Da.urls["delete"],c=3D{title:_l("Delete"),href=
:b,id:"historyItemDeleter-"+this.model.get("id"),icon_class:"delete",on_cli=
ck:function(){a.$el.hide();$.ajax({url:b,type:"POST",error:function(){a.$el=
.show()},success:function(){a.model.set("deleted",true);a.$el.remove()}});r=
eturn false}};if(this.model.get("deleted")||this.model.get("purged")){c=3D{=
title:_l("Dataset is already deleted"),icon_class:"delete",enabled:false}}t=
his.deleteButton=3Dnew IconButtonView({model:new IconButton(c)});return thi=
s.deleteButton.render().$el},_render_hdaSummary:function(){var a=3D_.extend=
(this.model.toJSON(),{urls:this.urls});if(this.model.get("metadata_dbkey")=
=3D=3D=3D"?"&&!this.model.isDeletedOrPurged()){_.extend(a,{dbkey_unknown_an=
d_editable:true})}return HDABaseView.templates.hdaSummary(a)},_render_errBu=
tton:function(){if(this.model.get("state")!=3D=3DHistoryDatasetAssociation.=
STATES.ERROR){this.errButton=3Dnull;return null}this.errButton=3Dnew IconBu=
ttonView({model:new IconButton({title:_l("View or report this error"),href:=
this.urls.report_error,target:"galaxy_main",icon_class:"bug"})});return thi=
s.errButton.render().$el},_render_rerunButton:function(){this.rerunButton=
=3Dnew IconButtonView({model:new IconButton({title:_l("Run this job again")=
,href:this.urls.rerun,target:"galaxy_main",icon_class:"arrow-circle"})});re=
turn this.rerunButton.render().$el},_render_visualizationsButton:function()=
{var c=3Dthis.model.get("dbkey"),a=3Dthis.model.get("visualizations"),f=3Dt=
his.urls.visualization,d=3D{},g=3D{dataset_id:this.model.get("id"),hda_ldda=
:"hda"};if(c){g.dbkey=3Dc}if(!(this.model.hasData())||!(a&&a.length)||!(f))=
{this.visualizationsButton=3Dnull;return null}this.visualizationsButton=3Dn=
ew IconButtonView({model:new IconButton({title:_l("Visualize"),href:f,icon_=
class:"chart_curve"})});var b=3Dthis.visualizationsButton.render().$el;b.ad=
dClass("visualize-icon");function e(h){switch(h){case"trackster":return cre=
ate_trackster_action_fn(f,g,c);case"scatterplot":return create_scatterplot_=
action_fn(f,g);default:return function(){window.parent.location=3Df+"/"+h+"=
?"+$.param(g)}}}if(a.length=3D=3D=3D1){b.attr("title",a[0]);b.click(e(a[0])=
)}else{_.each(a,function(i){var h=3Di.charAt(0).toUpperCase()+i.slice(1);d[=
_l(h)]=3De(i)});make_popupmenu(b,d)}return b},_render_secondaryActionButton=
s:function(b){var c=3D$("<div/>"),a=3Dthis;c.attr("style","float: right;").=
attr("id","secondary-actions-"+this.model.get("id"));_.each(b,function(d){c=
.append(d.call(a))});return c},_render_tagButton:function(){if(!(this.model=
.hasData())||(!this.urls.tags.get)){this.tagButton=3Dnull;return null}this.=
tagButton=3Dnew IconButtonView({model:new IconButton({title:_l("Edit datase=
t tags"),target:"galaxy_main",href:this.urls.tags.get,icon_class:"tags"})})=
;return this.tagButton.render().$el},_render_annotateButton:function(){if(!=
(this.model.hasData())||(!this.urls.annotation.get)){this.annotateButton=3D=
null;return null}this.annotateButton=3Dnew IconButtonView({model:new IconBu=
tton({title:_l("Edit dataset annotation"),target:"galaxy_main",icon_class:"=
annotate"})});return this.annotateButton.render().$el},_render_tagArea:func=
tion(){if(!this.urls.tags.set){return null}return $(HDAEditView.templates.t=
agArea(_.extend(this.model.toJSON(),{urls:this.urls})))},_render_annotation=
Area:function(){if(!this.urls.annotation.get){return null}return $(HDAEditV=
iew.templates.annotationArea(_.extend(this.model.toJSON(),{urls:this.urls})=
))},_render_body_error:function(a){HDABaseView.prototype._render_body_error=
.call(this,a);var b=3Da.find("#primary-actions-"+this.model.get("id"));b.pr=
epend(this._render_errButton())},_render_body_ok:function(a){a.append(this.=
_render_hdaSummary());if(this.model.isDeletedOrPurged()){a.append(this._ren=
der_primaryActionButtons([this._render_downloadButton,this._render_showPara=
msButton,this._render_rerunButton]));return}a.append(this._render_primaryAc=
tionButtons([this._render_downloadButton,this._render_showParamsButton,this=
._render_rerunButton,this._render_visualizationsButton]));a.append(this._re=
nder_secondaryActionButtons([this._render_tagButton,this._render_annotateBu=
tton]));a.append('<div class=3D"clear"/>');a.append(this._render_tagArea())=
;a.append(this._render_annotationArea());a.append(this._render_displayApps(=
));a.append(this._render_peek())},events:{"click .historyItemTitle":"toggle=
BodyVisibility","click a.icon-button.tags":"loadAndDisplayTags","click a.ic=
on-button.annotate":"loadAndDisplayAnnotation"},loadAndDisplayTags:function=
(b){this.log(this+".loadAndDisplayTags",b);var c=3Dthis.$el.find(".tag-area=
"),a=3Dc.find(".tag-elt");if(c.is(":hidden")){if(!jQuery.trim(a.html())){$.=
ajax({url:this.urls.tags.get,error:function(){alert(_l("Tagging failed"))},=
success:function(d){a.html(d);a.find(".tooltip").tooltip();c.slideDown("fas=
t")}})}else{c.slideDown("fast")}}else{c.slideUp("fast")}return false},loadA=
ndDisplayAnnotation:function(b){this.log(this+".loadAndDisplayAnnotation",b=
);var d=3Dthis.$el.find(".annotation-area"),c=3Dd.find(".annotation-elt"),a=
=3Dthis.urls.annotation.set;if(d.is(":hidden")){if(!jQuery.trim(c.html())){=
$.ajax({url:this.urls.annotation.get,error:function(){alert(_l("Annotations=
failed"))},success:function(e){if(e=3D=3D=3D""){e=3D"<em>"+_l("Describe or=
add notes to dataset")+"</em>"}c.html(e);d.find(".tooltip").tooltip();asyn=
c_save_text(c.attr("id"),c.attr("id"),a,"new_annotation",18,true,4);d.slide=
Down("fast")}})}else{d.slideDown("fast")}}else{d.slideUp("fast")}return fal=
se},toString:function(){var a=3D(this.model)?(this.model+""):("(no model)")=
;return"HDAView("+a+")"}});HDAEditView.templates=3D{tagArea:Handlebars.temp=
lates["template-hda-tagArea"],annotationArea:Handlebars.templates["template=
-hda-annotationArea"]};function create_scatterplot_action_fn(a,b){action=3D=
function(){var d=3D$(window.parent.document).find("iframe#galaxy_main"),c=
=3Da+"/scatterplot?"+$.param(b);d.attr("src",c);$("div.popmenu-wrapper").re=
move();return false};return action}function create_trackster_action_fn(a,c,=
b){return function(){var d=3D{};if(b){d["f-dbkey"]=3Db}$.ajax({url:a+"/list=
_tracks?"+$.param(d),dataType:"html",error:function(){alert(_l("Could not a=
dd this dataset to browser")+".")},success:function(e){var f=3Dwindow.paren=
t;f.show_modal(_l("View Data in a New or Saved Visualization"),"",{Cancel:f=
unction(){f.hide_modal()},"View in saved visualization":function(){f.show_m=
odal(_l("Add Data to Saved Visualization"),e,{Cancel:function(){f.hide_moda=
l()},"Add to visualization":function(){$(f.document).find("input[name=3Did]=
:checked").each(function(){var g=3D$(this).val();c.id=3Dg;f.location=3Da+"/=
trackster?"+$.param(c)})}})},"View in new visualization":function(){f.locat=
ion=3Da+"/trackster?"+$.param(c)}})}});return false}};
\ No newline at end of file
+var HDAEditView=3DHDABaseView.extend(LoggableMixin).extend({initialize:fun=
ction(a){HDABaseView.prototype.initialize.call(this,a);this.defaultPrimaryA=
ctionButtonRenderers=3D[this._render_showParamsButton,this._render_rerunBut=
ton]},_render_warnings:function(){return $(jQuery.trim(HDABaseView.template=
s.messages(_.extend(this.model.toJSON(),{urls:this.urls}))))},_render_title=
Buttons:function(){var a=3D$('<div class=3D"historyItemButtons"></div>');a.=
append(this._render_displayButton());a.append(this._render_editButton());a.=
append(this._render_deleteButton());return a},_render_editButton:function()=
{if((this.model.get("state")=3D=3D=3DHistoryDatasetAssociation.STATES.UPLOA=
D)||(this.model.get("state")=3D=3D=3DHistoryDatasetAssociation.STATES.NOT_V=
IEWABLE)||(!this.model.get("accessible"))){this.editButton=3Dnull;return nu=
ll}var c=3Dthis.model.get("purged"),a=3Dthis.model.get("deleted"),b=3D{titl=
e:_l("Edit Attributes"),href:this.urls.edit,target:"galaxy_main",icon_class=
:"edit"};if(a||c){b.enabled=3Dfalse;if(c){b.title=3D_l("Cannot edit attribu=
tes of datasets removed from disk")}else{if(a){b.title=3D_l("Undelete datas=
et to edit attributes")}}}this.editButton=3Dnew IconButtonView({model:new I=
conButton(b)});return this.editButton.render().$el},_render_deleteButton:fu=
nction(){if((this.model.get("state")=3D=3D=3DHistoryDatasetAssociation.STAT=
ES.NOT_VIEWABLE)||(!this.model.get("accessible"))){this.deleteButton=3Dnull=
;return null}var a=3Dthis,b=3Da.urls["delete"],c=3D{title:_l("Delete"),href=
:b,id:"historyItemDeleter-"+this.model.get("id"),icon_class:"delete",on_cli=
ck:function(){a.$el.slideUp();$.ajax({url:b,type:"POST",error:function(){a.=
$el.show()},success:function(){a.model.set("deleted",true);a.$el.remove()}}=
);return false}};if(this.model.get("deleted")||this.model.get("purged")){c=
=3D{title:_l("Dataset is already deleted"),icon_class:"delete",enabled:fals=
e}}this.deleteButton=3Dnew IconButtonView({model:new IconButton(c)});return=
this.deleteButton.render().$el},_render_hdaSummary:function(){var a=3D_.ex=
tend(this.model.toJSON(),{urls:this.urls});if(this.model.get("metadata_dbke=
y")=3D=3D=3D"?"&&!this.model.isDeletedOrPurged()){_.extend(a,{dbkey_unknown=
_and_editable:true})}return HDABaseView.templates.hdaSummary(a)},_render_er=
rButton:function(){if(this.model.get("state")!=3D=3DHistoryDatasetAssociati=
on.STATES.ERROR){this.errButton=3Dnull;return null}this.errButton=3Dnew Ico=
nButtonView({model:new IconButton({title:_l("View or report this error"),hr=
ef:this.urls.report_error,target:"galaxy_main",icon_class:"bug"})});return =
this.errButton.render().$el},_render_rerunButton:function(){this.rerunButto=
n=3Dnew IconButtonView({model:new IconButton({title:_l("Run this job again"=
),href:this.urls.rerun,target:"galaxy_main",icon_class:"arrow-circle"})});r=
eturn this.rerunButton.render().$el},_render_visualizationsButton:function(=
){var c=3Dthis.model.get("dbkey"),a=3Dthis.model.get("visualizations"),f=3D=
this.urls.visualization,d=3D{},g=3D{dataset_id:this.model.get("id"),hda_ldd=
a:"hda"};if(c){g.dbkey=3Dc}if(!(this.model.hasData())||!(a&&a.length)||!(f)=
){this.visualizationsButton=3Dnull;return null}this.visualizationsButton=3D=
new IconButtonView({model:new IconButton({title:_l("Visualize"),href:f,icon=
_class:"chart_curve"})});var b=3Dthis.visualizationsButton.render().$el;b.a=
ddClass("visualize-icon");function e(h){switch(h){case"trackster":return cr=
eate_trackster_action_fn(f,g,c);case"scatterplot":return create_scatterplot=
_action_fn(f,g);default:return function(){window.parent.location=3Df+"/"+h+=
"?"+$.param(g)}}}if(a.length=3D=3D=3D1){b.attr("title",a[0]);b.click(e(a[0]=
))}else{_.each(a,function(i){var h=3Di.charAt(0).toUpperCase()+i.slice(1);d=
[_l(h)]=3De(i)});make_popupmenu(b,d)}return b},_render_secondaryActionButto=
ns:function(b){var c=3D$("<div/>"),a=3Dthis;c.attr("style","float: right;")=
.attr("id","secondary-actions-"+this.model.get("id"));_.each(b,function(d){=
c.append(d.call(a))});return c},_render_tagButton:function(){if(!(this.mode=
l.hasData())||(!this.urls.tags.get)){this.tagButton=3Dnull;return null}this=
.tagButton=3Dnew IconButtonView({model:new IconButton({title:_l("Edit datas=
et tags"),target:"galaxy_main",href:this.urls.tags.get,icon_class:"tags"})}=
);return this.tagButton.render().$el},_render_annotateButton:function(){if(=
!(this.model.hasData())||(!this.urls.annotation.get)){this.annotateButton=
=3Dnull;return null}this.annotateButton=3Dnew IconButtonView({model:new Ico=
nButton({title:_l("Edit dataset annotation"),target:"galaxy_main",icon_clas=
s:"annotate"})});return this.annotateButton.render().$el},_render_tagArea:f=
unction(){if(!this.urls.tags.set){return null}return $(HDAEditView.template=
s.tagArea(_.extend(this.model.toJSON(),{urls:this.urls})))},_render_annotat=
ionArea:function(){if(!this.urls.annotation.get){return null}return $(HDAEd=
itView.templates.annotationArea(_.extend(this.model.toJSON(),{urls:this.url=
s})))},_render_body_error:function(a){HDABaseView.prototype._render_body_er=
ror.call(this,a);var b=3Da.find("#primary-actions-"+this.model.get("id"));b=
.prepend(this._render_errButton())},_render_body_ok:function(a){a.append(th=
is._render_hdaSummary());if(this.model.isDeletedOrPurged()){a.append(this._=
render_primaryActionButtons([this._render_downloadButton,this._render_showP=
aramsButton,this._render_rerunButton]));return}a.append(this._render_primar=
yActionButtons([this._render_downloadButton,this._render_showParamsButton,t=
his._render_rerunButton,this._render_visualizationsButton]));a.append(this.=
_render_secondaryActionButtons([this._render_tagButton,this._render_annotat=
eButton]));a.append('<div class=3D"clear"/>');a.append(this._render_tagArea=
());a.append(this._render_annotationArea());a.append(this._render_displayAp=
ps());a.append(this._render_peek())},events:{"click .historyItemTitle":"tog=
gleBodyVisibility","click a.icon-button.tags":"loadAndDisplayTags","click a=
.icon-button.annotate":"loadAndDisplayAnnotation"},loadAndDisplayTags:funct=
ion(b){this.log(this+".loadAndDisplayTags",b);var c=3Dthis.$el.find(".tag-a=
rea"),a=3Dc.find(".tag-elt");if(c.is(":hidden")){if(!jQuery.trim(a.html()))=
{$.ajax({url:this.urls.tags.get,error:function(){alert(_l("Tagging failed")=
)},success:function(d){a.html(d);a.find(".tooltip").tooltip();c.slideDown("=
fast")}})}else{c.slideDown("fast")}}else{c.slideUp("fast")}return false},lo=
adAndDisplayAnnotation:function(b){this.log(this+".loadAndDisplayAnnotation=
",b);var d=3Dthis.$el.find(".annotation-area"),c=3Dd.find(".annotation-elt"=
),a=3Dthis.urls.annotation.set;if(d.is(":hidden")){if(!jQuery.trim(c.html()=
)){$.ajax({url:this.urls.annotation.get,error:function(){alert(_l("Annotati=
ons failed"))},success:function(e){if(e=3D=3D=3D""){e=3D"<em>"+_l("Describe=
or add notes to dataset")+"</em>"}c.html(e);d.find(".tooltip").tooltip();a=
sync_save_text(c.attr("id"),c.attr("id"),a,"new_annotation",18,true,4);d.sl=
ideDown("fast")}})}else{d.slideDown("fast")}}else{d.slideUp("fast")}return =
false},toString:function(){var a=3D(this.model)?(this.model+""):("(no model=
)");return"HDAView("+a+")"}});HDAEditView.templates=3D{tagArea:Handlebars.t=
emplates["template-hda-tagArea"],annotationArea:Handlebars.templates["templ=
ate-hda-annotationArea"]};function create_scatterplot_action_fn(a,b){action=
=3Dfunction(){var d=3D$(window.parent.document).find("iframe#galaxy_main"),=
c=3Da+"/scatterplot?"+$.param(b);d.attr("src",c);$("div.popmenu-wrapper").r=
emove();return false};return action}function create_trackster_action_fn(a,c=
,b){return function(){var d=3D{};if(b){d["f-dbkey"]=3Db}$.ajax({url:a+"/lis=
t_tracks?"+$.param(d),dataType:"html",error:function(){alert(_l("Could not =
add this dataset to browser")+".")},success:function(e){var f=3Dwindow.pare=
nt;f.show_modal(_l("View Data in a New or Saved Visualization"),"",{Cancel:=
function(){f.hide_modal()},"View in saved visualization":function(){f.show_=
modal(_l("Add Data to Saved Visualization"),e,{Cancel:function(){f.hide_mod=
al()},"Add to visualization":function(){$(f.document).find("input[name=3Did=
]:checked").each(function(){var g=3D$(this).val();c.id=3Dg;f.location=3Da+"=
/trackster?"+$.param(c)})}})},"View in new visualization":function(){f.loca=
tion=3Da+"/trackster?"+$.param(c)}})}});return false}};
\ No newline at end of file
https://bitbucket.org/galaxy/galaxy-central/changeset/2462f311b8b8/
changeset: 2462f311b8b8
user: jgoecks
date: 2012-12-18 18:08:47
summary: Add simple read group options for Bowtie2.
affected #: 2 files
diff -r 22ef970cfdcd9c82841634ed2dcfff4a4ae14c04 -r 2462f311b8b872ab875132f=
fcc1a4347af8a5472 tools/sr_mapping/bowtie2_wrapper.py
--- a/tools/sr_mapping/bowtie2_wrapper.py
+++ b/tools/sr_mapping/bowtie2_wrapper.py
@@ -25,6 +25,12 @@
parser.add_option( '', '--local', dest=3D'local', action=3D"store_true=
" )
parser.add_option( '', '--preset-alignment', dest=3D'preset_alignment')
=20
+ # Read group options.
+ parser.add_option( '', '--rgid', dest=3D'rgid', help=3D'Read group ide=
ntifier' )
+ parser.add_option( '', '--rglb', dest=3D'rglb', help=3D'Library name' )
+ parser.add_option( '', '--rgpl', dest=3D'rgpl', help=3D'Platform/techn=
ology used to produce the reads' )
+ parser.add_option( '', '--rgsm', dest=3D'rgsm', help=3D'Sample' )
+
(options, args) =3D parser.parse_args()
=20
# Creat bowtie index if necessary.
@@ -86,7 +92,16 @@
if options.local:
opts +=3D ' --local'
if options.preset_alignment:
- opts +=3D " --" + options.preset_alignment
+ opts +=3D ' --' + options.preset_alignment
+
+ # Read group options.
+ if options.rgid:
+ if not options.rglb or not options.rgpl or not options.rgsm:
+ stop_err( 'If you want to specify read groups, you must includ=
e the ID, LB, PL, and SM tags.' )
+ opts +=3D ' --rg-id %s' % options.rgid
+ opts +=3D ' --rg %s:%s' % ( 'LB', options.rglb )
+ opts +=3D ' --rg %s:%s' % ( 'PL', options.rgpl )
+ opts +=3D ' --rg %s:%s' % ( 'SM', options.rgsm )
=20
# Final command:
cmd =3D cmd % ( opts, index_path, reads, options.output )
diff -r 22ef970cfdcd9c82841634ed2dcfff4a4ae14c04 -r 2462f311b8b872ab875132f=
fcc1a4347af8a5472 tools/sr_mapping/bowtie2_wrapper.xml
--- a/tools/sr_mapping/bowtie2_wrapper.xml
+++ b/tools/sr_mapping/bowtie2_wrapper.xml
@@ -44,6 +44,14 @@
--local --preset-alignment=3D$params.preset.align_preset_s=
elect-local
#end if
#end if
+
+ ## Read group information.
+ #if $params.readGroup.specReadGroup =3D=3D "yes"
+ --rgid=3D"$params.readGroup.rgid"
+ --rglb=3D"$params.readGroup.rglb"
+ --rgpl=3D"$params.readGroup.rgpl"
+ --rgsm=3D"$params.readGroup.rgsm"
+ #end if
</command><inputs><conditional name=3D"singlePaired">
@@ -80,7 +88,7 @@
</when><!-- history --></conditional><!-- refGenomeSource --><co=
nditional name=3D"params">
- <param name=3D"settingsType" type=3D"select" label=3D"Bowtie s=
ettings to use" help=3D"You can use the default settings or set custom valu=
es for any of Bowtie's parameters.">
+ <param name=3D"settingsType" type=3D"select" label=3D"Paramete=
r Settings" help=3D"You can use the default settings or set custom values f=
or any of Bowtie's parameters."><option value=3D"preSet">Use Defaults</opti=
on><option value=3D"full">Full parameter list</option></param>
@@ -104,9 +112,21 @@
<option value=3D"very-sensitive">Very sensitiv=
e</option></param></when>
- <!-- TODO: --><when value=3D"No" /></conditional>
+ <conditional name=3D"readGroup">
+ <param name=3D"specReadGroup" type=3D"select" label=3D"Spe=
cify the read group for this file?">
+ <option value=3D"yes">Yes</option>
+ <option value=3D"no" selected=3D"True">No</option>
+ </param>
+ <when value=3D"yes">
+ <param name=3D"rgid" type=3D"text" size=3D"25" label=
=3D"Read group identi=EF=AC=81er (ID). Each @RG line must have a unique ID.=
The value of ID is used in the RG tags of alignment records. Must be uniqu=
e among all read groups in header section." help=3D"Required if RG specifie=
d. Read group IDs may be modi=EF=AC=81ed when merging SAM =EF=AC=81les in o=
rder to handle collisions." />
+ <param name=3D"rglb" type=3D"text" size=3D"25" label=
=3D"Library name (LB)" help=3D"Required if RG specified" />
+ <param name=3D"rgpl" type=3D"text" size=3D"25" label=
=3D"Platform/technology used to produce the reads (PL)" help=3D"Required if=
RG specified. Valid values : CAPILLARY, LS454, ILLUMINA, SOLID, HELICOS, I=
ONTORRENT and PACBIO" />
+ <param name=3D"rgsm" type=3D"text" size=3D"25" label=
=3D"Sample (SM)" help=3D"Required if RG specified. Use pool name where a po=
ol is being sequenced" />
+ </when>
+ <when value=3D"no" />
+ </conditional></when><!-- full --></conditional><!-- params --=
></inputs>
https://bitbucket.org/galaxy/galaxy-central/changeset/8e1eec8c56cc/
changeset: 8e1eec8c56cc
user: jgoecks
date: 2012-12-18 18:09:11
summary: Automated merge.
affected #: 1 file
diff -r 2462f311b8b872ab875132ffcc1a4347af8a5472 -r 8e1eec8c56cc5f62f5541c7=
54f31607675347285 lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -1488,7 +1488,7 @@
if shed_tool_conf =3D=3D shed_tool_conf_dict[ 'config_filename' ]:
return index, shed_tool_conf_dict
else:
- file_name =3D suc.strip_path( shed_tool_conf_dict[ 'config_fil=
ename' ] )
+ file_name =3D strip_path( shed_tool_conf_dict[ 'config_filenam=
e' ] )
if shed_tool_conf =3D=3D file_name:
return index, shed_tool_conf_dict
def get_tool_panel_config_tool_path_install_dir( app, repository ):
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
18 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/c961f5647673/
changeset: c961f5647673
user: inithello
date: 2012-12-18 16:50:47
summary: Removed reference to suc. in suc.
affected #: 1 file
diff -r 166303bbdd86eefc263d9947b35c65ec3847ddc9 -r c961f5647673a8cbe5f0f7275b82513e2067afc9 lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -1488,7 +1488,7 @@
if shed_tool_conf == shed_tool_conf_dict[ 'config_filename' ]:
return index, shed_tool_conf_dict
else:
- file_name = suc.strip_path( shed_tool_conf_dict[ 'config_filename' ] )
+ file_name = strip_path( shed_tool_conf_dict[ 'config_filename' ] )
if shed_tool_conf == file_name:
return index, shed_tool_conf_dict
def get_tool_panel_config_tool_path_install_dir( app, repository ):
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jgoecks: Implement asynchronous deletion for HDAs. Pack scripts.
by Bitbucket 18 Dec '12
by Bitbucket 18 Dec '12
18 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/166303bbdd86/
changeset: 166303bbdd86
user: jgoecks
date: 2012-12-18 16:40:43
summary: Implement asynchronous deletion for HDAs. Pack scripts.
affected #: 5 files
diff -r fbfa0c78ea29b1e8d1ad339ab2d7d6ababb17e2a -r 166303bbdd86eefc263d9947b35c65ec3847ddc9 static/scripts/mvc/dataset/hda-edit.js
--- a/static/scripts/mvc/dataset/hda-edit.js
+++ b/static/scripts/mvc/dataset/hda-edit.js
@@ -110,11 +110,38 @@
return null;
}
- var deleteBtnData = {
+ var self = this,
+ delete_url = self.urls[ 'delete' ],
+ deleteBtnData = {
title : _l( 'Delete' ),
- href : this.urls[ 'delete' ],
+ href : delete_url,
id : 'historyItemDeleter-' + this.model.get( 'id' ),
- icon_class : 'delete'
+ icon_class : 'delete',
+ on_click : function() {
+ // Provide feedback by hiding from view immediately.
+ self.$el.hide();
+
+ // Delete the dataset on the server and update HDA + view depending on success/failure.
+ // FIXME: when HDA-delete is implemented in the API, can call set(), then save directly
+ // on the model.
+ $.ajax({
+ url: delete_url,
+ type: 'POST',
+ error: function() {
+ // Something went wrong, so show HDA again.
+ // TODO: an error notification would be good.
+ self.$el.show();
+ },
+ success: function() {
+ // FIXME: setting model attribute causes re-rendering, which is unnecessary.
+ self.model.set( 'deleted', true );
+ self.$el.remove();
+ }
+ });
+
+ // Return false so that anchor action (page reload) does not happen.
+ return false;
+ }
};
if( this.model.get( 'deleted' ) || this.model.get( 'purged' ) ){
deleteBtnData = {
diff -r fbfa0c78ea29b1e8d1ad339ab2d7d6ababb17e2a -r 166303bbdd86eefc263d9947b35c65ec3847ddc9 static/scripts/packed/mvc/dataset/hda-base.js
--- a/static/scripts/packed/mvc/dataset/hda-base.js
+++ b/static/scripts/packed/mvc/dataset/hda-base.js
@@ -1,1 +1,1 @@
-var HDABaseView=BaseView.extend(LoggableMixin).extend({tagName:"div",className:"historyItemContainer",initialize:function(a){if(a.logger){this.logger=this.model.logger=a.logger}this.log(this+".initialize:",a);this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton];if(!a.urlTemplates){throw ("HDAView needs urlTemplates on initialize")}this.urlTemplates=a.urlTemplates;this.expanded=a.expanded||false;this.model.bind("change",this.render,this)},render:function(){var b=this,e=this.model.get("id"),c=this.model.get("state"),a=$("<div/>").attr("id","historyItem-"+e),d=(this.$el.children().size()===0);this.$el.attr("id","historyItemContainer-"+e);this.urls=this._renderUrls(this.urlTemplates,this.model.toJSON());a.addClass("historyItemWrapper").addClass("historyItem").addClass("historyItem-"+c);a.append(this._render_warnings());a.append(this._render_titleBar());this.body=$(this._render_body());a.append(this.body);make_popup_menus(a);a.find(".tooltip").tooltip({placement:"bottom"});this.$el.fadeOut("fast",function(){b.$el.children().remove();b.$el.append(a).fadeIn("fast",function(){b.log(b+" rendered:",b.$el);var f="rendered";if(d){f+=":initial"}else{if(b.model.inReadyState()){f+=":ready"}}b.trigger(f)})});return this},_renderUrls:function(d,a){var b=this,c={};_.each(d,function(e,f){if(_.isObject(e)){c[f]=b._renderUrls(e,a)}else{if(f==="meta_download"){c[f]=b._renderMetaDownloadUrls(e,a)}else{try{c[f]=_.template(e,a)}catch(g){throw (b+"._renderUrls error: "+g+"\n rendering:"+e+"\n with "+JSON.stringify(a))}}}});return c},_renderMetaDownloadUrls:function(b,a){return _.map(a.meta_files,function(c){return{url:_.template(b,{id:a.id,file_type:c.file_type}),file_type:c.file_type}})},_render_warnings:function(){return $(jQuery.trim(HDABaseView.templates.messages(this.model.toJSON())))},_render_titleBar:function(){var a=$('<div class="historyItemTitleBar" style="overflow: hidden"></div>');a.append(this._render_titleButtons());a.append('<span class="state-icon"></span>');a.append(this._render_titleLink());return a},_render_titleButtons:function(){var a=$('<div class="historyItemButtons"></div>');a.append(this._render_displayButton());return a},_render_displayButton:function(){if((!this.model.inReadyState())||(this.model.get("state")===HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){this.displayButton=null;return null}var a={icon_class:"display",target:"galaxy_main"};if(this.model.get("purged")){a.enabled=false;a.title=_l("Cannot display datasets removed from disk")}else{a.title=_l("Display data in browser");a.href=this.urls.display}this.displayButton=new IconButtonView({model:new IconButton(a)});return this.displayButton.render().$el},_render_titleLink:function(){return $(jQuery.trim(HDABaseView.templates.titleLink(_.extend(this.model.toJSON(),{urls:this.urls}))))},_render_hdaSummary:function(){var a=_.extend(this.model.toJSON(),{urls:this.urls});return HDABaseView.templates.hdaSummary(a)},_render_primaryActionButtons:function(c){var a=this,b=$("<div/>").attr("id","primary-actions-"+this.model.get("id"));_.each(c,function(d){b.append(d.call(a))});return b},_render_downloadButton:function(){if(this.model.get("purged")||!this.model.hasData()){return null}var a=HDABaseView.templates.downloadLinks(_.extend(this.model.toJSON(),{urls:this.urls}));return $(a)},_render_showParamsButton:function(){this.showParamsButton=new IconButtonView({model:new IconButton({title:_l("View details"),href:this.urls.show_params,target:"galaxy_main",icon_class:"information"})});return this.showParamsButton.render().$el},_render_displayApps:function(){if(!this.model.hasData()){return null}var a=$("<div/>").addClass("display-apps");if(!_.isEmpty(this.model.get("display_types"))){a.append(HDABaseView.templates.displayApps({displayApps:this.model.get("display_types")}))}if(!_.isEmpty(this.model.get("display_apps"))){a.append(HDABaseView.templates.displayApps({displayApps:this.model.get("display_apps")}))}return a},_render_peek:function(){if(!this.model.get("peek")){return null}return $("<div/>").append($("<pre/>").attr("id","peek"+this.model.get("id")).addClass("peek").append(this.model.get("peek")))},_render_body:function(){var a=$("<div/>").attr("id","info-"+this.model.get("id")).addClass("historyItemBody").attr("style","display: block");switch(this.model.get("state")){case HistoryDatasetAssociation.STATES.NEW:break;case HistoryDatasetAssociation.STATES.NOT_VIEWABLE:this._render_body_not_viewable(a);break;case HistoryDatasetAssociation.STATES.UPLOAD:this._render_body_uploading(a);break;case HistoryDatasetAssociation.STATES.PAUSED:this._render_body_paused(a);break;case HistoryDatasetAssociation.STATES.QUEUED:this._render_body_queued(a);break;case HistoryDatasetAssociation.STATES.RUNNING:this._render_body_running(a);break;case HistoryDatasetAssociation.STATES.ERROR:this._render_body_error(a);break;case HistoryDatasetAssociation.STATES.DISCARDED:this._render_body_discarded(a);break;case HistoryDatasetAssociation.STATES.SETTING_METADATA:this._render_body_setting_metadata(a);break;case HistoryDatasetAssociation.STATES.EMPTY:this._render_body_empty(a);break;case HistoryDatasetAssociation.STATES.FAILED_METADATA:this._render_body_failed_metadata(a);break;case HistoryDatasetAssociation.STATES.OK:this._render_body_ok(a);break;default:a.append($('<div>Error: unknown dataset state "'+this.model.get("state")+'".</div>'))}a.append('<div style="clear: both"></div>');if(this.expanded){a.show()}else{a.hide()}return a},_render_body_not_viewable:function(a){a.append($("<div>"+_l("You do not have permission to view dataset")+".</div>"))},_render_body_uploading:function(a){a.append($("<div>"+_l("Dataset is uploading")+"</div>"))},_render_body_queued:function(a){a.append($("<div>"+_l("Job is waiting to run")+".</div>"));a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_paused:function(a){a.append($("<div>"+_l("Job is paused. Use the history menu to unpause")+".</div>"));a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_running:function(a){a.append("<div>"+_l("Job is currently running")+".</div>");a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_error:function(a){if(!this.model.get("purged")){a.append($("<div>"+this.model.get("misc_blurb")+"</div>"))}a.append((_l("An error occurred running this job")+": <i>"+$.trim(this.model.get("misc_info"))+"</i>"));a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers.concat([this._render_downloadButton])))},_render_body_discarded:function(a){a.append("<div>"+_l("The job creating this dataset was cancelled before completion")+".</div>");a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_setting_metadata:function(a){a.append($("<div>"+_l("Metadata is being auto-detected")+".</div>"))},_render_body_empty:function(a){a.append($("<div>"+_l("No data")+": <i>"+this.model.get("misc_blurb")+"</i></div>"));a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_failed_metadata:function(a){a.append($(HDABaseView.templates.failedMetadata(this.model.toJSON())));this._render_body_ok(a)},_render_body_ok:function(a){a.append(this._render_hdaSummary());if(this.model.isDeletedOrPurged()){a.append(this._render_primaryActionButtons([this._render_downloadButton,this._render_showParamsButton]));return}a.append(this._render_primaryActionButtons([this._render_downloadButton,this._render_showParamsButton]));a.append('<div class="clear"/>');a.append(this._render_displayApps());a.append(this._render_peek())},events:{"click .historyItemTitle":"toggleBodyVisibility"},toggleBodyVisibility:function(c,a){var b=this,d=this.$el.find(".historyItemBody");a=(a===undefined)?(!d.is(":visible")):(a);if(a){d.slideDown("fast",function(){b.trigger("body-expanded",b.model.get("id"))})}else{d.slideUp("fast",function(){b.trigger("body-collapsed",b.model.get("id"))})}},remove:function(){},toString:function(){var a=(this.model)?(this.model+""):("(no model)");return"HDABaseView("+a+")"}});HDABaseView.templates={warningMsg:Handlebars.templates["template-warningmessagesmall"],messages:Handlebars.templates["template-hda-warning-messages"],titleLink:Handlebars.templates["template-hda-titleLink"],hdaSummary:Handlebars.templates["template-hda-hdaSummary"],downloadLinks:Handlebars.templates["template-hda-downloadLinks"],failedMetadata:Handlebars.templates["template-hda-failedMetadata"],displayApps:Handlebars.templates["template-hda-displayApps"]};
\ No newline at end of file
+var HDABaseView=BaseView.extend(LoggableMixin).extend({tagName:"div",className:"historyItemContainer",initialize:function(a){if(a.logger){this.logger=this.model.logger=a.logger}this.log(this+".initialize:",a);this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton];if(!a.urlTemplates){throw ("HDAView needs urlTemplates on initialize")}this.urlTemplates=a.urlTemplates;this.expanded=a.expanded||false;this.model.bind("change",this.render,this)},render:function(){var b=this,e=this.model.get("id"),c=this.model.get("state"),a=$("<div/>").attr("id","historyItem-"+e),d=(this.$el.children().size()===0);this.$el.attr("id","historyItemContainer-"+e);this.urls=this._renderUrls(this.urlTemplates,this.model.toJSON());a.addClass("historyItemWrapper").addClass("historyItem").addClass("historyItem-"+c);a.append(this._render_warnings());a.append(this._render_titleBar());this.body=$(this._render_body());a.append(this.body);make_popup_menus(a);a.find(".tooltip").tooltip({placement:"bottom"});this.$el.fadeOut("fast",function(){b.$el.children().remove();b.$el.append(a).fadeIn("fast",function(){b.log(b+" rendered:",b.$el);var f="rendered";if(d){f+=":initial"}else{if(b.model.inReadyState()){f+=":ready"}}b.trigger(f)})});return this},_renderUrls:function(d,a){var b=this,c={};_.each(d,function(e,f){if(_.isObject(e)){c[f]=b._renderUrls(e,a)}else{if(f==="meta_download"){c[f]=b._renderMetaDownloadUrls(e,a)}else{try{c[f]=_.template(e,a)}catch(g){throw (b+"._renderUrls error: "+g+"\n rendering:"+e+"\n with "+JSON.stringify(a))}}}});return c},_renderMetaDownloadUrls:function(b,a){return _.map(a.meta_files,function(c){return{url:_.template(b,{id:a.id,file_type:c.file_type}),file_type:c.file_type}})},_render_warnings:function(){return $(jQuery.trim(HDABaseView.templates.messages(this.model.toJSON())))},_render_titleBar:function(){var a=$('<div class="historyItemTitleBar" style="overflow: hidden"></div>');a.append(this._render_titleButtons());a.append('<span class="state-icon"></span>');a.append(this._render_titleLink());return a},_render_titleButtons:function(){var a=$('<div class="historyItemButtons"></div>');a.append(this._render_displayButton());return a},_render_displayButton:function(){if((!this.model.inReadyState())||(this.model.get("state")===HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){this.displayButton=null;return null}var a={icon_class:"display",target:"galaxy_main"};if(this.model.get("purged")){a.enabled=false;a.title=_l("Cannot display datasets removed from disk")}else{a.title=_l("Display data in browser");a.href=this.urls.display}this.displayButton=new IconButtonView({model:new IconButton(a)});return this.displayButton.render().$el},_render_titleLink:function(){return $(jQuery.trim(HDABaseView.templates.titleLink(_.extend(this.model.toJSON(),{urls:this.urls}))))},_render_hdaSummary:function(){var a=_.extend(this.model.toJSON(),{urls:this.urls});return HDABaseView.templates.hdaSummary(a)},_render_primaryActionButtons:function(c){var a=this,b=$("<div/>").attr("id","primary-actions-"+this.model.get("id"));_.each(c,function(d){b.append(d.call(a))});return b},_render_downloadButton:function(){if(this.model.get("purged")||!this.model.hasData()){return null}var a=HDABaseView.templates.downloadLinks(_.extend(this.model.toJSON(),{urls:this.urls}));return $(a)},_render_showParamsButton:function(){this.showParamsButton=new IconButtonView({model:new IconButton({title:_l("View details"),href:this.urls.show_params,target:"galaxy_main",icon_class:"information"})});return this.showParamsButton.render().$el},_render_displayApps:function(){if(!this.model.hasData()){return null}var a=$("<div/>").addClass("display-apps");if(!_.isEmpty(this.model.get("display_types"))){a.append(HDABaseView.templates.displayApps({displayApps:this.model.get("display_types")}))}if(!_.isEmpty(this.model.get("display_apps"))){a.append(HDABaseView.templates.displayApps({displayApps:this.model.get("display_apps")}))}return a},_render_peek:function(){if(!this.model.get("peek")){return null}return $("<div/>").append($("<pre/>").attr("id","peek"+this.model.get("id")).addClass("peek").append(this.model.get("peek")))},_render_body:function(){var a=$("<div/>").attr("id","info-"+this.model.get("id")).addClass("historyItemBody").attr("style","display: none");if(this.expanded){this._render_body_html(a);a.show()}return a},_render_body_html:function(a){a.html("");switch(this.model.get("state")){case HistoryDatasetAssociation.STATES.NEW:break;case HistoryDatasetAssociation.STATES.NOT_VIEWABLE:this._render_body_not_viewable(a);break;case HistoryDatasetAssociation.STATES.UPLOAD:this._render_body_uploading(a);break;case HistoryDatasetAssociation.STATES.PAUSED:this._render_body_paused(a);break;case HistoryDatasetAssociation.STATES.QUEUED:this._render_body_queued(a);break;case HistoryDatasetAssociation.STATES.RUNNING:this._render_body_running(a);break;case HistoryDatasetAssociation.STATES.ERROR:this._render_body_error(a);break;case HistoryDatasetAssociation.STATES.DISCARDED:this._render_body_discarded(a);break;case HistoryDatasetAssociation.STATES.SETTING_METADATA:this._render_body_setting_metadata(a);break;case HistoryDatasetAssociation.STATES.EMPTY:this._render_body_empty(a);break;case HistoryDatasetAssociation.STATES.FAILED_METADATA:this._render_body_failed_metadata(a);break;case HistoryDatasetAssociation.STATES.OK:this._render_body_ok(a);break;default:a.append($('<div>Error: unknown dataset state "'+this.model.get("state")+'".</div>'))}a.append('<div style="clear: both"></div>')},_render_body_not_viewable:function(a){a.append($("<div>"+_l("You do not have permission to view dataset")+".</div>"))},_render_body_uploading:function(a){a.append($("<div>"+_l("Dataset is uploading")+"</div>"))},_render_body_queued:function(a){a.append($("<div>"+_l("Job is waiting to run")+".</div>"));a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_paused:function(a){a.append($("<div>"+_l("Job is paused. Use the history menu to unpause")+".</div>"));a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_running:function(a){a.append("<div>"+_l("Job is currently running")+".</div>");a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_error:function(a){if(!this.model.get("purged")){a.append($("<div>"+this.model.get("misc_blurb")+"</div>"))}a.append((_l("An error occurred running this job")+": <i>"+$.trim(this.model.get("misc_info"))+"</i>"));a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers.concat([this._render_downloadButton])))},_render_body_discarded:function(a){a.append("<div>"+_l("The job creating this dataset was cancelled before completion")+".</div>");a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_setting_metadata:function(a){a.append($("<div>"+_l("Metadata is being auto-detected")+".</div>"))},_render_body_empty:function(a){a.append($("<div>"+_l("No data")+": <i>"+this.model.get("misc_blurb")+"</i></div>"));a.append(this._render_primaryActionButtons(this.defaultPrimaryActionButtonRenderers))},_render_body_failed_metadata:function(a){a.append($(HDABaseView.templates.failedMetadata(this.model.toJSON())));this._render_body_ok(a)},_render_body_ok:function(a){a.append(this._render_hdaSummary());if(this.model.isDeletedOrPurged()){a.append(this._render_primaryActionButtons([this._render_downloadButton,this._render_showParamsButton]));return}a.append(this._render_primaryActionButtons([this._render_downloadButton,this._render_showParamsButton]));a.append('<div class="clear"/>');a.append(this._render_displayApps());a.append(this._render_peek())},events:{"click .historyItemTitle":"toggleBodyVisibility"},toggleBodyVisibility:function(c,a){var b=this;this.expanded=(a===undefined)?(!this.body.is(":visible")):(a);if(this.expanded){b._render_body_html(b.body);this.body.slideDown("fast",function(){b.trigger("body-expanded",b.model.get("id"))})}else{this.body.slideUp("fast",function(){b.trigger("body-collapsed",b.model.get("id"))})}},remove:function(){},toString:function(){var a=(this.model)?(this.model+""):("(no model)");return"HDABaseView("+a+")"}});HDABaseView.templates={warningMsg:Handlebars.templates["template-warningmessagesmall"],messages:Handlebars.templates["template-hda-warning-messages"],titleLink:Handlebars.templates["template-hda-titleLink"],hdaSummary:Handlebars.templates["template-hda-hdaSummary"],downloadLinks:Handlebars.templates["template-hda-downloadLinks"],failedMetadata:Handlebars.templates["template-hda-failedMetadata"],displayApps:Handlebars.templates["template-hda-displayApps"]};
\ No newline at end of file
diff -r fbfa0c78ea29b1e8d1ad339ab2d7d6ababb17e2a -r 166303bbdd86eefc263d9947b35c65ec3847ddc9 static/scripts/packed/mvc/dataset/hda-edit.js
--- a/static/scripts/packed/mvc/dataset/hda-edit.js
+++ b/static/scripts/packed/mvc/dataset/hda-edit.js
@@ -1,1 +1,1 @@
-var HDAEditView=HDABaseView.extend(LoggableMixin).extend({initialize:function(a){HDABaseView.prototype.initialize.call(this,a);this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton,this._render_rerunButton]},_render_warnings:function(){return $(jQuery.trim(HDABaseView.templates.messages(_.extend(this.model.toJSON(),{urls:this.urls}))))},_render_titleButtons:function(){var a=$('<div class="historyItemButtons"></div>');a.append(this._render_displayButton());a.append(this._render_editButton());a.append(this._render_deleteButton());return a},_render_editButton:function(){if((this.model.get("state")===HistoryDatasetAssociation.STATES.UPLOAD)||(this.model.get("state")===HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){this.editButton=null;return null}var c=this.model.get("purged"),a=this.model.get("deleted"),b={title:_l("Edit Attributes"),href:this.urls.edit,target:"galaxy_main",icon_class:"edit"};if(a||c){b.enabled=false;if(c){b.title=_l("Cannot edit attributes of datasets removed from disk")}else{if(a){b.title=_l("Undelete dataset to edit attributes")}}}this.editButton=new IconButtonView({model:new IconButton(b)});return this.editButton.render().$el},_render_deleteButton:function(){if((this.model.get("state")===HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){this.deleteButton=null;return null}var a={title:_l("Delete"),href:this.urls["delete"],id:"historyItemDeleter-"+this.model.get("id"),icon_class:"delete"};if(this.model.get("deleted")||this.model.get("purged")){a={title:_l("Dataset is already deleted"),icon_class:"delete",enabled:false}}this.deleteButton=new IconButtonView({model:new IconButton(a)});return this.deleteButton.render().$el},_render_hdaSummary:function(){var a=_.extend(this.model.toJSON(),{urls:this.urls});if(this.model.get("metadata_dbkey")==="?"&&!this.model.isDeletedOrPurged()){_.extend(a,{dbkey_unknown_and_editable:true})}return HDABaseView.templates.hdaSummary(a)},_render_errButton:function(){if(this.model.get("state")!==HistoryDatasetAssociation.STATES.ERROR){this.errButton=null;return null}this.errButton=new IconButtonView({model:new IconButton({title:_l("View or report this error"),href:this.urls.report_error,target:"galaxy_main",icon_class:"bug"})});return this.errButton.render().$el},_render_rerunButton:function(){this.rerunButton=new IconButtonView({model:new IconButton({title:_l("Run this job again"),href:this.urls.rerun,target:"galaxy_main",icon_class:"arrow-circle"})});return this.rerunButton.render().$el},_render_visualizationsButton:function(){var c=this.model.get("dbkey"),a=this.model.get("visualizations"),f=this.urls.visualization,d={},g={dataset_id:this.model.get("id"),hda_ldda:"hda"};if(c){g.dbkey=c}if(!(this.model.hasData())||!(a&&a.length)||!(f)){this.visualizationsButton=null;return null}this.visualizationsButton=new IconButtonView({model:new IconButton({title:_l("Visualize"),href:f,icon_class:"chart_curve"})});var b=this.visualizationsButton.render().$el;b.addClass("visualize-icon");function e(h){switch(h){case"trackster":return create_trackster_action_fn(f,g,c);case"scatterplot":return create_scatterplot_action_fn(f,g);default:return function(){window.parent.location=f+"/"+h+"?"+$.param(g)}}}if(a.length===1){b.attr("title",a[0]);b.click(e(a[0]))}else{_.each(a,function(i){var h=i.charAt(0).toUpperCase()+i.slice(1);d[_l(h)]=e(i)});make_popupmenu(b,d)}return b},_render_secondaryActionButtons:function(b){var c=$("<div/>"),a=this;c.attr("style","float: right;").attr("id","secondary-actions-"+this.model.get("id"));_.each(b,function(d){c.append(d.call(a))});return c},_render_tagButton:function(){if(!(this.model.hasData())||(!this.urls.tags.get)){this.tagButton=null;return null}this.tagButton=new IconButtonView({model:new IconButton({title:_l("Edit dataset tags"),target:"galaxy_main",href:this.urls.tags.get,icon_class:"tags"})});return this.tagButton.render().$el},_render_annotateButton:function(){if(!(this.model.hasData())||(!this.urls.annotation.get)){this.annotateButton=null;return null}this.annotateButton=new IconButtonView({model:new IconButton({title:_l("Edit dataset annotation"),target:"galaxy_main",icon_class:"annotate"})});return this.annotateButton.render().$el},_render_tagArea:function(){if(!this.urls.tags.set){return null}return $(HDAEditView.templates.tagArea(_.extend(this.model.toJSON(),{urls:this.urls})))},_render_annotationArea:function(){if(!this.urls.annotation.get){return null}return $(HDAEditView.templates.annotationArea(_.extend(this.model.toJSON(),{urls:this.urls})))},_render_body_error:function(a){HDABaseView.prototype._render_body_error.call(this,a);var b=a.find("#primary-actions-"+this.model.get("id"));b.prepend(this._render_errButton())},_render_body_ok:function(a){a.append(this._render_hdaSummary());if(this.model.isDeletedOrPurged()){a.append(this._render_primaryActionButtons([this._render_downloadButton,this._render_showParamsButton,this._render_rerunButton]));return}a.append(this._render_primaryActionButtons([this._render_downloadButton,this._render_showParamsButton,this._render_rerunButton,this._render_visualizationsButton]));a.append(this._render_secondaryActionButtons([this._render_tagButton,this._render_annotateButton]));a.append('<div class="clear"/>');a.append(this._render_tagArea());a.append(this._render_annotationArea());a.append(this._render_displayApps());a.append(this._render_peek())},events:{"click .historyItemTitle":"toggleBodyVisibility","click a.icon-button.tags":"loadAndDisplayTags","click a.icon-button.annotate":"loadAndDisplayAnnotation"},loadAndDisplayTags:function(b){this.log(this+".loadAndDisplayTags",b);var c=this.$el.find(".tag-area"),a=c.find(".tag-elt");if(c.is(":hidden")){if(!jQuery.trim(a.html())){$.ajax({url:this.urls.tags.get,error:function(){alert(_l("Tagging failed"))},success:function(d){a.html(d);a.find(".tooltip").tooltip();c.slideDown("fast")}})}else{c.slideDown("fast")}}else{c.slideUp("fast")}return false},loadAndDisplayAnnotation:function(b){this.log(this+".loadAndDisplayAnnotation",b);var d=this.$el.find(".annotation-area"),c=d.find(".annotation-elt"),a=this.urls.annotation.set;if(d.is(":hidden")){if(!jQuery.trim(c.html())){$.ajax({url:this.urls.annotation.get,error:function(){alert(_l("Annotations failed"))},success:function(e){if(e===""){e="<em>"+_l("Describe or add notes to dataset")+"</em>"}c.html(e);d.find(".tooltip").tooltip();async_save_text(c.attr("id"),c.attr("id"),a,"new_annotation",18,true,4);d.slideDown("fast")}})}else{d.slideDown("fast")}}else{d.slideUp("fast")}return false},toString:function(){var a=(this.model)?(this.model+""):("(no model)");return"HDAView("+a+")"}});HDAEditView.templates={tagArea:Handlebars.templates["template-hda-tagArea"],annotationArea:Handlebars.templates["template-hda-annotationArea"]};function create_scatterplot_action_fn(a,b){action=function(){var d=$(window.parent.document).find("iframe#galaxy_main"),c=a+"/scatterplot?"+$.param(b);d.attr("src",c);$("div.popmenu-wrapper").remove();return false};return action}function create_trackster_action_fn(a,c,b){return function(){var d={};if(b){d["f-dbkey"]=b}$.ajax({url:a+"/list_tracks?"+$.param(d),dataType:"html",error:function(){alert(_l("Could not add this dataset to browser")+".")},success:function(e){var f=window.parent;f.show_modal(_l("View Data in a New or Saved Visualization"),"",{Cancel:function(){f.hide_modal()},"View in saved visualization":function(){f.show_modal(_l("Add Data to Saved Visualization"),e,{Cancel:function(){f.hide_modal()},"Add to visualization":function(){$(f.document).find("input[name=id]:checked").each(function(){var g=$(this).val();c.id=g;f.location=a+"/trackster?"+$.param(c)})}})},"View in new visualization":function(){f.location=a+"/trackster?"+$.param(c)}})}});return false}};
\ No newline at end of file
+var HDAEditView=HDABaseView.extend(LoggableMixin).extend({initialize:function(a){HDABaseView.prototype.initialize.call(this,a);this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton,this._render_rerunButton]},_render_warnings:function(){return $(jQuery.trim(HDABaseView.templates.messages(_.extend(this.model.toJSON(),{urls:this.urls}))))},_render_titleButtons:function(){var a=$('<div class="historyItemButtons"></div>');a.append(this._render_displayButton());a.append(this._render_editButton());a.append(this._render_deleteButton());return a},_render_editButton:function(){if((this.model.get("state")===HistoryDatasetAssociation.STATES.UPLOAD)||(this.model.get("state")===HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){this.editButton=null;return null}var c=this.model.get("purged"),a=this.model.get("deleted"),b={title:_l("Edit Attributes"),href:this.urls.edit,target:"galaxy_main",icon_class:"edit"};if(a||c){b.enabled=false;if(c){b.title=_l("Cannot edit attributes of datasets removed from disk")}else{if(a){b.title=_l("Undelete dataset to edit attributes")}}}this.editButton=new IconButtonView({model:new IconButton(b)});return this.editButton.render().$el},_render_deleteButton:function(){if((this.model.get("state")===HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(!this.model.get("accessible"))){this.deleteButton=null;return null}var a=this,b=a.urls["delete"],c={title:_l("Delete"),href:b,id:"historyItemDeleter-"+this.model.get("id"),icon_class:"delete",on_click:function(){a.$el.hide();$.ajax({url:b,type:"POST",error:function(){a.$el.show()},success:function(){a.model.set("deleted",true);a.$el.remove()}});return false}};if(this.model.get("deleted")||this.model.get("purged")){c={title:_l("Dataset is already deleted"),icon_class:"delete",enabled:false}}this.deleteButton=new IconButtonView({model:new IconButton(c)});return this.deleteButton.render().$el},_render_hdaSummary:function(){var a=_.extend(this.model.toJSON(),{urls:this.urls});if(this.model.get("metadata_dbkey")==="?"&&!this.model.isDeletedOrPurged()){_.extend(a,{dbkey_unknown_and_editable:true})}return HDABaseView.templates.hdaSummary(a)},_render_errButton:function(){if(this.model.get("state")!==HistoryDatasetAssociation.STATES.ERROR){this.errButton=null;return null}this.errButton=new IconButtonView({model:new IconButton({title:_l("View or report this error"),href:this.urls.report_error,target:"galaxy_main",icon_class:"bug"})});return this.errButton.render().$el},_render_rerunButton:function(){this.rerunButton=new IconButtonView({model:new IconButton({title:_l("Run this job again"),href:this.urls.rerun,target:"galaxy_main",icon_class:"arrow-circle"})});return this.rerunButton.render().$el},_render_visualizationsButton:function(){var c=this.model.get("dbkey"),a=this.model.get("visualizations"),f=this.urls.visualization,d={},g={dataset_id:this.model.get("id"),hda_ldda:"hda"};if(c){g.dbkey=c}if(!(this.model.hasData())||!(a&&a.length)||!(f)){this.visualizationsButton=null;return null}this.visualizationsButton=new IconButtonView({model:new IconButton({title:_l("Visualize"),href:f,icon_class:"chart_curve"})});var b=this.visualizationsButton.render().$el;b.addClass("visualize-icon");function e(h){switch(h){case"trackster":return create_trackster_action_fn(f,g,c);case"scatterplot":return create_scatterplot_action_fn(f,g);default:return function(){window.parent.location=f+"/"+h+"?"+$.param(g)}}}if(a.length===1){b.attr("title",a[0]);b.click(e(a[0]))}else{_.each(a,function(i){var h=i.charAt(0).toUpperCase()+i.slice(1);d[_l(h)]=e(i)});make_popupmenu(b,d)}return b},_render_secondaryActionButtons:function(b){var c=$("<div/>"),a=this;c.attr("style","float: right;").attr("id","secondary-actions-"+this.model.get("id"));_.each(b,function(d){c.append(d.call(a))});return c},_render_tagButton:function(){if(!(this.model.hasData())||(!this.urls.tags.get)){this.tagButton=null;return null}this.tagButton=new IconButtonView({model:new IconButton({title:_l("Edit dataset tags"),target:"galaxy_main",href:this.urls.tags.get,icon_class:"tags"})});return this.tagButton.render().$el},_render_annotateButton:function(){if(!(this.model.hasData())||(!this.urls.annotation.get)){this.annotateButton=null;return null}this.annotateButton=new IconButtonView({model:new IconButton({title:_l("Edit dataset annotation"),target:"galaxy_main",icon_class:"annotate"})});return this.annotateButton.render().$el},_render_tagArea:function(){if(!this.urls.tags.set){return null}return $(HDAEditView.templates.tagArea(_.extend(this.model.toJSON(),{urls:this.urls})))},_render_annotationArea:function(){if(!this.urls.annotation.get){return null}return $(HDAEditView.templates.annotationArea(_.extend(this.model.toJSON(),{urls:this.urls})))},_render_body_error:function(a){HDABaseView.prototype._render_body_error.call(this,a);var b=a.find("#primary-actions-"+this.model.get("id"));b.prepend(this._render_errButton())},_render_body_ok:function(a){a.append(this._render_hdaSummary());if(this.model.isDeletedOrPurged()){a.append(this._render_primaryActionButtons([this._render_downloadButton,this._render_showParamsButton,this._render_rerunButton]));return}a.append(this._render_primaryActionButtons([this._render_downloadButton,this._render_showParamsButton,this._render_rerunButton,this._render_visualizationsButton]));a.append(this._render_secondaryActionButtons([this._render_tagButton,this._render_annotateButton]));a.append('<div class="clear"/>');a.append(this._render_tagArea());a.append(this._render_annotationArea());a.append(this._render_displayApps());a.append(this._render_peek())},events:{"click .historyItemTitle":"toggleBodyVisibility","click a.icon-button.tags":"loadAndDisplayTags","click a.icon-button.annotate":"loadAndDisplayAnnotation"},loadAndDisplayTags:function(b){this.log(this+".loadAndDisplayTags",b);var c=this.$el.find(".tag-area"),a=c.find(".tag-elt");if(c.is(":hidden")){if(!jQuery.trim(a.html())){$.ajax({url:this.urls.tags.get,error:function(){alert(_l("Tagging failed"))},success:function(d){a.html(d);a.find(".tooltip").tooltip();c.slideDown("fast")}})}else{c.slideDown("fast")}}else{c.slideUp("fast")}return false},loadAndDisplayAnnotation:function(b){this.log(this+".loadAndDisplayAnnotation",b);var d=this.$el.find(".annotation-area"),c=d.find(".annotation-elt"),a=this.urls.annotation.set;if(d.is(":hidden")){if(!jQuery.trim(c.html())){$.ajax({url:this.urls.annotation.get,error:function(){alert(_l("Annotations failed"))},success:function(e){if(e===""){e="<em>"+_l("Describe or add notes to dataset")+"</em>"}c.html(e);d.find(".tooltip").tooltip();async_save_text(c.attr("id"),c.attr("id"),a,"new_annotation",18,true,4);d.slideDown("fast")}})}else{d.slideDown("fast")}}else{d.slideUp("fast")}return false},toString:function(){var a=(this.model)?(this.model+""):("(no model)");return"HDAView("+a+")"}});HDAEditView.templates={tagArea:Handlebars.templates["template-hda-tagArea"],annotationArea:Handlebars.templates["template-hda-annotationArea"]};function create_scatterplot_action_fn(a,b){action=function(){var d=$(window.parent.document).find("iframe#galaxy_main"),c=a+"/scatterplot?"+$.param(b);d.attr("src",c);$("div.popmenu-wrapper").remove();return false};return action}function create_trackster_action_fn(a,c,b){return function(){var d={};if(b){d["f-dbkey"]=b}$.ajax({url:a+"/list_tracks?"+$.param(d),dataType:"html",error:function(){alert(_l("Could not add this dataset to browser")+".")},success:function(e){var f=window.parent;f.show_modal(_l("View Data in a New or Saved Visualization"),"",{Cancel:function(){f.hide_modal()},"View in saved visualization":function(){f.show_modal(_l("Add Data to Saved Visualization"),e,{Cancel:function(){f.hide_modal()},"Add to visualization":function(){$(f.document).find("input[name=id]:checked").each(function(){var g=$(this).val();c.id=g;f.location=a+"/trackster?"+$.param(c)})}})},"View in new visualization":function(){f.location=a+"/trackster?"+$.param(c)}})}});return false}};
\ No newline at end of file
diff -r fbfa0c78ea29b1e8d1ad339ab2d7d6ababb17e2a -r 166303bbdd86eefc263d9947b35c65ec3847ddc9 static/scripts/packed/viz/trackster/tracks.js
--- a/static/scripts/packed/viz/trackster/tracks.js
+++ b/static/scripts/packed/viz/trackster/tracks.js
@@ -1,1 +1,1 @@
-define(["libs/underscore","viz/visualization","viz/trackster/util","viz/trackster/slotting","viz/trackster/painters","mvc/data","viz/trackster/filters"],function(ab,x,l,u,L,Y,i){var q=ab.extend;var V=function(ac){return("isResolved" in ac)};var n={};var k=function(ac,ad){n[ac.attr("id")]=ad};var m=function(ac,ae,ag,af){ag=".group";var ad={};n[ac.attr("id")]=af;ac.bind("drag",{handle:"."+ae,relative:true},function(ao,ap){var an=$(this),at=$(this).parent(),ak=at.children(),am=n[$(this).attr("id")],aj,ai,aq,ah,al;ai=$(this).parents(ag);if(ai.length!==0){aq=ai.position().top;ah=aq+ai.outerHeight();if(ap.offsetY<aq){$(this).insertBefore(ai);var ar=n[ai.attr("id")];ar.remove_drawable(am);ar.container.add_drawable_before(am,ar);return}else{if(ap.offsetY>ah){$(this).insertAfter(ai);var ar=n[ai.attr("id")];ar.remove_drawable(am);ar.container.add_drawable(am);return}}}ai=null;for(al=0;al<ak.length;al++){aj=$(ak.get(al));aq=aj.position().top;ah=aq+aj.outerHeight();if(aj.is(ag)&&this!==aj.get(0)&&ap.offsetY>=aq&&ap.offsetY<=ah){if(ap.offsetY-aq<ah-ap.offsetY){aj.find(".content-div").prepend(this)}else{aj.find(".content-div").append(this)}if(am.container){am.container.remove_drawable(am)}n[aj.attr("id")].add_drawable(am);return}}for(al=0;al<ak.length;al++){aj=$(ak.get(al));if(ap.offsetY<aj.position().top&&!(aj.hasClass("reference-track")||aj.hasClass("intro"))){break}}if(al===ak.length){if(this!==ak.get(al-1)){at.append(this);n[at.attr("id")].move_drawable(am,al)}}else{if(this!==ak.get(al)){$(this).insertBefore(ak.get(al));n[at.attr("id")].move_drawable(am,(ap.deltaY>0?al-1:al))}}}).bind("dragstart",function(){ad["border-top"]=ac.css("border-top");ad["border-bottom"]=ac.css("border-bottom");$(this).css({"border-top":"1px solid blue","border-bottom":"1px solid blue"})}).bind("dragend",function(){$(this).css(ad)})};var aa=16,G=9,D=20,A=100,I=12000,S=400,K=5000,w=100,o="Cannot display dataset due to an error. ",J="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",E="No data for this chrom/contig.",v="Preparing data. This can take a while for a large dataset. If the visualization is saved and closed, preparation will continue in the background.",y="Tool cannot be rerun: ",a="Loading data...",U="Ready for display",Q=10,H=20;function W(ad,ac){if(!ac){ac=0}var ae=Math.pow(10,ac);return Math.round(ad*ae)/ae}var r=function(ad,ac,af){if(!r.id_counter){r.id_counter=0}this.id=r.id_counter++;this.name=af.name;this.view=ad;this.container=ac;this.config=new F({track:this,params:[{key:"name",label:"Name",type:"text",default_value:this.name}],saved_values:af.prefs,onchange:function(){this.track.set_name(this.track.config.values.name)}});this.prefs=this.config.values;this.drag_handle_class=af.drag_handle_class;this.is_overview=false;this.action_icons={};this.content_visible=true;this.container_div=this.build_container_div();this.header_div=this.build_header_div();if(this.header_div){this.container_div.append(this.header_div);this.icons_div=$("<div/>").css("float","left").hide().appendTo(this.header_div);this.build_action_icons(this.action_icons_def);this.header_div.append($("<div style='clear: both'/>"));this.header_div.dblclick(function(ag){ag.stopPropagation()});var ae=this;this.container_div.hover(function(){ae.icons_div.show()},function(){ae.icons_div.hide()});$("<div style='clear: both'/>").appendTo(this.container_div)}};r.prototype.action_icons_def=[{name:"toggle_icon",title:"Hide/show content",css_class:"toggle",on_click_fn:function(ac){if(ac.content_visible){ac.action_icons.toggle_icon.addClass("toggle-expand").removeClass("toggle");ac.hide_contents();ac.content_visible=false}else{ac.action_icons.toggle_icon.addClass("toggle").removeClass("toggle-expand");ac.content_visible=true;ac.show_contents()}}},{name:"settings_icon",title:"Edit settings",css_class:"settings-icon",on_click_fn:function(ad){var af=function(){hide_modal();$(window).unbind("keypress.check_enter_esc")},ac=function(){ad.config.update_from_form($(".dialog-box"));hide_modal();$(window).unbind("keypress.check_enter_esc")},ae=function(ag){if((ag.keyCode||ag.which)===27){af()}else{if((ag.keyCode||ag.which)===13){ac()}}};$(window).bind("keypress.check_enter_esc",ae);show_modal("Configure",ad.config.build_form(),{Cancel:af,OK:ac})}},{name:"remove_icon",title:"Remove",css_class:"remove-icon",on_click_fn:function(ac){$(".bs-tooltip").remove();ac.remove()}}];q(r.prototype,{init:function(){},changed:function(){this.view.changed()},can_draw:function(){if(this.enabled&&this.content_visible){return true}return false},request_draw:function(){},_draw:function(){},to_dict:function(){},set_name:function(ac){this.old_name=this.name;this.name=ac;this.name_div.text(this.name)},revert_name:function(){if(this.old_name){this.name=this.old_name;this.name_div.text(this.name)}},remove:function(){this.changed();this.container.remove_drawable(this);var ac=this.view;this.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})},build_container_div:function(){},build_header_div:function(){},add_action_icon:function(ad,ai,ah,ag,ac,af){var ae=this;this.action_icons[ad]=$("<a/>").attr("href","javascript:void(0);").attr("title",ai).addClass("icon-button").addClass(ah).tooltip().click(function(){ag(ae)}).appendTo(this.icons_div);if(af){this.action_icons[ad].hide()}},build_action_icons:function(ac){var ae;for(var ad=0;ad<ac.length;ad++){ae=ac[ad];this.add_action_icon(ae.name,ae.title,ae.css_class,ae.on_click_fn,ae.prepend,ae.hide)}},update_icons:function(){},hide_contents:function(){},show_contents:function(){},get_drawables:function(){}});var z=function(ad,ac,ae){r.call(this,ad,ac,ae);this.obj_type=ae.obj_type;this.drawables=[]};q(z.prototype,r.prototype,{unpack_drawables:function(ae){this.drawables=[];var ad;for(var ac=0;ac<ae.length;ac++){ad=p(ae[ac],this.view,this);this.add_drawable(ad)}},init:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].init()}},_draw:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac]._draw()}},to_dict:function(){var ad=[];for(var ac=0;ac<this.drawables.length;ac++){ad.push(this.drawables[ac].to_dict())}return{name:this.name,prefs:this.prefs,obj_type:this.obj_type,drawables:ad}},add_drawable:function(ac){this.drawables.push(ac);ac.container=this;this.changed()},add_drawable_before:function(ae,ac){this.changed();var ad=this.drawables.indexOf(ac);if(ad!==-1){this.drawables.splice(ad,0,ae);return true}return false},replace_drawable:function(ae,ac,ad){var af=this.drawables.indexOf(ae);if(af!==-1){this.drawables[af]=ac;if(ad){ae.container_div.replaceWith(ac.container_div)}this.changed()}return af},remove_drawable:function(ad){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);ad.container=null;this.changed();return true}return false},move_drawable:function(ad,ae){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);this.drawables.splice(ae,0,ad);this.changed();return true}return false},get_drawables:function(){return this.drawables}});var P=function(ad,ac,af){q(af,{obj_type:"DrawableGroup",drag_handle_class:"group-handle"});z.call(this,ad,ac,af);this.content_div=$("<div/>").addClass("content-div").attr("id","group_"+this.id+"_content_div").appendTo(this.container_div);k(this.container_div,this);k(this.content_div,this);m(this.container_div,this.drag_handle_class,".group",this);this.filters_manager=new i.FiltersManager(this);this.header_div.after(this.filters_manager.parent_div);this.saved_filters_managers=[];if("drawables" in af){this.unpack_drawables(af.drawables)}if("filters" in af){var ae=this.filters_manager;this.filters_manager=new i.FiltersManager(this,af.filters);ae.parent_div.replaceWith(this.filters_manager.parent_div);if(af.filters.visible){this.setup_multitrack_filtering()}}};q(P.prototype,r.prototype,z.prototype,{action_icons_def:[r.prototype.action_icons_def[0],r.prototype.action_icons_def[1],{name:"composite_icon",title:"Show composite track",css_class:"layers-stack",on_click_fn:function(ac){$(".bs-tooltip").remove();ac.show_composite_track()}},{name:"filters_icon",title:"Filters",css_class:"filters-icon",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters();ac._restore_filter_managers()}else{ac.setup_multitrack_filtering();ac.request_draw(true)}ac.filters_manager.toggle()}},r.prototype.action_icons_def[2]],build_container_div:function(){var ac=$("<div/>").addClass("group").attr("id","group_"+this.id);if(this.container){this.container.content_div.append(ac)}return ac},build_header_div:function(){var ac=$("<div/>").addClass("track-header");ac.append($("<div/>").addClass(this.drag_handle_class));this.name_div=$("<div/>").addClass("track-name").text(this.name).appendTo(ac);return ac},hide_contents:function(){this.tiles_div.hide()},show_contents:function(){this.tiles_div.show();this.request_draw()},update_icons:function(){var ae=this.drawables.length;if(ae===0){this.action_icons.composite_icon.hide();this.action_icons.filters_icon.hide()}else{if(ae===1){if(this.drawables[0] instanceof f){this.action_icons.composite_icon.show()}this.action_icons.filters_icon.hide()}else{var al,ak,ai,ao=true,ag=this.drawables[0].get_type(),ac=0;for(al=0;al<ae;al++){ai=this.drawables[al];if(ai.get_type()!==ag){can_composite=false;break}if(ai instanceof c){ac++}}if(ao||ac===1){this.action_icons.composite_icon.show()}else{this.action_icons.composite_icon.hide();$(".bs-tooltip").remove()}if(ac>1&&ac===this.drawables.length){var ap={},ad;ai=this.drawables[0];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];ap[ad.name]=[ad]}for(al=1;al<this.drawables.length;al++){ai=this.drawables[al];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];if(ad.name in ap){ap[ad.name].push(ad)}}}this.filters_manager.remove_all();var af,ah,aj,am;for(var an in ap){af=ap[an];if(af.length===ac){ah=new i.NumberFilter({name:af[0].name,index:af[0].index});this.filters_manager.add_filter(ah)}}if(this.filters_manager.filters.length>0){this.action_icons.filters_icon.show()}else{this.action_icons.filters_icon.hide()}}else{this.action_icons.filters_icon.hide()}}}},_restore_filter_managers:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].filters_manager=this.saved_filters_managers[ac]}this.saved_filters_managers=[]},setup_multitrack_filtering:function(){if(this.filters_manager.filters.length>0){this.saved_filters_managers=[];for(var ac=0;ac<this.drawables.length;ac++){drawable=this.drawables[ac];this.saved_filters_managers.push(drawable.filters_manager);drawable.filters_manager=this.filters_manager}}this.filters_manager.init_filters()},show_composite_track:function(){var ag=[];for(var ad=0;ad<this.drawables.length;ad++){ag.push(this.drawables[ad].name)}var ae="Composite Track of "+this.drawables.length+" tracks ("+ag.join(", ")+")";var af=new f(this.view,this.view,{name:ae,drawables:this.drawables});var ac=this.container.replace_drawable(this,af,true);af.request_draw()},add_drawable:function(ac){z.prototype.add_drawable.call(this,ac);this.update_icons()},remove_drawable:function(ac){z.prototype.remove_drawable.call(this,ac);this.update_icons()},to_dict:function(){if(this.filters_manager.visible()){this._restore_filter_managers()}var ac=q(z.prototype.to_dict.call(this),{filters:this.filters_manager.to_dict()});if(this.filters_manager.visible()){this.setup_multitrack_filtering()}return ac},request_draw:function(ac,ae){for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad].request_draw(ac,ae)}}});var Z=Backbone.View.extend({initialize:function(ac){q(ac,{obj_type:"View"});z.call(this,"View",ac.container,ac);this.chrom=null;this.vis_id=ac.vis_id;this.dbkey=ac.dbkey;this.label_tracks=[];this.tracks_to_be_redrawn=[];this.max_low=0;this.max_high=0;this.zoom_factor=3;this.min_separation=30;this.has_changes=false;this.load_chroms_deferred=null;this.render();this.canvas_manager=new x.CanvasManager(this.container.get(0).ownerDocument);this.reset()},render:function(){this.requested_redraw=false;var ae=this.container,ac=this;this.top_container=$("<div/>").addClass("top-container").appendTo(ae);this.browser_content_div=$("<div/>").addClass("content").css("position","relative").appendTo(ae);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(ae);this.top_labeltrack=$("<div/>").addClass("top-labeltrack").appendTo(this.top_container);this.viewport_container=$("<div/>").addClass("viewport-container").attr("id","viewport-container").appendTo(this.browser_content_div);this.content_div=this.viewport_container;k(this.viewport_container,ac);this.intro_div=$("<div/>").addClass("intro").appendTo(this.viewport_container).hide();var af=$("<div/>").text("Add Datasets to Visualization").addClass("action-button").appendTo(this.intro_div).click(function(){x.select_datasets(select_datasets_url,add_track_async_url,{"f-dbkey":ac.dbkey},function(ag){ab.each(ag,function(ah){ac.add_drawable(p(ah,ac,ac))})})});this.nav_labeltrack=$("<div/>").addClass("nav-labeltrack").appendTo(this.bottom_container);this.nav_container=$("<div/>").addClass("trackster-nav-container").prependTo(this.top_container);this.nav=$("<div/>").addClass("trackster-nav").appendTo(this.nav_container);this.overview=$("<div/>").addClass("overview").appendTo(this.bottom_container);this.overview_viewport=$("<div/>").addClass("overview-viewport").appendTo(this.overview);this.overview_close=$("<a/>").attr("href","javascript:void(0);").attr("title","Close overview").addClass("icon-button overview-close tooltip").hide().appendTo(this.overview_viewport);this.overview_highlight=$("<div/>").addClass("overview-highlight").hide().appendTo(this.overview_viewport);this.overview_box_background=$("<div/>").addClass("overview-boxback").appendTo(this.overview_viewport);this.overview_box=$("<div/>").addClass("overview-box").appendTo(this.overview_viewport);this.default_overview_height=this.overview_box.height();this.nav_controls=$("<div/>").addClass("nav-controls").appendTo(this.nav);this.chrom_select=$("<select/>").attr({name:"chrom"}).css("width","15em").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var ad=function(ag){if(ag.type==="focusout"||(ag.keyCode||ag.which)===13||(ag.keyCode||ag.which)===27){if((ag.keyCode||ag.which)!==27){ac.go_to($(this).val())}$(this).hide();$(this).val("");ac.location_span.show();ac.chrom_select.show()}};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",ad).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").attr("original-title","Click to change location").tooltip({placement:"bottom"}).appendTo(this.nav_controls);this.location_span.click(function(){ac.location_span.hide();ac.chrom_select.hide();ac.nav_input.val(ac.chrom+":"+ac.low+"-"+ac.high);ac.nav_input.css("display","inline-block");ac.nav_input.select();ac.nav_input.focus();ac.nav_input.autocomplete({source:function(ai,ag){var aj=[],ah=$.map(ac.get_drawables(),function(ak){return ak.data_manager.search_features(ai.term).success(function(al){aj=aj.concat(al)})});$.when.apply($,ah).done(function(){ag($.map(aj,function(ak){return{label:ak[0],value:ak[1]}}))})}})});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a/>").attr("id","zoom-out").attr("title","Zoom out").tooltip({placement:"bottom"}).click(function(){ac.zoom_out();ac.request_redraw()}).appendTo(this.nav_controls);this.zi_link=$("<a/>").attr("id","zoom-in").attr("title","Zoom in").tooltip({placement:"bottom"}).click(function(){ac.zoom_in();ac.request_redraw()}).appendTo(this.nav_controls);this.load_chroms_deferred=this.load_chroms({low:0});this.chrom_select.bind("change",function(){ac.change_chrom(ac.chrom_select.val())});this.browser_content_div.click(function(ag){$(this).find("input").trigger("blur")});this.browser_content_div.bind("dblclick",function(ag){ac.zoom_in(ag.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(ag,ah){this.current_x=ah.offsetX}).bind("drag",function(ag,ai){var aj=ai.offsetX-this.current_x;this.current_x=ai.offsetX;var ah=Math.round(aj/ac.viewport_container.width()*(ac.max_high-ac.max_low));ac.move_delta(-ah)});this.overview_close.click(function(){ac.reset_overview()});this.viewport_container.bind("draginit",function(ag,ah){if(ag.clientX>ac.viewport_container.width()-16){return false}}).bind("dragstart",function(ag,ah){ah.original_low=ac.low;ah.current_height=ag.clientY;ah.current_x=ah.offsetX}).bind("drag",function(ai,ak){var ag=$(this);var al=ak.offsetX-ak.current_x;var ah=ag.scrollTop()-(ai.clientY-ak.current_height);ag.scrollTop(ah);ak.current_height=ai.clientY;ak.current_x=ak.offsetX;var aj=Math.round(al/ac.viewport_container.width()*(ac.high-ac.low));ac.move_delta(aj)}).bind("mousewheel",function(ai,ak,ah,ag){if(ah){ah*=50;var aj=Math.round(-ah/ac.viewport_container.width()*(ac.high-ac.low));ac.move_delta(aj)}});this.top_labeltrack.bind("dragstart",function(ag,ah){return $("<div />").css({height:ac.browser_content_div.height()+ac.top_labeltrack.height()+ac.nav_labeltrack.height()+1,top:"0px",position:"absolute","background-color":"#ccf",opacity:0.5,"z-index":1000}).appendTo($(this))}).bind("drag",function(ak,al){$(al.proxy).css({left:Math.min(ak.pageX,al.startX)-ac.container.offset().left,width:Math.abs(ak.pageX-al.startX)});var ah=Math.min(ak.pageX,al.startX)-ac.container.offset().left,ag=Math.max(ak.pageX,al.startX)-ac.container.offset().left,aj=(ac.high-ac.low),ai=ac.viewport_container.width();ac.update_location(Math.round(ah/ai*aj)+ac.low,Math.round(ag/ai*aj)+ac.low)}).bind("dragend",function(al,am){var ah=Math.min(al.pageX,am.startX),ag=Math.max(al.pageX,am.startX),aj=(ac.high-ac.low),ai=ac.viewport_container.width(),ak=ac.low;ac.low=Math.round(ah/ai*aj)+ak;ac.high=Math.round(ag/ai*aj)+ak;$(am.proxy).remove();ac.request_redraw()});this.add_label_track(new X(this,{content_div:this.top_labeltrack}));this.add_label_track(new X(this,{content_div:this.nav_labeltrack}));$(window).bind("resize",function(){if(this.resize_timer){clearTimeout(this.resize_timer)}this.resize_timer=setTimeout(function(){ac.resize_window()},500)});$(document).bind("redraw",function(){ac.redraw()});this.reset();$(window).trigger("resize")}});q(Z.prototype,z.prototype,{changed:function(){this.has_changes=true},update_intro_div:function(){if(this.drawables.length===0){this.intro_div.show()}else{this.intro_div.hide()}},trigger_navigate:function(ad,af,ac,ag){if(this.timer){clearTimeout(this.timer)}if(ag){var ae=this;this.timer=setTimeout(function(){ae.trigger("navigate",ad+":"+af+"-"+ac)},500)}else{view.trigger("navigate",ad+":"+af+"-"+ac)}},update_location:function(ac,ae){this.location_span.text(commatize(ac)+" - "+commatize(ae));this.nav_input.val(this.chrom+":"+commatize(ac)+"-"+commatize(ae));var ad=view.chrom_select.val();if(ad!==""){this.trigger_navigate(ad,view.low,view.high,true)}},load_chroms:function(ae){ae.num=w;var ac=this,ad=$.Deferred();$.ajax({url:chrom_url+"/"+this.dbkey,data:ae,dataType:"json",success:function(ag){if(ag.chrom_info.length===0){return}if(ag.reference){ac.add_label_track(new B(ac))}ac.chrom_data=ag.chrom_info;var aj='<option value="">Select Chrom/Contig</option>';for(var ai=0,af=ac.chrom_data.length;ai<af;ai++){var ah=ac.chrom_data[ai].chrom;aj+='<option value="'+ah+'">'+ah+"</option>"}if(ag.prev_chroms){aj+='<option value="previous">Previous '+w+"</option>"}if(ag.next_chroms){aj+='<option value="next">Next '+w+"</option>"}ac.chrom_select.html(aj);ac.chrom_start_index=ag.start_index;ad.resolve(ag)},error:function(){alert("Could not load chroms for this dbkey:",ac.dbkey)}});return ad},change_chrom:function(ah,ad,aj){var ae=this;if(!ae.chrom_data){ae.load_chroms_deferred.then(function(){ae.change_chrom(ah,ad,aj)});return}if(!ah||ah==="None"){return}if(ah==="previous"){ae.load_chroms({low:this.chrom_start_index-w});return}if(ah==="next"){ae.load_chroms({low:this.chrom_start_index+w});return}var ai=$.grep(ae.chrom_data,function(ak,al){return ak.chrom===ah})[0];if(ai===undefined){ae.load_chroms({chrom:ah},function(){ae.change_chrom(ah,ad,aj)});return}else{if(ah!==ae.chrom){ae.chrom=ah;ae.chrom_select.val(ae.chrom);ae.max_high=ai.len-1;ae.reset();ae.request_redraw(true);for(var ag=0,ac=ae.drawables.length;ag<ac;ag++){var af=ae.drawables[ag];if(af.init){af.init()}}if(ae.reference_track){ae.reference_track.init()}}if(ad!==undefined&&aj!==undefined){ae.low=Math.max(ad,0);ae.high=Math.min(aj,ae.max_high)}else{ae.low=0;ae.high=ae.max_high}ae.reset_overview();ae.request_redraw()}},go_to:function(ag){ag=ag.replace(/ |,/g,"");var ak=this,ac,af,ad=ag.split(":"),ai=ad[0],aj=ad[1];if(aj!==undefined){try{var ah=aj.split("-");ac=parseInt(ah[0],10);af=parseInt(ah[1],10)}catch(ae){return false}}ak.change_chrom(ai,ac,af)},move_fraction:function(ae){var ac=this;var ad=ac.high-ac.low;this.move_delta(ae*ad)},move_delta:function(af){var ac=this;var ae=ac.high-ac.low;if(ac.low-af<ac.max_low){ac.low=ac.max_low;ac.high=ac.max_low+ae}else{if(ac.high-af>ac.max_high){ac.high=ac.max_high;ac.low=ac.max_high-ae}else{ac.high-=af;ac.low-=af}}ac.request_redraw();var ad=ac.chrom_select.val();this.trigger_navigate(ad,ac.low,ac.high,true)},add_drawable:function(ac){z.prototype.add_drawable.call(this,ac);ac.init();this.changed();this.update_intro_div()},add_label_track:function(ac){ac.view=this;ac.init();this.label_tracks.push(ac)},remove_drawable:function(ae,ad){z.prototype.remove_drawable.call(this,ae);if(ad){var ac=this;ae.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})}},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},request_redraw:function(ak,ac,aj,al){var ai=this,ah=(al?[al]:ai.drawables),ae;var ad;for(var ag=0;ag<ah.length;ag++){ad=ah[ag];ae=-1;for(var af=0;af<ai.tracks_to_be_redrawn.length;af++){if(ai.tracks_to_be_redrawn[af][0]===ad){ae=af;break}}if(ae<0){ai.tracks_to_be_redrawn.push([ad,ac,aj])}else{ai.tracks_to_be_redrawn[ag][1]=ac;ai.tracks_to_be_redrawn[ag][2]=aj}}if(!this.requested_redraw){requestAnimationFrame(function(){ai._redraw(ak)});this.requested_redraw=true}},_redraw:function(am){this.requested_redraw=false;var aj=this.low,af=this.high;if(aj<this.max_low){aj=this.max_low}if(af>this.max_high){af=this.max_high}var al=this.high-this.low;if(this.high!==0&&al<this.min_separation){af=aj+this.min_separation}this.low=Math.floor(aj);this.high=Math.ceil(af);this.update_location(this.low,this.high);this.resolution_b_px=(this.high-this.low)/this.viewport_container.width();this.resolution_px_b=this.viewport_container.width()/(this.high-this.low);var ac=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ai=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var an=13;this.overview_box.css({left:ac,width:Math.max(an,ai)}).show();if(ai<an){this.overview_box.css("left",ac-(an-ai)/2)}if(this.overview_highlight){this.overview_highlight.css({left:ac,width:ai})}if(!am){var ae,ad,ak;for(var ag=0,ah=this.tracks_to_be_redrawn.length;ag<ah;ag++){ae=this.tracks_to_be_redrawn[ag][0];ad=this.tracks_to_be_redrawn[ag][1];ak=this.tracks_to_be_redrawn[ag][2];if(ae){ae._draw(ad,ak)}}this.tracks_to_be_redrawn=[];for(ag=0,ah=this.label_tracks.length;ag<ah;ag++){this.label_tracks[ag]._draw()}}},zoom_in:function(ad,ae){if(this.max_high===0||this.high-this.low<=this.min_separation){return}var af=this.high-this.low,ag=af/2+this.low,ac=(af/this.zoom_factor)/2;if(ad){ag=ad/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(ag-ac);this.high=Math.round(ag+ac);this.changed();this.request_redraw()},zoom_out:function(){if(this.max_high===0){return}var ad=this.high-this.low,ae=ad/2+this.low,ac=(ad*this.zoom_factor)/2;this.low=Math.round(ae-ac);this.high=Math.round(ae+ac);this.changed();this.request_redraw()},resize_window:function(){this.viewport_container.height(this.container.height()-this.top_container.height()-this.bottom_container.height());this.request_redraw()},set_overview:function(ae){if(this.overview_drawable){if(this.overview_drawable.dataset_id===ae.dataset_id){return}this.overview_viewport.find(".track").remove()}var ad=ae.copy({content_div:this.overview_viewport}),ac=this;ad.header_div.hide();ad.is_overview=true;ac.overview_drawable=ad;this.overview_drawable.postdraw_actions=function(){ac.overview_highlight.show().height(ac.overview_drawable.content_div.height());ac.overview_viewport.height(ac.overview_drawable.content_div.height()+ac.overview_box.outerHeight());ac.overview_close.show();ac.resize_window()};ac.overview_drawable.request_draw();this.changed()},reset_overview:function(){$(".bs-tooltip").remove();this.overview_viewport.find(".track-tile").remove();this.overview_viewport.height(this.default_overview_height);this.overview_box.height(this.default_overview_height);this.overview_close.hide();this.overview_highlight.hide();view.resize_window();view.overview_drawable=null}});var s=function(ae,aj,af){this.track=ae;this.name=aj.name;this.params=[];var aq=aj.params;for(var ag=0;ag<aq.length;ag++){var al=aq[ag],ad=al.name,ap=al.label,ah=unescape(al.html),ar=al.value,an=al.type;if(an==="number"){this.params.push(new e(ad,ap,ah,(ad in af?af[ad]:ar),al.min,al.max))}else{if(an==="select"){this.params.push(new N(ad,ap,ah,(ad in af?af[ad]:ar)))}else{console.log("WARNING: unrecognized tool parameter type:",ad,an)}}}this.parent_div=$("<div/>").addClass("dynamic-tool").hide();this.parent_div.bind("drag",function(au){au.stopPropagation()}).click(function(au){au.stopPropagation()}).bind("dblclick",function(au){au.stopPropagation()});var ao=$("<div class='tool-name'>").appendTo(this.parent_div).text(this.name);var am=this.params;var ak=this;$.each(this.params,function(av,ay){var ax=$("<div>").addClass("param-row").appendTo(ak.parent_div);var au=$("<div>").addClass("param-label").text(ay.label).appendTo(ax);var aw=$("<div/>").addClass("param-input").html(ay.html).appendTo(ax);aw.find(":input").val(ay.value);$("<div style='clear: both;'/>").appendTo(ax)});this.parent_div.find("input").click(function(){$(this).select()});var at=$("<div>").addClass("param-row").appendTo(this.parent_div);var ai=$("<input type='submit'>").attr("value","Run on complete dataset").appendTo(at);var ac=$("<input type='submit'>").attr("value","Run on visible region").css("margin-left","3em").appendTo(at);ac.click(function(){ak.run_on_region()});ai.click(function(){ak.run_on_dataset()});if("visible" in af&&af.visible){this.parent_div.show()}};q(s.prototype,{update_params:function(){for(var ac=0;ac<this.params.length;ac++){this.params[ac].update_value()}},state_dict:function(){var ad={};for(var ac=0;ac<this.params.length;ac++){ad[this.params[ac].name]=this.params[ac].value}ad.visible=this.parent_div.is(":visible");return ad},get_param_values_dict:function(){var ac={};this.parent_div.find(":input").each(function(){var ad=$(this).attr("name"),ae=$(this).val();ac[ad]=ae});return ac},get_param_values:function(){var ac=[];this.parent_div.find(":input").each(function(){var ad=$(this).attr("name"),ae=$(this).val();if(ad){ac[ac.length]=ae}});return ac},run_on_dataset:function(){var ac=this;ac.run({target_dataset_id:this.track.original_dataset_id,tool_id:ac.name},null,function(ad){show_modal(ac.name+" is Running",ac.name+" is running on the complete dataset. Tool outputs are in dataset's history.",{Close:hide_modal})})},run_on_region:function(){var ai=new x.GenomeRegion({chrom:this.track.view.chrom,start:this.track.view.low,end:this.track.view.high}),ad={target_dataset_id:this.track.original_dataset_id,action:"rerun",tool_id:this.name,regions:[ai.toJSON()]},ah=this.track,ae=ad.tool_id+ah.tool_region_and_parameters_str(ai),ac;if(ah.container===view){var ag=new P(view,view,{name:this.name});var af=ah.container.replace_drawable(ah,ag,false);ag.container_div.insertBefore(ah.view.content_div.children()[af]);ag.add_drawable(ah);ah.container_div.appendTo(ag.content_div);ac=ag}else{ac=ah.container}var aj=new ah.constructor(view,ac,{name:ae,hda_ldda:"hda"});aj.init_for_tool_data();aj.change_mode(ah.mode);aj.set_filters_manager(ah.filters_manager.copy(aj));aj.update_icons();ac.add_drawable(aj);aj.tiles_div.text("Starting job.");this.update_params();this.run(ad,aj,function(ak){aj.set_dataset(new Y.Dataset(ak));aj.tiles_div.text("Running job.");aj.init()})},run:function(ac,ae,af){ac.inputs=this.get_param_values_dict();var ad=new l.ServerStateDeferred({ajax_settings:{url:galaxy_paths.get("tool_url"),data:JSON.stringify(ac),dataType:"json",contentType:"application/json",type:"POST"},interval:2000,success_fn:function(ag){return ag!=="pending"}});$.when(ad.go()).then(function(ag){if(ag==="no converter"){ae.container_div.addClass("error");ae.content_div.text(J)}else{if(ag.error){ae.container_div.addClass("error");ae.content_div.text(y+ag.message)}else{af(ag)}}})}});var N=function(ad,ac,ae,af){this.name=ad;this.label=ac;this.html=$(ae);this.value=af};q(N.prototype,{update_value:function(){this.value=$(this.html).val()}});var e=function(ae,ad,ag,ah,af,ac){N.call(this,ae,ad,ag,ah);this.min=af;this.max=ac};q(e.prototype,N.prototype,{update_value:function(){N.prototype.update_value.call(this);this.value=parseFloat(this.value)}});var C=function(ac,ad){L.Scaler.call(this,ad);this.filter=ac};C.prototype.gen_val=function(ac){if(this.filter.high===Number.MAX_VALUE||this.filter.low===-Number.MAX_VALUE||this.filter.low===this.filter.high){return this.default_val}return((parseFloat(ac[this.filter.index])-this.filter.low)/(this.filter.high-this.filter.low))};var F=function(ac){this.track=ac.track;this.params=ac.params;this.values={};this.restore_values((ac.saved_values?ac.saved_values:{}));this.onchange=ac.onchange};q(F.prototype,{restore_values:function(ac){var ad=this;$.each(this.params,function(ae,af){if(ac[af.key]!==undefined){ad.values[af.key]=ac[af.key]}else{ad.values[af.key]=af.default_value}})},build_form:function(){var af=this;var ac=$("<div />");var ae;function ad(ak,ag){for(var ao=0;ao<ak.length;ao++){ae=ak[ao];if(ae.hidden){continue}var ai="param_"+ao;var at=af.values[ae.key];var av=$("<div class='form-row' />").appendTo(ag);av.append($("<label />").attr("for",ai).text(ae.label+":"));if(ae.type==="bool"){av.append($('<input type="checkbox" />').attr("id",ai).attr("name",ai).attr("checked",at))}else{if(ae.type==="text"){av.append($('<input type="text"/>').attr("id",ai).val(at).click(function(){$(this).select()}))}else{if(ae.type==="select"){var aq=$("<select />").attr("id",ai);for(var am=0;am<ae.options.length;am++){$("<option/>").text(ae.options[am].label).attr("value",ae.options[am].value).appendTo(aq)}aq.val(at);av.append(aq)}else{if(ae.type==="color"){var au=$("<div/>").appendTo(av),ap=$("<input />").attr("id",ai).attr("name",ai).val(at).css("float","left").appendTo(au).click(function(ax){$(".bs-tooltip").removeClass("in");var aw=$(this).siblings(".bs-tooltip").addClass("in");aw.css({left:$(this).position().left+$(this).width()+5,top:$(this).position().top-($(aw).height()/2)+($(this).height()/2)}).show();aw.click(function(ay){ay.stopPropagation()});$(document).bind("click.color-picker",function(){aw.hide();$(document).unbind("click.color-picker")});ax.stopPropagation()}),an=$("<a href='javascript:void(0)'/>").addClass("icon-button arrow-circle").appendTo(au).attr("title","Set new random color").tooltip(),ar=$("<div class='bs-tooltip right' style='position: absolute;' />").appendTo(au).hide(),aj=$("<div class='tooltip-inner' style='text-align: inherit'></div>").appendTo(ar),ah=$("<div class='tooltip-arrow'></div>").appendTo(ar),al=$.farbtastic(aj,{width:100,height:100,callback:ap,color:at});au.append($("<div/>").css("clear","both"));(function(aw){an.click(function(){aw.setColor(l.get_random_color())})})(al)}else{av.append($("<input />").attr("id",ai).attr("name",ai).val(at))}}}}if(ae.help){av.append($("<div class='help'/>").text(ae.help))}}}ad(this.params,ac);return ac},update_from_form:function(ac){var ae=this;var ad=false;$.each(this.params,function(af,ah){if(!ah.hidden){var ai="param_"+af;var ag=ac.find("#"+ai).val();if(ah.type==="float"){ag=parseFloat(ag)}else{if(ah.type==="int"){ag=parseInt(ag)}else{if(ah.type==="bool"){ag=ac.find("#"+ai).is(":checked")}}}if(ag!==ae.values[ah.key]){ae.values[ah.key]=ag;ad=true}}});if(ad){this.onchange();this.track.changed()}}});var b=function(ac,ag,ae,ad,af){this.track=ac;this.region=ag;this.low=ag.get("start");this.high=ag.get("end");this.resolution=ae;this.html_elt=$("<div class='track-tile'/>").append(ad).height($(ad).attr("height"));this.data=af;this.stale=false};b.prototype.predisplay_actions=function(){};var j=function(ac,ah,ae,ad,af,ag){b.call(this,ac,ah,ae,ad,af);this.max_val=ag};q(j.prototype,b.prototype);var O=function(af,an,ag,ae,ai,ap,aj,aq,ad,am){b.call(this,af,an,ag,ae,ai);this.mode=aj;this.all_slotted=ad;this.feature_mapper=am;this.has_icons=false;if(aq){this.has_icons=true;var ak=this;ae=this.html_elt.children()[0],message_div=$("<div/>").addClass("tile-message").css({height:D-1,width:ae.width}).prependTo(this.html_elt);var al=new x.GenomeRegion({chrom:af.view.chrom,start:this.low,end:this.high}),ao=ai.length,ah=$("<a href='javascript:void(0);'/>").addClass("icon more-down").attr("title","For speed, only the first "+ao+" features in this region were obtained from server. Click to get more data including depth").tooltip().appendTo(message_div),ac=$("<a href='javascript:void(0);'/>").addClass("icon more-across").attr("title","For speed, only the first "+ao+" features in this region were obtained from server. Click to get more data excluding depth").tooltip().appendTo(message_div);ah.click(function(){ak.stale=true;af.data_manager.get_more_data(al,af.mode,ak.resolution,{},af.data_manager.DEEP_DATA_REQ);$(".bs-tooltip").hide();af.request_draw(true)}).dblclick(function(ar){ar.stopPropagation()});ac.click(function(){ak.stale=true;af.data_manager.get_more_data(al,af.mode,ak.resolution,{},af.data_manager.BROAD_DATA_REQ);$(".bs-tooltip").hide();af.request_draw(true)}).dblclick(function(ar){ar.stopPropagation()})}};q(O.prototype,b.prototype);O.prototype.predisplay_actions=function(){var ad=this,ac={};if(ad.mode!=="Pack"){return}$(this.html_elt).hover(function(){this.hovered=true;$(this).mousemove()},function(){this.hovered=false;$(this).parents(".track-content").children(".overlay").children(".feature-popup").remove()}).mousemove(function(ao){if(!this.hovered){return}var aj=$(this).offset(),an=ao.pageX-aj.left,am=ao.pageY-aj.top,at=ad.feature_mapper.get_feature_data(an,am),ak=(at?at[0]:null);$(this).parents(".track-content").children(".overlay").children(".feature-popup").each(function(){if(!ak||$(this).attr("id")!==ak.toString()){$(this).remove()}});if(at){var af=ac[ak];if(!af){var ak=at[0],ap={name:at[3],start:at[1],end:at[2],strand:at[4]},ai=ad.track.filters_manager.filters,ah;for(var al=0;al<ai.length;al++){ah=ai[al];ap[ah.name]=at[ah.index]}var af=$("<div/>").attr("id",ak).addClass("feature-popup"),au=$("<table/>"),ar,aq,av;for(ar in ap){aq=ap[ar];av=$("<tr/>").appendTo(au);$("<th/>").appendTo(av).text(ar);$("<td/>").attr("align","left").appendTo(av).text(typeof(aq)==="number"?W(aq,2):aq)}af.append($("<div class='feature-popup-inner'>").append(au));ac[ak]=af}af.appendTo($(this).parents(".track-content").children(".overlay"));var ag=an+parseInt(ad.html_elt.css("left"))-af.width()/2,ae=am+parseInt(ad.html_elt.css("top"))+7;af.css("left",ag+"px").css("top",ae+"px")}else{if(!ao.isPropagationStopped()){ao.stopPropagation();$(this).siblings().each(function(){$(this).trigger(ao)})}}}).mouseleave(function(){$(this).parents(".track-content").children(".overlay").children(".feature-popup").remove()})};var g=function(ad,ac,ae){q(ae,{drag_handle_class:"draghandle"});r.call(this,ad,ac,ae);this.dataset=new Y.Dataset({id:ae.dataset_id,hda_ldda:ae.hda_ldda});this.dataset_check_type="converted_datasets_state";this.data_url_extra_params={};this.data_query_wait=("data_query_wait" in ae?ae.data_query_wait:K);this.data_manager=("data_manager" in ae?ae.data_manager:new x.GenomeDataManager({dataset:this.dataset,data_mode_compatible:this.data_and_mode_compatible,can_subset:this.can_subset}));this.min_height_px=16;this.max_height_px=800;this.visible_height_px=0;this.content_div=$("<div class='track-content'>").appendTo(this.container_div);if(this.container){this.container.content_div.append(this.container_div);if(!("resize" in ae)||ae.resize){this.add_resize_handle()}}};q(g.prototype,r.prototype,{action_icons_def:[{name:"mode_icon",title:"Set display mode",css_class:"chevron-expand",on_click_fn:function(){}},r.prototype.action_icons_def[0],{name:"overview_icon",title:"Set as overview",css_class:"overview-icon",on_click_fn:function(ac){ac.view.set_overview(ac)}},r.prototype.action_icons_def[1],{name:"filters_icon",title:"Filters",css_class:"filters-icon",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters()}else{ac.filters_manager.init_filters()}ac.filters_manager.toggle()}},{name:"tools_icon",title:"Tool",css_class:"hammer",on_click_fn:function(ac){ac.dynamic_tool_div.toggle();if(ac.dynamic_tool_div.is(":visible")){ac.set_name(ac.name+ac.tool_region_and_parameters_str())}else{ac.revert_name()}$(".bs-tooltip").remove()}},{name:"param_space_viz_icon",title:"Tool parameter space visualization",css_class:"arrow-split",on_click_fn:function(ac){var af='<strong>Tool</strong>: <%= track.tool.name %><br/><strong>Dataset</strong>: <%= track.name %><br/><strong>Region(s)</strong>: <select name="regions"><option value="cur">current viewing area</option><option value="bookmarks">bookmarks</option><option value="both">current viewing area and bookmarks</option></select>',ae=ab.template(af,{track:ac});var ah=function(){hide_modal();$(window).unbind("keypress.check_enter_esc")},ad=function(){var aj=$('select[name="regions"] option:selected').val(),al,ai=new x.GenomeRegion({chrom:view.chrom,start:view.low,end:view.high}),ak=ab.map($(".bookmark"),function(am){return new x.GenomeRegion({from_str:$(am).children(".position").text()})});if(aj==="cur"){al=[ai]}else{if(aj==="bookmarks"){al=ak}else{al=[ai].concat(ak)}}hide_modal();window.location.href=galaxy_paths.get("sweepster_url")+"?"+$.param({dataset_id:ac.dataset_id,hda_ldda:ac.hda_ldda,regions:JSON.stringify(new Backbone.Collection(al).toJSON())})},ag=function(ai){if((ai.keyCode||ai.which)===27){ah()}else{if((ai.keyCode||ai.which)===13){ad()}}};show_modal("Visualize tool parameter space and output from different parameter settings?",ae,{No:ah,Yes:ad})}},r.prototype.action_icons_def[2]],can_draw:function(){if(this.dataset_id&&r.prototype.can_draw.call(this)){return true}return false},build_container_div:function(){return $("<div/>").addClass("track").attr("id","track_"+this.id).css("position","relative")},build_header_div:function(){var ac=$("<div class='track-header'/>");if(this.view.editor){this.drag_div=$("<div/>").addClass(this.drag_handle_class).appendTo(ac)}this.name_div=$("<div/>").addClass("track-name").appendTo(ac).text(this.name).attr("id",this.name.replace(/\s+/g,"-").replace(/[^a-zA-Z0-9\-]/g,"").toLowerCase());return ac},on_resize:function(){},add_resize_handle:function(){var ac=this;var af=false;var ae=false;var ad=$("<div class='track-resize'>");$(ac.container_div).hover(function(){if(ac.content_visible){af=true;ad.show()}},function(){af=false;if(!ae){ad.hide()}});ad.hide().bind("dragstart",function(ag,ah){ae=true;ah.original_height=$(ac.content_div).height()}).bind("drag",function(ah,ai){var ag=Math.min(Math.max(ai.original_height+ai.deltaY,ac.min_height_px),ac.max_height_px);$(ac.tiles_div).css("height",ag);ac.visible_height_px=(ac.max_height_px===ag?0:ag);ac.on_resize()}).bind("dragend",function(ag,ah){ac.tile_cache.clear();ae=false;if(!af){ad.hide()}ac.config.values.height=ac.visible_height_px;ac.changed()}).appendTo(ac.container_div)},set_display_modes:function(af,ai){this.display_modes=af;this.mode=(ai?ai:(this.config&&this.config.values.mode?this.config.values.mode:this.display_modes[0]));this.action_icons.mode_icon.attr("title","Set display mode (now: "+this.mode+")");var ad=this,ag={};for(var ae=0,ac=ad.display_modes.length;ae<ac;ae++){var ah=ad.display_modes[ae];ag[ah]=function(aj){return function(){ad.change_mode(aj);ad.icons_div.show();ad.container_div.mouseleave(function(){ad.icons_div.hide()})}}(ah)}make_popupmenu(this.action_icons.mode_icon,ag)},build_action_icons:function(){r.prototype.build_action_icons.call(this,this.action_icons_def);if(this.display_modes!==undefined){this.set_display_modes(this.display_modes)}},hide_contents:function(){this.tiles_div.hide();this.container_div.find(".yaxislabel, .track-resize").hide()},show_contents:function(){this.tiles_div.show();this.container_div.find(".yaxislabel, .track-resize").show();this.request_draw()},get_type:function(){if(this instanceof X){return"LabelTrack"}else{if(this instanceof B){return"ReferenceTrack"}else{if(this instanceof h){return"LineTrack"}else{if(this instanceof T){return"ReadTrack"}else{if(this instanceof R){return"VcfTrack"}else{if(this instanceof f){return"CompositeTrack"}else{if(this instanceof c){return"FeatureTrack"}}}}}}}return""},init:function(ae){var ad=this;ad.enabled=false;ad.tile_cache.clear();ad.data_manager.clear();ad.content_div.css("height","auto");ad.tiles_div.text("").children().remove();ad.container_div.removeClass("nodata error pending");if(!ad.dataset_id){return}var ac=$.Deferred(),af={hda_ldda:ad.hda_ldda,data_type:this.dataset_check_type,chrom:ad.view.chrom,retry:ae};$.getJSON(this.dataset.url(),af,function(ag){if(!ag||ag==="error"||ag.kind==="error"){ad.container_div.addClass("error");ad.tiles_div.text(o);if(ag.message){ad.tiles_div.append($("<a href='javascript:void(0);'></a>").text("View error").click(function(){show_modal("Trackster Error","<pre>"+ag.message+"</pre>",{Close:hide_modal})}));ad.tiles_div.append($("<span/>").text(" "));ad.tiles_div.append($("<a href='javascript:void(0);'></a>").text("Try again").click(function(){ad.init(true)}))}}else{if(ag==="no converter"){ad.container_div.addClass("error");ad.tiles_div.text(J)}else{if(ag==="no data"||(ag.data!==undefined&&(ag.data===null||ag.data.length===0))){ad.container_div.addClass("nodata");ad.tiles_div.text(E)}else{if(ag==="pending"){ad.container_div.addClass("pending");ad.tiles_div.html(v);setTimeout(function(){ad.init()},ad.data_query_wait)}else{if(ag==="data"||ag.status==="data"){if(ag.valid_chroms){ad.valid_chroms=ag.valid_chroms;ad.update_icons()}ad.tiles_div.text(U);if(ad.view.chrom){ad.tiles_div.text("");ad.tiles_div.css("height",ad.visible_height_px+"px");ad.enabled=true;$.when(ad.predraw_init()).done(function(){ac.resolve();ad.container_div.removeClass("nodata error pending");ad.request_draw()})}else{ac.resolve()}}}}}}});this.update_icons();return ac},predraw_init:function(){},get_drawables:function(){return this}});var M=function(ae,ad,af){g.call(this,ae,ad,af);var ac=this;m(ac.container_div,ac.drag_handle_class,".group",ac);this.filters_manager=new i.FiltersManager(this,("filters" in af?af.filters:null));this.data_manager.set("filters_manager",this.filters_manager);this.filters_available=false;this.tool=("tool" in af&&af.tool?new s(this,af.tool,af.tool_state):null);this.tile_cache=new x.Cache(Q);if(this.header_div){this.set_filters_manager(this.filters_manager);if(this.tool){this.dynamic_tool_div=this.tool.parent_div;this.header_div.after(this.dynamic_tool_div)}}this.tiles_div=$("<div/>").addClass("tiles").appendTo(this.content_div);this.overlay_div=$("<div/>").addClass("overlay").appendTo(this.content_div);if(af.mode){this.change_mode(af.mode)}};q(M.prototype,r.prototype,g.prototype,{action_icons_def:g.prototype.action_icons_def.concat([{name:"show_more_rows_icon",title:"To minimize track height, not all feature rows are displayed. Click to display more rows.",css_class:"exclamation",on_click_fn:function(ac){$(".bs-tooltip").remove();ac.slotters[ac.view.resolution_px_b].max_rows*=2;ac.request_draw(true)},hide:true}]),copy:function(ac){var ad=this.to_dict();q(ad,{data_manager:this.data_manager});var ae=new this.constructor(this.view,ac,ad);ae.change_mode(this.mode);ae.enabled=this.enabled;return ae},set_filters_manager:function(ac){this.filters_manager=ac;this.header_div.after(this.filters_manager.parent_div)},to_dict:function(){return{track_type:this.get_type(),name:this.name,hda_ldda:this.hda_ldda,dataset_id:this.dataset_id,prefs:this.prefs,mode:this.mode,filters:this.filters_manager.to_dict(),tool_state:(this.tool?this.tool.state_dict():{})}},change_mode:function(ad){var ac=this;ac.mode=ad;ac.config.values.mode=ad;ac.tile_cache.clear();ac.request_draw();this.action_icons.mode_icon.attr("title","Set display mode (now: "+ac.mode+")");return ac},update_icons:function(){var ac=this;if(ac.filters_available){ac.action_icons.filters_icon.show()}else{ac.action_icons.filters_icon.hide()}if(ac.tool){ac.action_icons.tools_icon.show();ac.action_icons.param_space_viz_icon.show()}else{ac.action_icons.tools_icon.hide();ac.action_icons.param_space_viz_icon.hide()}},_gen_tile_cache_key:function(ad,ae,ac){return ad+"_"+ae+"_"+ac},request_draw:function(ad,ac){this.view.request_redraw(false,ad,ac,this)},before_draw:function(){},_draw:function(ad,an){if(!this.can_draw()){return}var al=this.view.low,ah=this.view.high,aj=ah-al,ae=this.view.container.width(),ap=this.view.resolution_px_b,ag=this.view.resolution_b_px;if(this.is_overview){al=this.view.max_low;ah=this.view.max_high;ag=(view.max_high-view.max_low)/ae;ap=1/ag}this.before_draw();this.tiles_div.children().addClass("remove");var ac=Math.floor(al/(ag*S)),ak=true,ao=[],ai=function(aq){return(aq&&"track" in aq)};while((ac*S*ag)<ah){var am=this.draw_helper(ad,ae,ac,ag,this.tiles_div,ap);if(ai(am)){ao.push(am)}else{ak=false}ac+=1}if(!an){this.tiles_div.children(".remove").removeClass("remove").remove()}var af=this;if(ak){this.tiles_div.children(".remove").remove();af.postdraw_actions(ao,ae,ap,an)}},postdraw_actions:function(ae,af,ah,ac){var ag=false;for(var ad=0;ad<ae.length;ad++){if(ae[ad].has_icons){ag=true;break}}if(ag){for(var ad=0;ad<ae.length;ad++){tile=ae[ad];if(!tile.has_icons){tile.html_elt.css("padding-top",D)}}}},draw_helper:function(ac,ao,au,ar,ah,ai,ap){var an=this,ax=this._gen_tile_cache_key(ao,ai,au),af=this._get_tile_bounds(au,ar);if(!ap){ap={}}var aw=(ac?undefined:an.tile_cache.get_elt(ax));if(aw){an.show_tile(aw,ah,ai);return aw}var al=true;var at=an.data_manager.get_data(af,an.mode,ar,an.data_url_extra_params);if(V(at)){al=false}var aj;if(view.reference_track&&ai>view.canvas_manager.char_width_px){aj=view.reference_track.data_manager.get_data(af,an.mode,ar,view.reference_track.data_url_extra_params);if(V(aj)){al=false}}if(al){q(at,ap.more_tile_data);var ak=an.mode;if(ak==="Auto"){ak=an.get_mode(at);an.update_auto_mode(ak)}var ae=an.view.canvas_manager.new_canvas(),av=af.get("start"),ad=af.get("end"),ao=Math.ceil((ad-av)*ai)+an.left_offset,am=an.get_canvas_height(at,ak,ai,ao);ae.width=ao;ae.height=am;var aq=ae.getContext("2d");aq.translate(this.left_offset,0);var aw=an.draw_tile(at,aq,ak,ar,af,ai,aj);if(aw!==undefined){an.tile_cache.set_elt(ax,aw);an.show_tile(aw,ah,ai)}return aw}var ag=$.Deferred();$.when(at,aj).then(function(){view.request_redraw(false,false,false,an);ag.resolve()});return ag},get_canvas_height:function(ac,ae,af,ad){return this.visible_height_px},draw_tile:function(ac,ad,ah,af,ag,ai,ae){console.log("Warning: TiledTrack.draw_tile() not implemented.")},show_tile:function(ae,ah,ai){var ad=this,ac=ae.html_elt;ae.predisplay_actions();var ag=(ae.low-(this.is_overview?this.view.max_low:this.view.low))*ai;if(this.left_offset){ag-=this.left_offset}ac.css({position:"absolute",top:0,left:ag});if(ac.hasClass("remove")){ac.removeClass("remove")}else{ah.append(ac)}ae.html_elt.height("auto");this.max_height_px=Math.max(this.max_height_px,ae.html_elt.height());ae.html_elt.parent().children().css("height",this.max_height_px+"px");var af=this.max_height_px;if(this.visible_height_px!==0){af=Math.min(this.max_height_px,this.visible_height_px)}this.tiles_div.css("height",af+"px")},_get_tile_bounds:function(ac,ad){var af=Math.floor(ac*S*ad),ag=Math.ceil(S*ad),ae=(af+ag<=this.view.max_high?af+ag:this.view.max_high);return new x.GenomeRegion({chrom:this.view.chrom,start:af,end:ae})},tool_region_and_parameters_str:function(ae){var ac=this,ad=(ae!==undefined?ae.toString():"all");return" - region=["+ad+"], parameters=["+ac.tool.get_param_values().join(", ")+"]"},data_and_mode_compatible:function(ac,ad){return true},can_subset:function(ac){return false},init_for_tool_data:function(){this.data_manager.set("data_type","raw_data");this.data_query_wait=1000;this.dataset_check_type="state";this.normal_postdraw_actions=this.postdraw_actions;this.postdraw_actions=function(ae,af,ah,ac){var ad=this;ad.normal_postdraw_actions(ae,af,ah,ac);ad.dataset_check_type="converted_datasets_state";ad.data_query_wait=K;var ag=new l.ServerStateDeferred({url:ad.dataset_state_url,url_params:{dataset_id:ad.dataset_id,hda_ldda:ad.hda_ldda},interval:ad.data_query_wait,success_fn:function(ai){return ai!=="pending"}});$.when(ag.go()).then(function(){ad.data_manager.set("data_type","data")});ad.postdraw_actions=ad.normal_postdraw_actions}}});var X=function(ad,ac){var ae={resize:false};g.call(this,ad,ac,ae);this.container_div.addClass("label-track")};q(X.prototype,g.prototype,{build_header_div:function(){},init:function(){this.enabled=true},_draw:function(){var ae=this.view,af=ae.high-ae.low,ai=Math.floor(Math.pow(10,Math.floor(Math.log(af)/Math.log(10)))),ac=Math.floor(ae.low/ai)*ai,ag=this.view.container.width(),ad=$("<div style='position: relative; height: 1.3em;'></div>");while(ac<ae.high){var ah=(ac-ae.low)/af*ag;ad.append($("<div class='label'>"+commatize(ac)+"</div>").css({position:"absolute",left:ah-1}));ac+=ai}this.content_div.children(":first").remove();this.content_div.append(ad)}});var f=function(ad,ac,ag){M.call(this,ad,ac,ag);this.drawables=[];this.left_offset=0;if("drawables" in ag){var af;for(var ae=0;ae<ag.drawables.length;ae++){af=ag.drawables[ae];this.drawables[ae]=p(af,ad,null);if(af.left_offset>this.left_offset){this.left_offset=af.left_offset}}this.enabled=true}if(this.drawables.length!==0){this.set_display_modes(this.drawables[0].display_modes,this.drawables[0].mode)}this.update_icons();this.obj_type="CompositeTrack"};q(f.prototype,M.prototype,{action_icons_def:[{name:"composite_icon",title:"Show individual tracks",css_class:"layers-stack",on_click_fn:function(ac){$(".bs-tooltip").remove();ac.show_group()}}].concat(M.prototype.action_icons_def),to_dict:z.prototype.to_dict,add_drawable:z.prototype.add_drawable,unpack_drawables:z.prototype.unpack_drawables,change_mode:function(ac){M.prototype.change_mode.call(this,ac);for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad].change_mode(ac)}},init:function(){var ae=[];for(var ad=0;ad<this.drawables.length;ad++){ae.push(this.drawables[ad].init())}var ac=this;$.when.apply($,ae).then(function(){ac.enabled=true;ac.request_draw()})},update_icons:function(){this.action_icons.filters_icon.hide();this.action_icons.tools_icon.hide();this.action_icons.param_space_viz_icon.hide()},can_draw:r.prototype.can_draw,draw_helper:function(ad,at,az,aw,ak,am,au){var ar=this,aD=this._gen_tile_cache_key(at,am,az),ah=this._get_tile_bounds(az,aw);if(!au){au={}}var aC=(ad?undefined:ar.tile_cache.get_elt(aD));if(aC){ar.show_tile(aC,ak,am);return aC}var al=[],ar,ap=true,ax,an;for(var ay=0;ay<this.drawables.length;ay++){ar=this.drawables[ay];ax=ar.data_manager.get_data(ah,ar.mode,aw,ar.data_url_extra_params);if(V(ax)){ap=false}al.push(ax);an=null;if(view.reference_track&&am>view.canvas_manager.char_width_px){an=view.reference_track.data_manager.get_data(ah,ar.mode,aw,view.reference_track.data_url_extra_params);if(V(an)){ap=false}}al.push(an)}if(ap){q(ax,au.more_tile_data);this.tile_predraw_init();var ag=ar.view.canvas_manager.new_canvas(),ai=ar._get_tile_bounds(az,aw),aA=ah.get("start"),ae=ah.get("end"),aB=0,at=Math.ceil((ae-aA)*am)+this.left_offset,aq=0,af=[],ay;var ac=0;for(ay=0;ay<this.drawables.length;ay++,aB+=2){ar=this.drawables[ay];ax=al[aB];var ao=ar.mode;if(ao==="Auto"){ao=ar.get_mode(ax);ar.update_auto_mode(ao)}af.push(ao);ac=ar.get_canvas_height(ax,ao,am,at);if(ac>aq){aq=ac}}ag.width=at;ag.height=(au.height?au.height:aq);aB=0;var av=ag.getContext("2d");av.translate(this.left_offset,0);av.globalAlpha=0.5;av.globalCompositeOperation="source-over";for(ay=0;ay<this.drawables.length;ay++,aB+=2){ar=this.drawables[ay];ax=al[aB];an=al[aB+1];aC=ar.draw_tile(ax,av,af[ay],aw,ah,am,an)}this.tile_cache.set_elt(aD,aC);this.show_tile(aC,ak,am);return aC}var aj=$.Deferred(),ar=this;$.when.apply($,al).then(function(){view.request_redraw(false,false,false,ar);aj.resolve()});return aj},show_group:function(){var af=new P(this.view,this.container,{name:this.name}),ac;for(var ae=0;ae<this.drawables.length;ae++){ac=this.drawables[ae];ac.update_icons();af.add_drawable(ac);ac.container=af;af.content_div.append(ac.container_div)}var ad=this.container.replace_drawable(this,af,true);af.request_draw()},tile_predraw_init:function(){var af=Number.MAX_VALUE,ac=-af,ad;for(var ae=0;ae<this.drawables.length;ae++){ad=this.drawables[ae];if(ad instanceof h){if(ad.prefs.min_value<af){af=ad.prefs.min_value}if(ad.prefs.max_value>ac){ac=ad.prefs.max_value}}}for(var ae=0;ae<this.drawables.length;ae++){ad=this.drawables[ae];ad.prefs.min_value=af;ad.prefs.max_value=ac}},postdraw_actions:function(ae,ah,aj,ad){M.prototype.postdraw_actions.call(this,ae,ah,aj,ad);var ag=-1;for(var af=0;af<ae.length;af++){var ac=ae[af].html_elt.find("canvas").height();if(ac>ag){ag=ac}}for(var af=0;af<ae.length;af++){var ai=ae[af];if(ai.html_elt.find("canvas").height()!==ag){this.draw_helper(true,ah,ai.index,ai.resolution,ai.html_elt.parent(),aj,{height:ag});ai.html_elt.remove()}}}});var B=function(ac){M.call(this,ac,{content_div:ac.top_labeltrack},{resize:false});ac.reference_track=this;this.left_offset=200;this.visible_height_px=12;this.container_div.addClass("reference-track");this.content_div.css("background","none");this.content_div.css("min-height","0px");this.content_div.css("border","none");this.data_url=reference_url+"/"+this.view.dbkey;this.data_url_extra_params={reference:true};this.data_manager=new x.ReferenceTrackDataManager({data_url:this.data_url});this.hide_contents()};q(B.prototype,r.prototype,M.prototype,{build_header_div:function(){},init:function(){this.data_manager.clear();this.enabled=true},can_draw:r.prototype.can_draw,draw_helper:function(ag,ae,ac,ad,ah,ai,af){if(ai>this.view.canvas_manager.char_width_px){return M.prototype.draw_helper.call(this,ag,ae,ac,ad,ah,ai,af)}else{this.hide_contents();return null}},draw_tile:function(ak,al,ag,af,ai,am){var ae=this;if(am>this.view.canvas_manager.char_width_px){if(ak.data===null){this.hide_contents();return}var ad=al.canvas;al.font=al.canvas.manager.default_font;al.textAlign="center";ak=ak.data;for(var ah=0,aj=ak.length;ah<aj;ah++){var ac=Math.floor(ah*am);al.fillText(ak[ah],ac,10)}this.show_contents();return new b(ae,ai,af,ad,ak)}this.hide_contents()}});var h=function(ae,ad,af){var ac=this;this.display_modes=["Histogram","Line","Filled","Intensity"];this.mode="Histogram";M.call(this,ae,ad,af);this.hda_ldda=af.hda_ldda;this.dataset_id=af.dataset_id;this.original_dataset_id=this.dataset_id;this.left_offset=0;this.config=new F({track:this,params:[{key:"name",label:"Name",type:"text",default_value:this.name},{key:"color",label:"Color",type:"color",default_value:l.get_random_color()},{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:32,hidden:true}],saved_values:af.prefs,onchange:function(){ac.set_name(ac.prefs.name);ac.vertical_range=ac.prefs.max_value-ac.prefs.min_value;ac.set_min_value(ac.prefs.min_value);ac.set_max_value(ac.prefs.max_value)}});this.prefs=this.config.values;this.visible_height_px=this.config.values.height;this.vertical_range=this.config.values.max_value-this.config.values.min_value};q(h.prototype,r.prototype,M.prototype,{on_resize:function(){this.request_draw(true)},set_min_value:function(ac){this.prefs.min_value=ac;$("#linetrack_"+this.dataset_id+"_minval").text(this.prefs.min_value);this.tile_cache.clear();this.request_draw()},set_max_value:function(ac){this.prefs.max_value=ac;$("#linetrack_"+this.dataset_id+"_maxval").text(this.prefs.max_value);this.tile_cache.clear();this.request_draw()},predraw_init:function(){var ac=this;ac.vertical_range=undefined;return $.getJSON(ac.dataset.url(),{data_type:"data",stats:true,chrom:ac.view.chrom,low:0,high:ac.view.max_high,hda_ldda:ac.hda_ldda},function(ad){ac.container_div.addClass("line-track");var ag=ad.data;if(isNaN(parseFloat(ac.prefs.min_value))||isNaN(parseFloat(ac.prefs.max_value))){var ae=ag.min,ai=ag.max;ae=Math.floor(Math.min(0,Math.max(ae,ag.mean-2*ag.sd)));ai=Math.ceil(Math.max(0,Math.min(ai,ag.mean+2*ag.sd)));ac.prefs.min_value=ae;ac.prefs.max_value=ai;$("#track_"+ac.dataset_id+"_minval").val(ac.prefs.min_value);$("#track_"+ac.dataset_id+"_maxval").val(ac.prefs.max_value)}ac.vertical_range=ac.prefs.max_value-ac.prefs.min_value;ac.total_frequency=ag.total_frequency;ac.container_div.find(".yaxislabel").remove();var ah=$("<div/>").text(W(ac.prefs.min_value,3)).make_text_editable({num_cols:6,on_finish:function(aj){$(".bs-tooltip").remove();var aj=parseFloat(aj);if(!isNaN(aj)){ac.set_min_value(aj)}},help_text:"Set min value"}).addClass("yaxislabel bottom").attr("id","linetrack_"+ac.dataset_id+"_minval").prependTo(ac.container_div),af=$("<div/>").text(W(ac.prefs.max_value,3)).make_text_editable({num_cols:6,on_finish:function(aj){$(".bs-tooltip").remove();var aj=parseFloat(aj);if(!isNaN(aj)){ac.set_max_value(aj)}},help_text:"Set max value"}).addClass("yaxislabel top").attr("id","linetrack_"+ac.dataset_id+"_maxval").prependTo(ac.container_div)})},draw_tile:function(al,aj,ae,ad,ag,ak){var ac=aj.canvas,af=ag.get("start"),ai=ag.get("end"),ah=new L.LinePainter(al.data,af,ai,this.prefs,ae);ah.draw(aj,ac.width,ac.height,ak);return new b(this,ag,ad,ac,al.data)},can_subset:function(ac){return false}});var t=function(ae,ad,af){var ac=this;this.display_modes=["Heatmap"];this.mode="Heatmap";M.call(this,ae,ad,af);this.hda_ldda=af.hda_ldda;this.dataset_id=af.dataset_id;this.original_dataset_id=this.dataset_id;this.left_offset=0;this.config=new F({track:this,params:[{key:"name",label:"Name",type:"text",default_value:this.name},{key:"pos_color",label:"Positive Color",type:"color",default_value:"#FF8C00"},{key:"neg_color",label:"Negative Color",type:"color",default_value:"#4169E1"},{key:"min_value",label:"Min Value",type:"float",default_value:-1},{key:"max_value",label:"Max Value",type:"float",default_value:1},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:500,hidden:true}],saved_values:af.prefs,onchange:function(){ac.set_name(ac.prefs.name);ac.vertical_range=ac.prefs.max_value-ac.prefs.min_value;ac.set_min_value(ac.prefs.min_value);ac.set_max_value(ac.prefs.max_value)}});this.prefs=this.config.values;this.visible_height_px=this.config.values.height;this.vertical_range=this.config.values.max_value-this.config.values.min_value};q(t.prototype,r.prototype,M.prototype,{on_resize:function(){this.request_draw(true)},set_min_value:function(ac){this.prefs.min_value=ac;this.tile_cache.clear();this.request_draw()},set_max_value:function(ac){this.prefs.max_value=ac;this.tile_cache.clear();this.request_draw()},draw_tile:function(ac,ae,ai,ag,ah,aj){var af=ae.canvas,ad=new L.DiagonalHeatmapPainter(ac.data,ah.get("start"),ah.get("end"),this.prefs,ai);ad.draw(ae,af.width,af.height,aj);return new b(this,ah,ag,af,ac.data)}});var c=function(af,ae,ah){var ad=this;this.display_modes=["Auto","Coverage","Dense","Squish","Pack"];M.call(this,af,ae,ah);var ag=l.get_random_color(),ac=l.get_random_color([ag,"#FFFFFF"]);this.config=new F({track:this,params:[{key:"name",label:"Name",type:"text",default_value:this.name},{key:"block_color",label:"Block color",type:"color",default_value:ag},{key:"reverse_strand_color",label:"Antisense strand color",type:"color",default_value:ac},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true,help:"Show the number of items in each bin when drawing summary histogram"},{key:"histogram_max",label:"Histogram maximum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"connector_style",label:"Connector style",type:"select",default_value:"fishbones",options:[{label:"Line with arrows",value:"fishbone"},{label:"Arcs",value:"arcs"}]},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:this.visible_height_px,hidden:true}],saved_values:ah.prefs,onchange:function(){ad.set_name(ad.prefs.name);ad.tile_cache.clear();ad.set_painter_from_config();ad.request_draw()}});this.prefs=this.config.values;this.visible_height_px=this.config.values.height;this.container_div.addClass("feature-track");this.hda_ldda=ah.hda_ldda;this.dataset_id=ah.dataset_id;this.original_dataset_id=ah.dataset_id;this.show_labels_scale=0.001;this.showing_details=false;this.summary_draw_height=30;this.slotters={};this.start_end_dct={};this.left_offset=200;this.set_painter_from_config()};q(c.prototype,r.prototype,M.prototype,{set_dataset:function(ac){this.dataset_id=ac.get("id");this.hda_ldda=ac.get("hda_ldda");this.dataset=ac;this.data_manager.set("dataset",ac)},set_painter_from_config:function(){if(this.config.values.connector_style==="arcs"){this.painter=L.ArcLinkedFeaturePainter}else{this.painter=L.LinkedFeaturePainter}},before_draw:function(){this.max_height_px=0},postdraw_actions:function(ar,am,ah,ag){M.prototype.postdraw_actions.call(this,ar,ag);var al=this,ao;if(al.mode==="Coverage"){var ad=-1;for(ao=0;ao<ar.length;ao++){var an=ar[ao].max_val;if(an>ad){ad=an}}for(ao=0;ao<ar.length;ao++){var au=ar[ao];if(au.max_val!==ad){au.html_elt.remove();al.draw_helper(true,am,au.index,au.resolution,au.html_elt.parent(),ah,{more_tile_data:{max:ad}})}}}if(al.filters_manager){var ai=al.filters_manager.filters;for(var aq=0;aq<ai.length;aq++){ai[aq].update_ui_elt()}var at=false,ac,aj;for(ao=0;ao<ar.length;ao++){if(ar[ao].data.length){ac=ar[ao].data[0];for(var aq=0;aq<ai.length;aq++){aj=ai[aq];if(aj.applies_to(ac)&&aj.min!==aj.max){at=true;break}}}}if(al.filters_available!==at){al.filters_available=at;if(!al.filters_available){al.filters_manager.hide()}al.update_icons()}}this.container_div.find(".yaxislabel").remove();var af=ar[0];if(af instanceof j){var ak=(this.prefs.histogram_max?this.prefs.histogram_max:af.max_val),ae=$("<div/>").text(ak).make_text_editable({num_cols:12,on_finish:function(av){$(".bs-tooltip").remove();var av=parseFloat(av);al.prefs.histogram_max=(!isNaN(av)?av:null);al.tile_cache.clear();al.request_draw()},help_text:"Set max value; leave blank to use default"}).addClass("yaxislabel top").css("color",this.prefs.label_color);this.container_div.prepend(ae)}if(af instanceof O){var ap=true;for(ao=0;ao<ar.length;ao++){if(!ar[ao].all_slotted){ap=false;break}}if(!ap){this.action_icons.show_more_rows_icon.show()}else{this.action_icons.show_more_rows_icon.hide()}}else{this.action_icons.show_more_rows_icon.hide()}},update_auto_mode:function(ac){var ac;if(this.mode==="Auto"){if(ac==="no_detail"){ac="feature spans"}else{if(ac==="summary_tree"){ac="coverage histogram"}}this.action_icons.mode_icon.attr("title","Set display mode (now: Auto/"+ac+")")}},incremental_slots:function(ag,ac,af){var ad=this.view.canvas_manager.dummy_context,ae=this.slotters[ag];if(!ae||(ae.mode!==af)){ae=new (u.FeatureSlotter)(ag,af,A,function(ah){return ad.measureText(ah)});this.slotters[ag]=ae}return ae.slot_features(ac)},get_mode:function(ac){if(ac.dataset_type==="summary_tree"){mode="summary_tree"}else{if(ac.extra_info==="no_detail"||this.is_overview){mode="no_detail"}else{if(this.view.high-this.view.low>I){mode="Squish"}else{mode="Pack"}}}return mode},get_canvas_height:function(ac,ag,ah,ad){if(ag==="summary_tree"||ag==="Coverage"){return this.summary_draw_height}else{var af=this.incremental_slots(ah,ac.data,ag);var ae=new (this.painter)(null,null,null,this.prefs,ag);return Math.max(aa,ae.get_required_height(af,ad))}},draw_tile:function(am,aq,ao,ar,af,aj,ae){var ap=this,ad=aq.canvas,ay=af.get("start"),ac=af.get("end"),ag=this.left_offset;if(ao==="summary_tree"||ao==="Coverage"){var aA=new L.SummaryTreePainter(am,ay,ac,this.prefs);aA.draw(aq,ad.width,ad.height,aj);return new j(ap,af,ar,ad,am.data,am.max)}var ai=[],an=this.slotters[aj].slots;all_slotted=true;if(am.data){var ak=this.filters_manager.filters;for(var at=0,av=am.data.length;at<av;at++){var ah=am.data[at];var au=false;var al;for(var ax=0,aC=ak.length;ax<aC;ax++){al=ak[ax];al.update_attrs(ah);if(!al.keep(ah)){au=true;break}}if(!au){ai.push(ah);if(!(ah[0] in an)){all_slotted=false}}}}var aB=(this.filters_manager.alpha_filter?new C(this.filters_manager.alpha_filter):null);var az=(this.filters_manager.height_filter?new C(this.filters_manager.height_filter):null);var aA=new (this.painter)(ai,ay,ac,this.prefs,ao,aB,az,ae);var aw=null;aq.fillStyle=this.prefs.block_color;aq.font=aq.canvas.manager.default_font;aq.textAlign="right";if(am.data){aw=aA.draw(aq,ad.width,ad.height,aj,an);aw.translation=-ag}return new O(ap,af,ar,ad,am.data,aj,ao,am.message,all_slotted,aw)},data_and_mode_compatible:function(ac,ad){if(ad==="Auto"){return true}else{if(ad==="Coverage"){return ac.dataset_type==="summary_tree"}else{if(ac.extra_info==="no_detail"||ac.dataset_type==="summary_tree"){return false}else{return true}}}},can_subset:function(ac){if(ac.dataset_type==="summary_tree"||ac.message||ac.extra_info==="no_detail"){return false}return true}});var R=function(ad,ac,ae){c.call(this,ad,ac,ae);this.config=new F({track:this,params:[{key:"name",label:"Name",type:"text",default_value:this.name},{key:"block_color",label:"Block color",type:"color",default_value:l.get_random_color()},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true}],saved_values:ae.prefs,onchange:function(){this.track.set_name(this.track.prefs.name);this.track.tile_cache.clear();this.track.request_draw()}});this.prefs=this.config.values;this.painter=L.ReadPainter};q(R.prototype,r.prototype,M.prototype,c.prototype);var T=function(ae,ad,ag){c.call(this,ae,ad,ag);var af=l.get_random_color(),ac=l.get_random_color([af,"#ffffff"]);this.config=new F({track:this,params:[{key:"name",label:"Name",type:"text",default_value:this.name},{key:"block_color",label:"Block and sense strand color",type:"color",default_value:af},{key:"reverse_strand_color",label:"Antisense strand color",type:"color",default_value:ac},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_differences",label:"Show differences only",type:"bool",default_value:true},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"histogram_max",label:"Histogram maximum",type:"float",default_value:null,help:"Clear value to set automatically"},{key:"mode",type:"string",default_value:this.mode,hidden:true}],saved_values:ag.prefs,onchange:function(){this.track.set_name(this.track.prefs.name);this.track.tile_cache.clear();this.track.request_draw()}});this.prefs=this.config.values;this.painter=L.ReadPainter;this.update_icons()};q(T.prototype,r.prototype,M.prototype,c.prototype);var d={LineTrack:h,FeatureTrack:c,VcfTrack:R,ReadTrack:T,DiagonalHeatmapTrack:t,CompositeTrack:f,DrawableGroup:P};var p=function(ae,ad,ac){if("copy" in ae){return ae.copy(ac)}else{var af=ae.obj_type;if(!af){af=ae.track_type}return new d[af](ad,ac,ae)}};return{TracksterView:Z,DrawableGroup:P,LineTrack:h,FeatureTrack:c,DiagonalHeatmapTrack:t,ReadTrack:T,VcfTrack:R,CompositeTrack:f,object_from_template:p}});
\ No newline at end of file
+define(["libs/underscore","viz/visualization","viz/trackster/util","viz/trackster/slotting","viz/trackster/painters","mvc/data","viz/trackster/filters"],function(ab,x,l,u,L,Y,i){var q=ab.extend;var V=function(ac){return("isResolved" in ac)};var n={};var k=function(ac,ad){n[ac.attr("id")]=ad};var m=function(ac,ae,ag,af){ag=".group";var ad={};n[ac.attr("id")]=af;ac.bind("drag",{handle:"."+ae,relative:true},function(ao,ap){var an=$(this),at=$(this).parent(),ak=at.children(),am=n[$(this).attr("id")],aj,ai,aq,ah,al;ai=$(this).parents(ag);if(ai.length!==0){aq=ai.position().top;ah=aq+ai.outerHeight();if(ap.offsetY<aq){$(this).insertBefore(ai);var ar=n[ai.attr("id")];ar.remove_drawable(am);ar.container.add_drawable_before(am,ar);return}else{if(ap.offsetY>ah){$(this).insertAfter(ai);var ar=n[ai.attr("id")];ar.remove_drawable(am);ar.container.add_drawable(am);return}}}ai=null;for(al=0;al<ak.length;al++){aj=$(ak.get(al));aq=aj.position().top;ah=aq+aj.outerHeight();if(aj.is(ag)&&this!==aj.get(0)&&ap.offsetY>=aq&&ap.offsetY<=ah){if(ap.offsetY-aq<ah-ap.offsetY){aj.find(".content-div").prepend(this)}else{aj.find(".content-div").append(this)}if(am.container){am.container.remove_drawable(am)}n[aj.attr("id")].add_drawable(am);return}}for(al=0;al<ak.length;al++){aj=$(ak.get(al));if(ap.offsetY<aj.position().top&&!(aj.hasClass("reference-track")||aj.hasClass("intro"))){break}}if(al===ak.length){if(this!==ak.get(al-1)){at.append(this);n[at.attr("id")].move_drawable(am,al)}}else{if(this!==ak.get(al)){$(this).insertBefore(ak.get(al));n[at.attr("id")].move_drawable(am,(ap.deltaY>0?al-1:al))}}}).bind("dragstart",function(){ad["border-top"]=ac.css("border-top");ad["border-bottom"]=ac.css("border-bottom");$(this).css({"border-top":"1px solid blue","border-bottom":"1px solid blue"})}).bind("dragend",function(){$(this).css(ad)})};var aa=16,G=9,D=20,A=100,I=12000,S=400,K=5000,w=100,o="Cannot display dataset due to an error. ",J="A converter for this dataset is not installed. Please check your datatypes_conf.xml file.",E="No data for this chrom/contig.",v="Preparing data. This can take a while for a large dataset. If the visualization is saved and closed, preparation will continue in the background.",y="Tool cannot be rerun: ",a="Loading data...",U="Ready for display",Q=10,H=20;function W(ad,ac){if(!ac){ac=0}var ae=Math.pow(10,ac);return Math.round(ad*ae)/ae}var r=function(ad,ac,af){if(!r.id_counter){r.id_counter=0}this.id=r.id_counter++;this.name=af.name;this.view=ad;this.container=ac;this.config=new F({track:this,params:[{key:"name",label:"Name",type:"text",default_value:this.name}],saved_values:af.prefs,onchange:function(){this.track.set_name(this.track.config.values.name)}});this.prefs=this.config.values;this.drag_handle_class=af.drag_handle_class;this.is_overview=false;this.action_icons={};this.content_visible=true;this.container_div=this.build_container_div();this.header_div=this.build_header_div();if(this.header_div){this.container_div.append(this.header_div);this.icons_div=$("<div/>").css("float","left").hide().appendTo(this.header_div);this.build_action_icons(this.action_icons_def);this.header_div.append($("<div style='clear: both'/>"));this.header_div.dblclick(function(ag){ag.stopPropagation()});var ae=this;this.container_div.hover(function(){ae.icons_div.show()},function(){ae.icons_div.hide()});$("<div style='clear: both'/>").appendTo(this.container_div)}};r.prototype.action_icons_def=[{name:"toggle_icon",title:"Hide/show content",css_class:"toggle",on_click_fn:function(ac){if(ac.content_visible){ac.action_icons.toggle_icon.addClass("toggle-expand").removeClass("toggle");ac.hide_contents();ac.content_visible=false}else{ac.action_icons.toggle_icon.addClass("toggle").removeClass("toggle-expand");ac.content_visible=true;ac.show_contents()}}},{name:"settings_icon",title:"Edit settings",css_class:"settings-icon",on_click_fn:function(ad){var af=function(){hide_modal();$(window).unbind("keypress.check_enter_esc")},ac=function(){ad.config.update_from_form($(".dialog-box"));hide_modal();$(window).unbind("keypress.check_enter_esc")},ae=function(ag){if((ag.keyCode||ag.which)===27){af()}else{if((ag.keyCode||ag.which)===13){ac()}}};$(window).bind("keypress.check_enter_esc",ae);show_modal("Configure",ad.config.build_form(),{Cancel:af,OK:ac})}},{name:"remove_icon",title:"Remove",css_class:"remove-icon",on_click_fn:function(ac){$(".bs-tooltip").remove();ac.remove()}}];q(r.prototype,{init:function(){},changed:function(){this.view.changed()},can_draw:function(){if(this.enabled&&this.content_visible){return true}return false},request_draw:function(){},_draw:function(){},to_dict:function(){},set_name:function(ac){this.old_name=this.name;this.name=ac;this.name_div.text(this.name)},revert_name:function(){if(this.old_name){this.name=this.old_name;this.name_div.text(this.name)}},remove:function(){this.changed();this.container.remove_drawable(this);var ac=this.view;this.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})},build_container_div:function(){},build_header_div:function(){},add_action_icon:function(ad,ai,ah,ag,ac,af){var ae=this;this.action_icons[ad]=$("<a/>").attr("href","javascript:void(0);").attr("title",ai).addClass("icon-button").addClass(ah).tooltip().click(function(){ag(ae)}).appendTo(this.icons_div);if(af){this.action_icons[ad].hide()}},build_action_icons:function(ac){var ae;for(var ad=0;ad<ac.length;ad++){ae=ac[ad];this.add_action_icon(ae.name,ae.title,ae.css_class,ae.on_click_fn,ae.prepend,ae.hide)}},update_icons:function(){},hide_contents:function(){},show_contents:function(){},get_drawables:function(){}});var z=function(ad,ac,ae){r.call(this,ad,ac,ae);this.obj_type=ae.obj_type;this.drawables=[]};q(z.prototype,r.prototype,{unpack_drawables:function(ae){this.drawables=[];var ad;for(var ac=0;ac<ae.length;ac++){ad=p(ae[ac],this.view,this);this.add_drawable(ad)}},init:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].init()}},_draw:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac]._draw()}},to_dict:function(){var ad=[];for(var ac=0;ac<this.drawables.length;ac++){ad.push(this.drawables[ac].to_dict())}return{name:this.name,prefs:this.prefs,obj_type:this.obj_type,drawables:ad}},add_drawable:function(ac){this.drawables.push(ac);ac.container=this;this.changed()},add_drawable_before:function(ae,ac){this.changed();var ad=this.drawables.indexOf(ac);if(ad!==-1){this.drawables.splice(ad,0,ae);return true}return false},replace_drawable:function(ae,ac,ad){var af=this.drawables.indexOf(ae);if(af!==-1){this.drawables[af]=ac;if(ad){ae.container_div.replaceWith(ac.container_div)}this.changed()}return af},remove_drawable:function(ad){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);ad.container=null;this.changed();return true}return false},move_drawable:function(ad,ae){var ac=this.drawables.indexOf(ad);if(ac!==-1){this.drawables.splice(ac,1);this.drawables.splice(ae,0,ad);this.changed();return true}return false},get_drawables:function(){return this.drawables}});var P=function(ad,ac,af){q(af,{obj_type:"DrawableGroup",drag_handle_class:"group-handle"});z.call(this,ad,ac,af);this.content_div=$("<div/>").addClass("content-div").attr("id","group_"+this.id+"_content_div").appendTo(this.container_div);k(this.container_div,this);k(this.content_div,this);m(this.container_div,this.drag_handle_class,".group",this);this.filters_manager=new i.FiltersManager(this);this.header_div.after(this.filters_manager.parent_div);this.saved_filters_managers=[];if("drawables" in af){this.unpack_drawables(af.drawables)}if("filters" in af){var ae=this.filters_manager;this.filters_manager=new i.FiltersManager(this,af.filters);ae.parent_div.replaceWith(this.filters_manager.parent_div);if(af.filters.visible){this.setup_multitrack_filtering()}}};q(P.prototype,r.prototype,z.prototype,{action_icons_def:[r.prototype.action_icons_def[0],r.prototype.action_icons_def[1],{name:"composite_icon",title:"Show composite track",css_class:"layers-stack",on_click_fn:function(ac){$(".bs-tooltip").remove();ac.show_composite_track()}},{name:"filters_icon",title:"Filters",css_class:"filters-icon",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters();ac._restore_filter_managers()}else{ac.setup_multitrack_filtering();ac.request_draw(true)}ac.filters_manager.toggle()}},r.prototype.action_icons_def[2]],build_container_div:function(){var ac=$("<div/>").addClass("group").attr("id","group_"+this.id);if(this.container){this.container.content_div.append(ac)}return ac},build_header_div:function(){var ac=$("<div/>").addClass("track-header");ac.append($("<div/>").addClass(this.drag_handle_class));this.name_div=$("<div/>").addClass("track-name").text(this.name).appendTo(ac);return ac},hide_contents:function(){this.tiles_div.hide()},show_contents:function(){this.tiles_div.show();this.request_draw()},update_icons:function(){var ae=this.drawables.length;if(ae===0){this.action_icons.composite_icon.hide();this.action_icons.filters_icon.hide()}else{if(ae===1){if(this.drawables[0] instanceof f){this.action_icons.composite_icon.show()}this.action_icons.filters_icon.hide()}else{var al,ak,ai,ao=true,ag=this.drawables[0].get_type(),ac=0;for(al=0;al<ae;al++){ai=this.drawables[al];if(ai.get_type()!==ag){can_composite=false;break}if(ai instanceof c){ac++}}if(ao||ac===1){this.action_icons.composite_icon.show()}else{this.action_icons.composite_icon.hide();$(".bs-tooltip").remove()}if(ac>1&&ac===this.drawables.length){var ap={},ad;ai=this.drawables[0];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];ap[ad.name]=[ad]}for(al=1;al<this.drawables.length;al++){ai=this.drawables[al];for(ak=0;ak<ai.filters_manager.filters.length;ak++){ad=ai.filters_manager.filters[ak];if(ad.name in ap){ap[ad.name].push(ad)}}}this.filters_manager.remove_all();var af,ah,aj,am;for(var an in ap){af=ap[an];if(af.length===ac){ah=new i.NumberFilter({name:af[0].name,index:af[0].index});this.filters_manager.add_filter(ah)}}if(this.filters_manager.filters.length>0){this.action_icons.filters_icon.show()}else{this.action_icons.filters_icon.hide()}}else{this.action_icons.filters_icon.hide()}}}},_restore_filter_managers:function(){for(var ac=0;ac<this.drawables.length;ac++){this.drawables[ac].filters_manager=this.saved_filters_managers[ac]}this.saved_filters_managers=[]},setup_multitrack_filtering:function(){if(this.filters_manager.filters.length>0){this.saved_filters_managers=[];for(var ac=0;ac<this.drawables.length;ac++){drawable=this.drawables[ac];this.saved_filters_managers.push(drawable.filters_manager);drawable.filters_manager=this.filters_manager}}this.filters_manager.init_filters()},show_composite_track:function(){var ag=[];for(var ad=0;ad<this.drawables.length;ad++){ag.push(this.drawables[ad].name)}var ae="Composite Track of "+this.drawables.length+" tracks ("+ag.join(", ")+")";var af=new f(this.view,this.view,{name:ae,drawables:this.drawables});var ac=this.container.replace_drawable(this,af,true);af.request_draw()},add_drawable:function(ac){z.prototype.add_drawable.call(this,ac);this.update_icons()},remove_drawable:function(ac){z.prototype.remove_drawable.call(this,ac);this.update_icons()},to_dict:function(){if(this.filters_manager.visible()){this._restore_filter_managers()}var ac=q(z.prototype.to_dict.call(this),{filters:this.filters_manager.to_dict()});if(this.filters_manager.visible()){this.setup_multitrack_filtering()}return ac},request_draw:function(ac,ae){for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad].request_draw(ac,ae)}}});var Z=Backbone.View.extend({initialize:function(ac){q(ac,{obj_type:"View"});z.call(this,"View",ac.container,ac);this.chrom=null;this.vis_id=ac.vis_id;this.dbkey=ac.dbkey;this.label_tracks=[];this.tracks_to_be_redrawn=[];this.max_low=0;this.max_high=0;this.zoom_factor=3;this.min_separation=30;this.has_changes=false;this.load_chroms_deferred=null;this.render();this.canvas_manager=new x.CanvasManager(this.container.get(0).ownerDocument);this.reset()},render:function(){this.requested_redraw=false;var ae=this.container,ac=this;this.top_container=$("<div/>").addClass("top-container").appendTo(ae);this.browser_content_div=$("<div/>").addClass("content").css("position","relative").appendTo(ae);this.bottom_container=$("<div/>").addClass("bottom-container").appendTo(ae);this.top_labeltrack=$("<div/>").addClass("top-labeltrack").appendTo(this.top_container);this.viewport_container=$("<div/>").addClass("viewport-container").attr("id","viewport-container").appendTo(this.browser_content_div);this.content_div=this.viewport_container;k(this.viewport_container,ac);this.intro_div=$("<div/>").addClass("intro").appendTo(this.viewport_container).hide();var af=$("<div/>").text("Add Datasets to Visualization").addClass("action-button").appendTo(this.intro_div).click(function(){x.select_datasets(select_datasets_url,add_track_async_url,{"f-dbkey":ac.dbkey},function(ag){ab.each(ag,function(ah){ac.add_drawable(p(ah,ac,ac))})})});this.nav_labeltrack=$("<div/>").addClass("nav-labeltrack").appendTo(this.bottom_container);this.nav_container=$("<div/>").addClass("trackster-nav-container").prependTo(this.top_container);this.nav=$("<div/>").addClass("trackster-nav").appendTo(this.nav_container);this.overview=$("<div/>").addClass("overview").appendTo(this.bottom_container);this.overview_viewport=$("<div/>").addClass("overview-viewport").appendTo(this.overview);this.overview_close=$("<a/>").attr("href","javascript:void(0);").attr("title","Close overview").addClass("icon-button overview-close tooltip").hide().appendTo(this.overview_viewport);this.overview_highlight=$("<div/>").addClass("overview-highlight").hide().appendTo(this.overview_viewport);this.overview_box_background=$("<div/>").addClass("overview-boxback").appendTo(this.overview_viewport);this.overview_box=$("<div/>").addClass("overview-box").appendTo(this.overview_viewport);this.default_overview_height=this.overview_box.height();this.nav_controls=$("<div/>").addClass("nav-controls").appendTo(this.nav);this.chrom_select=$("<select/>").attr({name:"chrom"}).css("width","15em").append("<option value=''>Loading</option>").appendTo(this.nav_controls);var ad=function(ag){if(ag.type==="focusout"||(ag.keyCode||ag.which)===13||(ag.keyCode||ag.which)===27){if((ag.keyCode||ag.which)!==27){ac.go_to($(this).val())}$(this).hide();$(this).val("");ac.location_span.show();ac.chrom_select.show()}};this.nav_input=$("<input/>").addClass("nav-input").hide().bind("keyup focusout",ad).appendTo(this.nav_controls);this.location_span=$("<span/>").addClass("location").attr("original-title","Click to change location").tooltip({placement:"bottom"}).appendTo(this.nav_controls);this.location_span.click(function(){ac.location_span.hide();ac.chrom_select.hide();ac.nav_input.val(ac.chrom+":"+ac.low+"-"+ac.high);ac.nav_input.css("display","inline-block");ac.nav_input.select();ac.nav_input.focus();ac.nav_input.autocomplete({source:function(ai,ag){var aj=[],ah=$.map(ac.get_drawables(),function(ak){return ak.data_manager.search_features(ai.term).success(function(al){aj=aj.concat(al)})});$.when.apply($,ah).done(function(){ag($.map(aj,function(ak){return{label:ak[0],value:ak[1]}}))})}})});if(this.vis_id!==undefined){this.hidden_input=$("<input/>").attr("type","hidden").val(this.vis_id).appendTo(this.nav_controls)}this.zo_link=$("<a/>").attr("id","zoom-out").attr("title","Zoom out").tooltip({placement:"bottom"}).click(function(){ac.zoom_out();ac.request_redraw()}).appendTo(this.nav_controls);this.zi_link=$("<a/>").attr("id","zoom-in").attr("title","Zoom in").tooltip({placement:"bottom"}).click(function(){ac.zoom_in();ac.request_redraw()}).appendTo(this.nav_controls);this.load_chroms_deferred=this.load_chroms({low:0});this.chrom_select.bind("change",function(){ac.change_chrom(ac.chrom_select.val())});this.browser_content_div.click(function(ag){$(this).find("input").trigger("blur")});this.browser_content_div.bind("dblclick",function(ag){ac.zoom_in(ag.pageX,this.viewport_container)});this.overview_box.bind("dragstart",function(ag,ah){this.current_x=ah.offsetX}).bind("drag",function(ag,ai){var aj=ai.offsetX-this.current_x;this.current_x=ai.offsetX;var ah=Math.round(aj/ac.viewport_container.width()*(ac.max_high-ac.max_low));ac.move_delta(-ah)});this.overview_close.click(function(){ac.reset_overview()});this.viewport_container.bind("draginit",function(ag,ah){if(ag.clientX>ac.viewport_container.width()-16){return false}}).bind("dragstart",function(ag,ah){ah.original_low=ac.low;ah.current_height=ag.clientY;ah.current_x=ah.offsetX}).bind("drag",function(ai,ak){var ag=$(this);var al=ak.offsetX-ak.current_x;var ah=ag.scrollTop()-(ai.clientY-ak.current_height);ag.scrollTop(ah);ak.current_height=ai.clientY;ak.current_x=ak.offsetX;var aj=Math.round(al/ac.viewport_container.width()*(ac.high-ac.low));ac.move_delta(aj)}).bind("mousewheel",function(ai,ak,ah,ag){if(ah){ah*=50;var aj=Math.round(-ah/ac.viewport_container.width()*(ac.high-ac.low));ac.move_delta(aj)}});this.top_labeltrack.bind("dragstart",function(ag,ah){return $("<div />").css({height:ac.browser_content_div.height()+ac.top_labeltrack.height()+ac.nav_labeltrack.height()+1,top:"0px",position:"absolute","background-color":"#ccf",opacity:0.5,"z-index":1000}).appendTo($(this))}).bind("drag",function(ak,al){$(al.proxy).css({left:Math.min(ak.pageX,al.startX)-ac.container.offset().left,width:Math.abs(ak.pageX-al.startX)});var ah=Math.min(ak.pageX,al.startX)-ac.container.offset().left,ag=Math.max(ak.pageX,al.startX)-ac.container.offset().left,aj=(ac.high-ac.low),ai=ac.viewport_container.width();ac.update_location(Math.round(ah/ai*aj)+ac.low,Math.round(ag/ai*aj)+ac.low)}).bind("dragend",function(al,am){var ah=Math.min(al.pageX,am.startX),ag=Math.max(al.pageX,am.startX),aj=(ac.high-ac.low),ai=ac.viewport_container.width(),ak=ac.low;ac.low=Math.round(ah/ai*aj)+ak;ac.high=Math.round(ag/ai*aj)+ak;$(am.proxy).remove();ac.request_redraw()});this.add_label_track(new X(this,{content_div:this.top_labeltrack}));this.add_label_track(new X(this,{content_div:this.nav_labeltrack}));$(window).bind("resize",function(){if(this.resize_timer){clearTimeout(this.resize_timer)}this.resize_timer=setTimeout(function(){ac.resize_window()},500)});$(document).bind("redraw",function(){ac.redraw()});this.reset();$(window).trigger("resize")}});q(Z.prototype,z.prototype,{changed:function(){this.has_changes=true},update_intro_div:function(){if(this.drawables.length===0){this.intro_div.show()}else{this.intro_div.hide()}},trigger_navigate:function(ad,af,ac,ag){if(this.timer){clearTimeout(this.timer)}if(ag){var ae=this;this.timer=setTimeout(function(){ae.trigger("navigate",ad+":"+af+"-"+ac)},500)}else{view.trigger("navigate",ad+":"+af+"-"+ac)}},update_location:function(ac,ae){this.location_span.text(commatize(ac)+" - "+commatize(ae));this.nav_input.val(this.chrom+":"+commatize(ac)+"-"+commatize(ae));var ad=view.chrom_select.val();if(ad!==""){this.trigger_navigate(ad,view.low,view.high,true)}},load_chroms:function(ae){ae.num=w;var ac=this,ad=$.Deferred();$.ajax({url:chrom_url+"/"+this.dbkey,data:ae,dataType:"json",success:function(ag){if(ag.chrom_info.length===0){return}if(ag.reference){ac.add_label_track(new B(ac))}ac.chrom_data=ag.chrom_info;var aj='<option value="">Select Chrom/Contig</option>';for(var ai=0,af=ac.chrom_data.length;ai<af;ai++){var ah=ac.chrom_data[ai].chrom;aj+='<option value="'+ah+'">'+ah+"</option>"}if(ag.prev_chroms){aj+='<option value="previous">Previous '+w+"</option>"}if(ag.next_chroms){aj+='<option value="next">Next '+w+"</option>"}ac.chrom_select.html(aj);ac.chrom_start_index=ag.start_index;ad.resolve(ag.chrom_info)},error:function(){alert("Could not load chroms for this dbkey:",ac.dbkey)}});return ad},change_chrom:function(ah,ad,aj){var ae=this;if(!ae.chrom_data){ae.load_chroms_deferred.then(function(){ae.change_chrom(ah,ad,aj)});return}if(!ah||ah==="None"){return}if(ah==="previous"){ae.load_chroms({low:this.chrom_start_index-w});return}if(ah==="next"){ae.load_chroms({low:this.chrom_start_index+w});return}var ai=$.grep(ae.chrom_data,function(ak,al){return ak.chrom===ah})[0];if(ai===undefined){ae.load_chroms({chrom:ah},function(){ae.change_chrom(ah,ad,aj)});return}else{if(ah!==ae.chrom){ae.chrom=ah;ae.chrom_select.val(ae.chrom);ae.max_high=ai.len-1;ae.reset();ae.request_redraw(true);for(var ag=0,ac=ae.drawables.length;ag<ac;ag++){var af=ae.drawables[ag];if(af.init){af.init()}}if(ae.reference_track){ae.reference_track.init()}}if(ad!==undefined&&aj!==undefined){ae.low=Math.max(ad,0);ae.high=Math.min(aj,ae.max_high)}else{ae.low=0;ae.high=ae.max_high}ae.reset_overview();ae.request_redraw()}},go_to:function(ag){ag=ag.replace(/ |,/g,"");var ak=this,ac,af,ad=ag.split(":"),ai=ad[0],aj=ad[1];if(aj!==undefined){try{var ah=aj.split("-");ac=parseInt(ah[0],10);af=parseInt(ah[1],10)}catch(ae){return false}}ak.change_chrom(ai,ac,af)},move_fraction:function(ae){var ac=this;var ad=ac.high-ac.low;this.move_delta(ae*ad)},move_delta:function(af){var ac=this;var ae=ac.high-ac.low;if(ac.low-af<ac.max_low){ac.low=ac.max_low;ac.high=ac.max_low+ae}else{if(ac.high-af>ac.max_high){ac.high=ac.max_high;ac.low=ac.max_high-ae}else{ac.high-=af;ac.low-=af}}ac.request_redraw();var ad=ac.chrom_select.val();this.trigger_navigate(ad,ac.low,ac.high,true)},add_drawable:function(ac){z.prototype.add_drawable.call(this,ac);ac.init();this.changed();this.update_intro_div()},add_label_track:function(ac){ac.view=this;ac.init();this.label_tracks.push(ac)},remove_drawable:function(ae,ad){z.prototype.remove_drawable.call(this,ae);if(ad){var ac=this;ae.container_div.hide(0,function(){$(this).remove();ac.update_intro_div()})}},reset:function(){this.low=this.max_low;this.high=this.max_high;this.viewport_container.find(".yaxislabel").remove()},request_redraw:function(ak,ac,aj,al){var ai=this,ah=(al?[al]:ai.drawables),ae;var ad;for(var ag=0;ag<ah.length;ag++){ad=ah[ag];ae=-1;for(var af=0;af<ai.tracks_to_be_redrawn.length;af++){if(ai.tracks_to_be_redrawn[af][0]===ad){ae=af;break}}if(ae<0){ai.tracks_to_be_redrawn.push([ad,ac,aj])}else{ai.tracks_to_be_redrawn[ag][1]=ac;ai.tracks_to_be_redrawn[ag][2]=aj}}if(!this.requested_redraw){requestAnimationFrame(function(){ai._redraw(ak)});this.requested_redraw=true}},_redraw:function(am){this.requested_redraw=false;var aj=this.low,af=this.high;if(aj<this.max_low){aj=this.max_low}if(af>this.max_high){af=this.max_high}var al=this.high-this.low;if(this.high!==0&&al<this.min_separation){af=aj+this.min_separation}this.low=Math.floor(aj);this.high=Math.ceil(af);this.update_location(this.low,this.high);this.resolution_b_px=(this.high-this.low)/this.viewport_container.width();this.resolution_px_b=this.viewport_container.width()/(this.high-this.low);var ac=(this.low/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var ai=((this.high-this.low)/(this.max_high-this.max_low)*this.overview_viewport.width())||0;var an=13;this.overview_box.css({left:ac,width:Math.max(an,ai)}).show();if(ai<an){this.overview_box.css("left",ac-(an-ai)/2)}if(this.overview_highlight){this.overview_highlight.css({left:ac,width:ai})}if(!am){var ae,ad,ak;for(var ag=0,ah=this.tracks_to_be_redrawn.length;ag<ah;ag++){ae=this.tracks_to_be_redrawn[ag][0];ad=this.tracks_to_be_redrawn[ag][1];ak=this.tracks_to_be_redrawn[ag][2];if(ae){ae._draw(ad,ak)}}this.tracks_to_be_redrawn=[];for(ag=0,ah=this.label_tracks.length;ag<ah;ag++){this.label_tracks[ag]._draw()}}},zoom_in:function(ad,ae){if(this.max_high===0||this.high-this.low<=this.min_separation){return}var af=this.high-this.low,ag=af/2+this.low,ac=(af/this.zoom_factor)/2;if(ad){ag=ad/this.viewport_container.width()*(this.high-this.low)+this.low}this.low=Math.round(ag-ac);this.high=Math.round(ag+ac);this.changed();this.request_redraw()},zoom_out:function(){if(this.max_high===0){return}var ad=this.high-this.low,ae=ad/2+this.low,ac=(ad*this.zoom_factor)/2;this.low=Math.round(ae-ac);this.high=Math.round(ae+ac);this.changed();this.request_redraw()},resize_window:function(){this.viewport_container.height(this.container.height()-this.top_container.height()-this.bottom_container.height());this.request_redraw()},set_overview:function(ae){if(this.overview_drawable){if(this.overview_drawable.dataset_id===ae.dataset_id){return}this.overview_viewport.find(".track").remove()}var ad=ae.copy({content_div:this.overview_viewport}),ac=this;ad.header_div.hide();ad.is_overview=true;ac.overview_drawable=ad;this.overview_drawable.postdraw_actions=function(){ac.overview_highlight.show().height(ac.overview_drawable.content_div.height());ac.overview_viewport.height(ac.overview_drawable.content_div.height()+ac.overview_box.outerHeight());ac.overview_close.show();ac.resize_window()};ac.overview_drawable.request_draw();this.changed()},reset_overview:function(){$(".bs-tooltip").remove();this.overview_viewport.find(".track-tile").remove();this.overview_viewport.height(this.default_overview_height);this.overview_box.height(this.default_overview_height);this.overview_close.hide();this.overview_highlight.hide();view.resize_window();view.overview_drawable=null}});var s=function(ae,aj,af){this.track=ae;this.name=aj.name;this.params=[];var aq=aj.params;for(var ag=0;ag<aq.length;ag++){var al=aq[ag],ad=al.name,ap=al.label,ah=unescape(al.html),ar=al.value,an=al.type;if(an==="number"){this.params.push(new e(ad,ap,ah,(ad in af?af[ad]:ar),al.min,al.max))}else{if(an==="select"){this.params.push(new N(ad,ap,ah,(ad in af?af[ad]:ar)))}else{console.log("WARNING: unrecognized tool parameter type:",ad,an)}}}this.parent_div=$("<div/>").addClass("dynamic-tool").hide();this.parent_div.bind("drag",function(au){au.stopPropagation()}).click(function(au){au.stopPropagation()}).bind("dblclick",function(au){au.stopPropagation()});var ao=$("<div class='tool-name'>").appendTo(this.parent_div).text(this.name);var am=this.params;var ak=this;$.each(this.params,function(av,ay){var ax=$("<div>").addClass("param-row").appendTo(ak.parent_div);var au=$("<div>").addClass("param-label").text(ay.label).appendTo(ax);var aw=$("<div/>").addClass("param-input").html(ay.html).appendTo(ax);aw.find(":input").val(ay.value);$("<div style='clear: both;'/>").appendTo(ax)});this.parent_div.find("input").click(function(){$(this).select()});var at=$("<div>").addClass("param-row").appendTo(this.parent_div);var ai=$("<input type='submit'>").attr("value","Run on complete dataset").appendTo(at);var ac=$("<input type='submit'>").attr("value","Run on visible region").css("margin-left","3em").appendTo(at);ac.click(function(){ak.run_on_region()});ai.click(function(){ak.run_on_dataset()});if("visible" in af&&af.visible){this.parent_div.show()}};q(s.prototype,{update_params:function(){for(var ac=0;ac<this.params.length;ac++){this.params[ac].update_value()}},state_dict:function(){var ad={};for(var ac=0;ac<this.params.length;ac++){ad[this.params[ac].name]=this.params[ac].value}ad.visible=this.parent_div.is(":visible");return ad},get_param_values_dict:function(){var ac={};this.parent_div.find(":input").each(function(){var ad=$(this).attr("name"),ae=$(this).val();ac[ad]=ae});return ac},get_param_values:function(){var ac=[];this.parent_div.find(":input").each(function(){var ad=$(this).attr("name"),ae=$(this).val();if(ad){ac[ac.length]=ae}});return ac},run_on_dataset:function(){var ac=this;ac.run({target_dataset_id:this.track.original_dataset_id,tool_id:ac.name},null,function(ad){show_modal(ac.name+" is Running",ac.name+" is running on the complete dataset. Tool outputs are in dataset's history.",{Close:hide_modal})})},run_on_region:function(){var ai=new x.GenomeRegion({chrom:this.track.view.chrom,start:this.track.view.low,end:this.track.view.high}),ad={target_dataset_id:this.track.original_dataset_id,action:"rerun",tool_id:this.name,regions:[ai.toJSON()]},ah=this.track,ae=ad.tool_id+ah.tool_region_and_parameters_str(ai),ac;if(ah.container===view){var ag=new P(view,view,{name:this.name});var af=ah.container.replace_drawable(ah,ag,false);ag.container_div.insertBefore(ah.view.content_div.children()[af]);ag.add_drawable(ah);ah.container_div.appendTo(ag.content_div);ac=ag}else{ac=ah.container}var aj=new ah.constructor(view,ac,{name:ae,hda_ldda:"hda"});aj.init_for_tool_data();aj.change_mode(ah.mode);aj.set_filters_manager(ah.filters_manager.copy(aj));aj.update_icons();ac.add_drawable(aj);aj.tiles_div.text("Starting job.");this.update_params();this.run(ad,aj,function(ak){aj.set_dataset(new Y.Dataset(ak));aj.tiles_div.text("Running job.");aj.init()})},run:function(ac,ae,af){ac.inputs=this.get_param_values_dict();var ad=new l.ServerStateDeferred({ajax_settings:{url:galaxy_paths.get("tool_url"),data:JSON.stringify(ac),dataType:"json",contentType:"application/json",type:"POST"},interval:2000,success_fn:function(ag){return ag!=="pending"}});$.when(ad.go()).then(function(ag){if(ag==="no converter"){ae.container_div.addClass("error");ae.content_div.text(J)}else{if(ag.error){ae.container_div.addClass("error");ae.content_div.text(y+ag.message)}else{af(ag)}}})}});var N=function(ad,ac,ae,af){this.name=ad;this.label=ac;this.html=$(ae);this.value=af};q(N.prototype,{update_value:function(){this.value=$(this.html).val()}});var e=function(ae,ad,ag,ah,af,ac){N.call(this,ae,ad,ag,ah);this.min=af;this.max=ac};q(e.prototype,N.prototype,{update_value:function(){N.prototype.update_value.call(this);this.value=parseFloat(this.value)}});var C=function(ac,ad){L.Scaler.call(this,ad);this.filter=ac};C.prototype.gen_val=function(ac){if(this.filter.high===Number.MAX_VALUE||this.filter.low===-Number.MAX_VALUE||this.filter.low===this.filter.high){return this.default_val}return((parseFloat(ac[this.filter.index])-this.filter.low)/(this.filter.high-this.filter.low))};var F=function(ac){this.track=ac.track;this.params=ac.params;this.values={};this.restore_values((ac.saved_values?ac.saved_values:{}));this.onchange=ac.onchange};q(F.prototype,{restore_values:function(ac){var ad=this;$.each(this.params,function(ae,af){if(ac[af.key]!==undefined){ad.values[af.key]=ac[af.key]}else{ad.values[af.key]=af.default_value}})},build_form:function(){var af=this;var ac=$("<div />");var ae;function ad(ak,ag){for(var ao=0;ao<ak.length;ao++){ae=ak[ao];if(ae.hidden){continue}var ai="param_"+ao;var at=af.values[ae.key];var av=$("<div class='form-row' />").appendTo(ag);av.append($("<label />").attr("for",ai).text(ae.label+":"));if(ae.type==="bool"){av.append($('<input type="checkbox" />').attr("id",ai).attr("name",ai).attr("checked",at))}else{if(ae.type==="text"){av.append($('<input type="text"/>').attr("id",ai).val(at).click(function(){$(this).select()}))}else{if(ae.type==="select"){var aq=$("<select />").attr("id",ai);for(var am=0;am<ae.options.length;am++){$("<option/>").text(ae.options[am].label).attr("value",ae.options[am].value).appendTo(aq)}aq.val(at);av.append(aq)}else{if(ae.type==="color"){var au=$("<div/>").appendTo(av),ap=$("<input />").attr("id",ai).attr("name",ai).val(at).css("float","left").appendTo(au).click(function(ax){$(".bs-tooltip").removeClass("in");var aw=$(this).siblings(".bs-tooltip").addClass("in");aw.css({left:$(this).position().left+$(this).width()+5,top:$(this).position().top-($(aw).height()/2)+($(this).height()/2)}).show();aw.click(function(ay){ay.stopPropagation()});$(document).bind("click.color-picker",function(){aw.hide();$(document).unbind("click.color-picker")});ax.stopPropagation()}),an=$("<a href='javascript:void(0)'/>").addClass("icon-button arrow-circle").appendTo(au).attr("title","Set new random color").tooltip(),ar=$("<div class='bs-tooltip right' style='position: absolute;' />").appendTo(au).hide(),aj=$("<div class='tooltip-inner' style='text-align: inherit'></div>").appendTo(ar),ah=$("<div class='tooltip-arrow'></div>").appendTo(ar),al=$.farbtastic(aj,{width:100,height:100,callback:ap,color:at});au.append($("<div/>").css("clear","both"));(function(aw){an.click(function(){aw.setColor(l.get_random_color())})})(al)}else{av.append($("<input />").attr("id",ai).attr("name",ai).val(at))}}}}if(ae.help){av.append($("<div class='help'/>").text(ae.help))}}}ad(this.params,ac);return ac},update_from_form:function(ac){var ae=this;var ad=false;$.each(this.params,function(af,ah){if(!ah.hidden){var ai="param_"+af;var ag=ac.find("#"+ai).val();if(ah.type==="float"){ag=parseFloat(ag)}else{if(ah.type==="int"){ag=parseInt(ag)}else{if(ah.type==="bool"){ag=ac.find("#"+ai).is(":checked")}}}if(ag!==ae.values[ah.key]){ae.values[ah.key]=ag;ad=true}}});if(ad){this.onchange();this.track.changed()}}});var b=function(ac,ag,ae,ad,af){this.track=ac;this.region=ag;this.low=ag.get("start");this.high=ag.get("end");this.resolution=ae;this.html_elt=$("<div class='track-tile'/>").append(ad).height($(ad).attr("height"));this.data=af;this.stale=false};b.prototype.predisplay_actions=function(){};var j=function(ac,ah,ae,ad,af,ag){b.call(this,ac,ah,ae,ad,af);this.max_val=ag};q(j.prototype,b.prototype);var O=function(af,an,ag,ae,ai,ap,aj,aq,ad,am){b.call(this,af,an,ag,ae,ai);this.mode=aj;this.all_slotted=ad;this.feature_mapper=am;this.has_icons=false;if(aq){this.has_icons=true;var ak=this;ae=this.html_elt.children()[0],message_div=$("<div/>").addClass("tile-message").css({height:D-1,width:ae.width}).prependTo(this.html_elt);var al=new x.GenomeRegion({chrom:af.view.chrom,start:this.low,end:this.high}),ao=ai.length,ah=$("<a href='javascript:void(0);'/>").addClass("icon more-down").attr("title","For speed, only the first "+ao+" features in this region were obtained from server. Click to get more data including depth").tooltip().appendTo(message_div),ac=$("<a href='javascript:void(0);'/>").addClass("icon more-across").attr("title","For speed, only the first "+ao+" features in this region were obtained from server. Click to get more data excluding depth").tooltip().appendTo(message_div);ah.click(function(){ak.stale=true;af.data_manager.get_more_data(al,af.mode,ak.resolution,{},af.data_manager.DEEP_DATA_REQ);$(".bs-tooltip").hide();af.request_draw(true)}).dblclick(function(ar){ar.stopPropagation()});ac.click(function(){ak.stale=true;af.data_manager.get_more_data(al,af.mode,ak.resolution,{},af.data_manager.BROAD_DATA_REQ);$(".bs-tooltip").hide();af.request_draw(true)}).dblclick(function(ar){ar.stopPropagation()})}};q(O.prototype,b.prototype);O.prototype.predisplay_actions=function(){var ad=this,ac={};if(ad.mode!=="Pack"){return}$(this.html_elt).hover(function(){this.hovered=true;$(this).mousemove()},function(){this.hovered=false;$(this).parents(".track-content").children(".overlay").children(".feature-popup").remove()}).mousemove(function(ao){if(!this.hovered){return}var aj=$(this).offset(),an=ao.pageX-aj.left,am=ao.pageY-aj.top,at=ad.feature_mapper.get_feature_data(an,am),ak=(at?at[0]:null);$(this).parents(".track-content").children(".overlay").children(".feature-popup").each(function(){if(!ak||$(this).attr("id")!==ak.toString()){$(this).remove()}});if(at){var af=ac[ak];if(!af){var ak=at[0],ap={name:at[3],start:at[1],end:at[2],strand:at[4]},ai=ad.track.filters_manager.filters,ah;for(var al=0;al<ai.length;al++){ah=ai[al];ap[ah.name]=at[ah.index]}var af=$("<div/>").attr("id",ak).addClass("feature-popup"),au=$("<table/>"),ar,aq,av;for(ar in ap){aq=ap[ar];av=$("<tr/>").appendTo(au);$("<th/>").appendTo(av).text(ar);$("<td/>").attr("align","left").appendTo(av).text(typeof(aq)==="number"?W(aq,2):aq)}af.append($("<div class='feature-popup-inner'>").append(au));ac[ak]=af}af.appendTo($(this).parents(".track-content").children(".overlay"));var ag=an+parseInt(ad.html_elt.css("left"))-af.width()/2,ae=am+parseInt(ad.html_elt.css("top"))+7;af.css("left",ag+"px").css("top",ae+"px")}else{if(!ao.isPropagationStopped()){ao.stopPropagation();$(this).siblings().each(function(){$(this).trigger(ao)})}}}).mouseleave(function(){$(this).parents(".track-content").children(".overlay").children(".feature-popup").remove()})};var g=function(ad,ac,ae){q(ae,{drag_handle_class:"draghandle"});r.call(this,ad,ac,ae);this.dataset=new Y.Dataset({id:ae.dataset_id,hda_ldda:ae.hda_ldda});this.dataset_check_type="converted_datasets_state";this.data_url_extra_params={};this.data_query_wait=("data_query_wait" in ae?ae.data_query_wait:K);this.data_manager=("data_manager" in ae?ae.data_manager:new x.GenomeDataManager({dataset:this.dataset,data_mode_compatible:this.data_and_mode_compatible,can_subset:this.can_subset}));this.min_height_px=16;this.max_height_px=800;this.visible_height_px=0;this.content_div=$("<div class='track-content'>").appendTo(this.container_div);if(this.container){this.container.content_div.append(this.container_div);if(!("resize" in ae)||ae.resize){this.add_resize_handle()}}};q(g.prototype,r.prototype,{action_icons_def:[{name:"mode_icon",title:"Set display mode",css_class:"chevron-expand",on_click_fn:function(){}},r.prototype.action_icons_def[0],{name:"overview_icon",title:"Set as overview",css_class:"overview-icon",on_click_fn:function(ac){ac.view.set_overview(ac)}},r.prototype.action_icons_def[1],{name:"filters_icon",title:"Filters",css_class:"filters-icon",on_click_fn:function(ac){if(ac.filters_manager.visible()){ac.filters_manager.clear_filters()}else{ac.filters_manager.init_filters()}ac.filters_manager.toggle()}},{name:"tools_icon",title:"Tool",css_class:"hammer",on_click_fn:function(ac){ac.dynamic_tool_div.toggle();if(ac.dynamic_tool_div.is(":visible")){ac.set_name(ac.name+ac.tool_region_and_parameters_str())}else{ac.revert_name()}$(".bs-tooltip").remove()}},{name:"param_space_viz_icon",title:"Tool parameter space visualization",css_class:"arrow-split",on_click_fn:function(ac){var af='<strong>Tool</strong>: <%= track.tool.name %><br/><strong>Dataset</strong>: <%= track.name %><br/><strong>Region(s)</strong>: <select name="regions"><option value="cur">current viewing area</option><option value="bookmarks">bookmarks</option><option value="both">current viewing area and bookmarks</option></select>',ae=ab.template(af,{track:ac});var ah=function(){hide_modal();$(window).unbind("keypress.check_enter_esc")},ad=function(){var aj=$('select[name="regions"] option:selected').val(),al,ai=new x.GenomeRegion({chrom:view.chrom,start:view.low,end:view.high}),ak=ab.map($(".bookmark"),function(am){return new x.GenomeRegion({from_str:$(am).children(".position").text()})});if(aj==="cur"){al=[ai]}else{if(aj==="bookmarks"){al=ak}else{al=[ai].concat(ak)}}hide_modal();window.location.href=galaxy_paths.get("sweepster_url")+"?"+$.param({dataset_id:ac.dataset_id,hda_ldda:ac.hda_ldda,regions:JSON.stringify(new Backbone.Collection(al).toJSON())})},ag=function(ai){if((ai.keyCode||ai.which)===27){ah()}else{if((ai.keyCode||ai.which)===13){ad()}}};show_modal("Visualize tool parameter space and output from different parameter settings?",ae,{No:ah,Yes:ad})}},r.prototype.action_icons_def[2]],can_draw:function(){if(this.dataset_id&&r.prototype.can_draw.call(this)){return true}return false},build_container_div:function(){return $("<div/>").addClass("track").attr("id","track_"+this.id).css("position","relative")},build_header_div:function(){var ac=$("<div class='track-header'/>");if(this.view.editor){this.drag_div=$("<div/>").addClass(this.drag_handle_class).appendTo(ac)}this.name_div=$("<div/>").addClass("track-name").appendTo(ac).text(this.name).attr("id",this.name.replace(/\s+/g,"-").replace(/[^a-zA-Z0-9\-]/g,"").toLowerCase());return ac},on_resize:function(){},add_resize_handle:function(){var ac=this;var af=false;var ae=false;var ad=$("<div class='track-resize'>");$(ac.container_div).hover(function(){if(ac.content_visible){af=true;ad.show()}},function(){af=false;if(!ae){ad.hide()}});ad.hide().bind("dragstart",function(ag,ah){ae=true;ah.original_height=$(ac.content_div).height()}).bind("drag",function(ah,ai){var ag=Math.min(Math.max(ai.original_height+ai.deltaY,ac.min_height_px),ac.max_height_px);$(ac.tiles_div).css("height",ag);ac.visible_height_px=(ac.max_height_px===ag?0:ag);ac.on_resize()}).bind("dragend",function(ag,ah){ac.tile_cache.clear();ae=false;if(!af){ad.hide()}ac.config.values.height=ac.visible_height_px;ac.changed()}).appendTo(ac.container_div)},set_display_modes:function(af,ai){this.display_modes=af;this.mode=(ai?ai:(this.config&&this.config.values.mode?this.config.values.mode:this.display_modes[0]));this.action_icons.mode_icon.attr("title","Set display mode (now: "+this.mode+")");var ad=this,ag={};for(var ae=0,ac=ad.display_modes.length;ae<ac;ae++){var ah=ad.display_modes[ae];ag[ah]=function(aj){return function(){ad.change_mode(aj);ad.icons_div.show();ad.container_div.mouseleave(function(){ad.icons_div.hide()})}}(ah)}make_popupmenu(this.action_icons.mode_icon,ag)},build_action_icons:function(){r.prototype.build_action_icons.call(this,this.action_icons_def);if(this.display_modes!==undefined){this.set_display_modes(this.display_modes)}},hide_contents:function(){this.tiles_div.hide();this.container_div.find(".yaxislabel, .track-resize").hide()},show_contents:function(){this.tiles_div.show();this.container_div.find(".yaxislabel, .track-resize").show();this.request_draw()},get_type:function(){if(this instanceof X){return"LabelTrack"}else{if(this instanceof B){return"ReferenceTrack"}else{if(this instanceof h){return"LineTrack"}else{if(this instanceof T){return"ReadTrack"}else{if(this instanceof R){return"VcfTrack"}else{if(this instanceof f){return"CompositeTrack"}else{if(this instanceof c){return"FeatureTrack"}}}}}}}return""},init:function(ae){var ad=this;ad.enabled=false;ad.tile_cache.clear();ad.data_manager.clear();ad.content_div.css("height","auto");ad.tiles_div.text("").children().remove();ad.container_div.removeClass("nodata error pending");if(!ad.dataset_id){return}var ac=$.Deferred(),af={hda_ldda:ad.hda_ldda,data_type:this.dataset_check_type,chrom:ad.view.chrom,retry:ae};$.getJSON(this.dataset.url(),af,function(ag){if(!ag||ag==="error"||ag.kind==="error"){ad.container_div.addClass("error");ad.tiles_div.text(o);if(ag.message){ad.tiles_div.append($("<a href='javascript:void(0);'></a>").text("View error").click(function(){show_modal("Trackster Error","<pre>"+ag.message+"</pre>",{Close:hide_modal})}));ad.tiles_div.append($("<span/>").text(" "));ad.tiles_div.append($("<a href='javascript:void(0);'></a>").text("Try again").click(function(){ad.init(true)}))}}else{if(ag==="no converter"){ad.container_div.addClass("error");ad.tiles_div.text(J)}else{if(ag==="no data"||(ag.data!==undefined&&(ag.data===null||ag.data.length===0))){ad.container_div.addClass("nodata");ad.tiles_div.text(E)}else{if(ag==="pending"){ad.container_div.addClass("pending");ad.tiles_div.html(v);setTimeout(function(){ad.init()},ad.data_query_wait)}else{if(ag==="data"||ag.status==="data"){if(ag.valid_chroms){ad.valid_chroms=ag.valid_chroms;ad.update_icons()}ad.tiles_div.text(U);if(ad.view.chrom){ad.tiles_div.text("");ad.tiles_div.css("height",ad.visible_height_px+"px");ad.enabled=true;$.when(ad.predraw_init()).done(function(){ac.resolve();ad.container_div.removeClass("nodata error pending");ad.request_draw()})}else{ac.resolve()}}}}}}});this.update_icons();return ac},predraw_init:function(){},get_drawables:function(){return this}});var M=function(ae,ad,af){g.call(this,ae,ad,af);var ac=this;m(ac.container_div,ac.drag_handle_class,".group",ac);this.filters_manager=new i.FiltersManager(this,("filters" in af?af.filters:null));this.data_manager.set("filters_manager",this.filters_manager);this.filters_available=false;this.tool=("tool" in af&&af.tool?new s(this,af.tool,af.tool_state):null);this.tile_cache=new x.Cache(Q);if(this.header_div){this.set_filters_manager(this.filters_manager);if(this.tool){this.dynamic_tool_div=this.tool.parent_div;this.header_div.after(this.dynamic_tool_div)}}this.tiles_div=$("<div/>").addClass("tiles").appendTo(this.content_div);this.overlay_div=$("<div/>").addClass("overlay").appendTo(this.content_div);if(af.mode){this.change_mode(af.mode)}};q(M.prototype,r.prototype,g.prototype,{action_icons_def:g.prototype.action_icons_def.concat([{name:"show_more_rows_icon",title:"To minimize track height, not all feature rows are displayed. Click to display more rows.",css_class:"exclamation",on_click_fn:function(ac){$(".bs-tooltip").remove();ac.slotters[ac.view.resolution_px_b].max_rows*=2;ac.request_draw(true)},hide:true}]),copy:function(ac){var ad=this.to_dict();q(ad,{data_manager:this.data_manager});var ae=new this.constructor(this.view,ac,ad);ae.change_mode(this.mode);ae.enabled=this.enabled;return ae},set_filters_manager:function(ac){this.filters_manager=ac;this.header_div.after(this.filters_manager.parent_div)},to_dict:function(){return{track_type:this.get_type(),name:this.name,hda_ldda:this.hda_ldda,dataset_id:this.dataset_id,prefs:this.prefs,mode:this.mode,filters:this.filters_manager.to_dict(),tool_state:(this.tool?this.tool.state_dict():{})}},change_mode:function(ad){var ac=this;ac.mode=ad;ac.config.values.mode=ad;ac.tile_cache.clear();ac.request_draw();this.action_icons.mode_icon.attr("title","Set display mode (now: "+ac.mode+")");return ac},update_icons:function(){var ac=this;if(ac.filters_available){ac.action_icons.filters_icon.show()}else{ac.action_icons.filters_icon.hide()}if(ac.tool){ac.action_icons.tools_icon.show();ac.action_icons.param_space_viz_icon.show()}else{ac.action_icons.tools_icon.hide();ac.action_icons.param_space_viz_icon.hide()}},_gen_tile_cache_key:function(ad,ac){return ad+"_"+ac},request_draw:function(ad,ac){this.view.request_redraw(false,ad,ac,this)},before_draw:function(){},_draw:function(ad,ao){if(!this.can_draw()){return}var al=this.view.low,ah=this.view.high,aj=ah-al,ae=this.view.container.width(),aq=this.view.resolution_px_b,ag=this.view.resolution_b_px;if(this.is_overview){al=this.view.max_low;ah=this.view.max_high;ag=(view.max_high-view.max_low)/ae;aq=1/ag}this.before_draw();this.tiles_div.children().addClass("remove");var ac=Math.floor(al/(ag*S)),ak=true,ap=[],ai=function(ar){return(ar&&"track" in ar)};while((ac*S*ag)<ah){var am=this._get_tile_bounds(ac,ag),an=this.draw_helper(ad,am,ag,this.tiles_div,aq);if(ai(an)){ap.push(an)}else{ak=false}ac+=1}if(!ao){this.tiles_div.children(".remove").removeClass("remove").remove()}var af=this;if(ak){this.tiles_div.children(".remove").remove();af.postdraw_actions(ap,ae,aq,ao)}},postdraw_actions:function(ad,ae,ag,ac){var af=ab.find(ad,function(ah){return ah.has_icons});if(af){ab.each(ad,function(ah){if(!ah.has_icons){ah.html_elt.css("padding-top",D)}})}},draw_helper:function(ac,af,ar,ah,ai,ao){var an=this,aw=this._gen_tile_cache_key(ai,af);if(!ao){ao={}}var av=(ac?undefined:an.tile_cache.get_elt(aw));if(av){an.show_tile(av,ah,ai);return av}var al=true;var at=an.data_manager.get_data(af,an.mode,ar,an.data_url_extra_params);if(V(at)){al=false}var aj;if(view.reference_track&&ai>view.canvas_manager.char_width_px){aj=view.reference_track.data_manager.get_data(af,an.mode,ar,view.reference_track.data_url_extra_params);if(V(aj)){al=false}}if(al){q(at,ao.more_tile_data);var ak=an.mode;if(ak==="Auto"){ak=an.get_mode(at);an.update_auto_mode(ak)}var ae=an.view.canvas_manager.new_canvas(),au=af.get("start"),ad=af.get("end"),ap=Math.ceil((ad-au)*ai)+an.left_offset,am=an.get_canvas_height(at,ak,ai,ap);ae.width=ap;ae.height=am;var aq=ae.getContext("2d");aq.translate(this.left_offset,0);var av=an.draw_tile(at,aq,ak,ar,af,ai,aj);if(av!==undefined){an.tile_cache.set_elt(aw,av);an.show_tile(av,ah,ai)}return av}var ag=$.Deferred();$.when(at,aj).then(function(){view.request_redraw(false,false,false,an);ag.resolve()});return ag},get_canvas_height:function(ac,ae,af,ad){return this.visible_height_px},draw_tile:function(ac,ad,ah,af,ag,ai,ae){console.log("Warning: TiledTrack.draw_tile() not implemented.")},show_tile:function(ae,ah,ai){var ad=this,ac=ae.html_elt;ae.predisplay_actions();var ag=(ae.low-(this.is_overview?this.view.max_low:this.view.low))*ai;if(this.left_offset){ag-=this.left_offset}ac.css({position:"absolute",top:0,left:ag});if(ac.hasClass("remove")){ac.removeClass("remove")}else{ah.append(ac)}ae.html_elt.height("auto");this.max_height_px=Math.max(this.max_height_px,ae.html_elt.height());ae.html_elt.parent().children().css("height",this.max_height_px+"px");var af=this.max_height_px;if(this.visible_height_px!==0){af=Math.min(this.max_height_px,this.visible_height_px)}this.tiles_div.css("height",af+"px")},_get_tile_bounds:function(ac,ad){var af=Math.floor(ac*S*ad),ag=Math.ceil(S*ad),ae=(af+ag<=this.view.max_high?af+ag:this.view.max_high);return new x.GenomeRegion({chrom:this.view.chrom,start:af,end:ae})},tool_region_and_parameters_str:function(ae){var ac=this,ad=(ae!==undefined?ae.toString():"all");return" - region=["+ad+"], parameters=["+ac.tool.get_param_values().join(", ")+"]"},data_and_mode_compatible:function(ac,ad){return true},can_subset:function(ac){return false},init_for_tool_data:function(){this.data_manager.set("data_type","raw_data");this.data_query_wait=1000;this.dataset_check_type="state";this.normal_postdraw_actions=this.postdraw_actions;this.postdraw_actions=function(ae,af,ah,ac){var ad=this;ad.normal_postdraw_actions(ae,af,ah,ac);ad.dataset_check_type="converted_datasets_state";ad.data_query_wait=K;var ag=new l.ServerStateDeferred({url:ad.dataset_state_url,url_params:{dataset_id:ad.dataset_id,hda_ldda:ad.hda_ldda},interval:ad.data_query_wait,success_fn:function(ai){return ai!=="pending"}});$.when(ag.go()).then(function(){ad.data_manager.set("data_type","data")});ad.postdraw_actions=ad.normal_postdraw_actions}}});var X=function(ad,ac){var ae={resize:false};g.call(this,ad,ac,ae);this.container_div.addClass("label-track")};q(X.prototype,g.prototype,{build_header_div:function(){},init:function(){this.enabled=true},_draw:function(){var ae=this.view,af=ae.high-ae.low,ai=Math.floor(Math.pow(10,Math.floor(Math.log(af)/Math.log(10)))),ac=Math.floor(ae.low/ai)*ai,ag=this.view.container.width(),ad=$("<div style='position: relative; height: 1.3em;'></div>");while(ac<ae.high){var ah=(ac-ae.low)/af*ag;ad.append($("<div class='label'>"+commatize(ac)+"</div>").css({position:"absolute",left:ah-1}));ac+=ai}this.content_div.children(":first").remove();this.content_div.append(ad)}});var f=function(ad,ac,ag){M.call(this,ad,ac,ag);this.drawables=[];this.left_offset=0;if("drawables" in ag){var af;for(var ae=0;ae<ag.drawables.length;ae++){af=ag.drawables[ae];this.drawables[ae]=p(af,ad,null);if(af.left_offset>this.left_offset){this.left_offset=af.left_offset}}this.enabled=true}if(this.drawables.length!==0){this.set_display_modes(this.drawables[0].display_modes,this.drawables[0].mode)}this.update_icons();this.obj_type="CompositeTrack"};q(f.prototype,M.prototype,{action_icons_def:[{name:"composite_icon",title:"Show individual tracks",css_class:"layers-stack",on_click_fn:function(ac){$(".bs-tooltip").remove();ac.show_group()}}].concat(M.prototype.action_icons_def),to_dict:z.prototype.to_dict,add_drawable:z.prototype.add_drawable,unpack_drawables:z.prototype.unpack_drawables,change_mode:function(ac){M.prototype.change_mode.call(this,ac);for(var ad=0;ad<this.drawables.length;ad++){this.drawables[ad].change_mode(ac)}},init:function(){var ae=[];for(var ad=0;ad<this.drawables.length;ad++){ae.push(this.drawables[ad].init())}var ac=this;$.when.apply($,ae).then(function(){ac.enabled=true;ac.request_draw()})},update_icons:function(){this.action_icons.filters_icon.hide();this.action_icons.tools_icon.hide();this.action_icons.param_space_viz_icon.hide()},can_draw:r.prototype.can_draw,draw_helper:function(ad,ah,av,aj,al,at){var aq=this,aB=this._gen_tile_cache_key(al,ah);if(!at){at={}}var aA=(ad?undefined:aq.tile_cache.get_elt(aB));if(aA){aq.show_tile(aA,aj,al);return aA}var ak=[],aq,ao=true,aw,am;for(var ax=0;ax<this.drawables.length;ax++){aq=this.drawables[ax];aw=aq.data_manager.get_data(ah,aq.mode,av,aq.data_url_extra_params);if(V(aw)){ao=false}ak.push(aw);am=null;if(view.reference_track&&al>view.canvas_manager.char_width_px){am=view.reference_track.data_manager.get_data(ah,aq.mode,av,view.reference_track.data_url_extra_params);if(V(am)){ao=false}}ak.push(am)}if(ao){q(aw,at.more_tile_data);this.tile_predraw_init();var ag=aq.view.canvas_manager.new_canvas(),ay=ah.get("start"),ae=ah.get("end"),az=0,ar=Math.ceil((ae-ay)*al)+this.left_offset,ap=0,af=[],ax;var ac=0;for(ax=0;ax<this.drawables.length;ax++,az+=2){aq=this.drawables[ax];aw=ak[az];var an=aq.mode;if(an==="Auto"){an=aq.get_mode(aw);aq.update_auto_mode(an)}af.push(an);ac=aq.get_canvas_height(aw,an,al,ar);if(ac>ap){ap=ac}}ag.width=ar;ag.height=(at.height?at.height:ap);az=0;var au=ag.getContext("2d");au.translate(this.left_offset,0);au.globalAlpha=0.5;au.globalCompositeOperation="source-over";for(ax=0;ax<this.drawables.length;ax++,az+=2){aq=this.drawables[ax];aw=ak[az];am=ak[az+1];aA=aq.draw_tile(aw,au,af[ax],av,ah,al,am)}this.tile_cache.set_elt(aB,aA);this.show_tile(aA,aj,al);return aA}var ai=$.Deferred(),aq=this;$.when.apply($,ak).then(function(){view.request_redraw(false,false,false,aq);ai.resolve()});return ai},show_group:function(){var af=new P(this.view,this.container,{name:this.name}),ac;for(var ae=0;ae<this.drawables.length;ae++){ac=this.drawables[ae];ac.update_icons();af.add_drawable(ac);ac.container=af;af.content_div.append(ac.container_div)}var ad=this.container.replace_drawable(this,af,true);af.request_draw()},tile_predraw_init:function(){var af=Number.MAX_VALUE,ac=-af,ad;for(var ae=0;ae<this.drawables.length;ae++){ad=this.drawables[ae];if(ad instanceof h){if(ad.prefs.min_value<af){af=ad.prefs.min_value}if(ad.prefs.max_value>ac){ac=ad.prefs.max_value}}}for(var ae=0;ae<this.drawables.length;ae++){ad=this.drawables[ae];ad.prefs.min_value=af;ad.prefs.max_value=ac}},postdraw_actions:function(ae,ah,aj,ad){M.prototype.postdraw_actions.call(this,ae,ah,aj,ad);var ag=-1;for(var af=0;af<ae.length;af++){var ac=ae[af].html_elt.find("canvas").height();if(ac>ag){ag=ac}}for(var af=0;af<ae.length;af++){var ai=ae[af];if(ai.html_elt.find("canvas").height()!==ag){this.draw_helper(true,ai.index,ai.resolution,ai.html_elt.parent(),aj,{height:ag});ai.html_elt.remove()}}}});var B=function(ac){M.call(this,ac,{content_div:ac.top_labeltrack},{resize:false});ac.reference_track=this;this.left_offset=200;this.visible_height_px=12;this.container_div.addClass("reference-track");this.content_div.css("background","none");this.content_div.css("min-height","0px");this.content_div.css("border","none");this.data_url=reference_url+"/"+this.view.dbkey;this.data_url_extra_params={reference:true};this.data_manager=new x.ReferenceTrackDataManager({data_url:this.data_url});this.hide_contents()};q(B.prototype,r.prototype,M.prototype,{build_header_div:function(){},init:function(){this.data_manager.clear();this.enabled=true},can_draw:r.prototype.can_draw,draw_helper:function(ae,af,ac,ag,ah,ad){if(ah>this.view.canvas_manager.char_width_px){return M.prototype.draw_helper.call(this,ae,af,ac,ag,ah,ad)}else{this.hide_contents();return null}},draw_tile:function(ak,al,ag,af,ai,am){var ae=this;if(am>this.view.canvas_manager.char_width_px){if(ak.data===null){this.hide_contents();return}var ad=al.canvas;al.font=al.canvas.manager.default_font;al.textAlign="center";ak=ak.data;for(var ah=0,aj=ak.length;ah<aj;ah++){var ac=Math.floor(ah*am);al.fillText(ak[ah],ac,10)}this.show_contents();return new b(ae,ai,af,ad,ak)}this.hide_contents()}});var h=function(ae,ad,af){var ac=this;this.display_modes=["Histogram","Line","Filled","Intensity"];this.mode="Histogram";M.call(this,ae,ad,af);this.hda_ldda=af.hda_ldda;this.dataset_id=af.dataset_id;this.original_dataset_id=this.dataset_id;this.left_offset=0;this.config=new F({track:this,params:[{key:"name",label:"Name",type:"text",default_value:this.name},{key:"color",label:"Color",type:"color",default_value:l.get_random_color()},{key:"min_value",label:"Min Value",type:"float",default_value:undefined},{key:"max_value",label:"Max Value",type:"float",default_value:undefined},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:32,hidden:true}],saved_values:af.prefs,onchange:function(){ac.set_name(ac.prefs.name);ac.vertical_range=ac.prefs.max_value-ac.prefs.min_value;ac.set_min_value(ac.prefs.min_value);ac.set_max_value(ac.prefs.max_value)}});this.prefs=this.config.values;this.visible_height_px=this.config.values.height;this.vertical_range=this.config.values.max_value-this.config.values.min_value};q(h.prototype,r.prototype,M.prototype,{on_resize:function(){this.request_draw(true)},set_min_value:function(ac){this.prefs.min_value=ac;$("#linetrack_"+this.dataset_id+"_minval").text(this.prefs.min_value);this.tile_cache.clear();this.request_draw()},set_max_value:function(ac){this.prefs.max_value=ac;$("#linetrack_"+this.dataset_id+"_maxval").text(this.prefs.max_value);this.tile_cache.clear();this.request_draw()},predraw_init:function(){var ac=this;ac.vertical_range=undefined;return $.getJSON(ac.dataset.url(),{data_type:"data",stats:true,chrom:ac.view.chrom,low:0,high:ac.view.max_high,hda_ldda:ac.hda_ldda},function(ad){ac.container_div.addClass("line-track");var ag=ad.data;if(isNaN(parseFloat(ac.prefs.min_value))||isNaN(parseFloat(ac.prefs.max_value))){var ae=ag.min,ai=ag.max;ae=Math.floor(Math.min(0,Math.max(ae,ag.mean-2*ag.sd)));ai=Math.ceil(Math.max(0,Math.min(ai,ag.mean+2*ag.sd)));ac.prefs.min_value=ae;ac.prefs.max_value=ai;$("#track_"+ac.dataset_id+"_minval").val(ac.prefs.min_value);$("#track_"+ac.dataset_id+"_maxval").val(ac.prefs.max_value)}ac.vertical_range=ac.prefs.max_value-ac.prefs.min_value;ac.total_frequency=ag.total_frequency;ac.container_div.find(".yaxislabel").remove();var ah=$("<div/>").text(W(ac.prefs.min_value,3)).make_text_editable({num_cols:6,on_finish:function(aj){$(".bs-tooltip").remove();var aj=parseFloat(aj);if(!isNaN(aj)){ac.set_min_value(aj)}},help_text:"Set min value"}).addClass("yaxislabel bottom").attr("id","linetrack_"+ac.dataset_id+"_minval").prependTo(ac.container_div),af=$("<div/>").text(W(ac.prefs.max_value,3)).make_text_editable({num_cols:6,on_finish:function(aj){$(".bs-tooltip").remove();var aj=parseFloat(aj);if(!isNaN(aj)){ac.set_max_value(aj)}},help_text:"Set max value"}).addClass("yaxislabel top").attr("id","linetrack_"+ac.dataset_id+"_maxval").prependTo(ac.container_div)})},draw_tile:function(al,aj,ae,ad,ag,ak){var ac=aj.canvas,af=ag.get("start"),ai=ag.get("end"),ah=new L.LinePainter(al.data,af,ai,this.prefs,ae);ah.draw(aj,ac.width,ac.height,ak);return new b(this,ag,ad,ac,al.data)},can_subset:function(ac){return false}});var t=function(ae,ad,af){var ac=this;this.display_modes=["Heatmap"];this.mode="Heatmap";M.call(this,ae,ad,af);this.hda_ldda=af.hda_ldda;this.dataset_id=af.dataset_id;this.original_dataset_id=this.dataset_id;this.left_offset=0;this.config=new F({track:this,params:[{key:"name",label:"Name",type:"text",default_value:this.name},{key:"pos_color",label:"Positive Color",type:"color",default_value:"#FF8C00"},{key:"neg_color",label:"Negative Color",type:"color",default_value:"#4169E1"},{key:"min_value",label:"Min Value",type:"float",default_value:-1},{key:"max_value",label:"Max Value",type:"float",default_value:1},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:500,hidden:true}],saved_values:af.prefs,onchange:function(){ac.set_name(ac.prefs.name);ac.vertical_range=ac.prefs.max_value-ac.prefs.min_value;ac.set_min_value(ac.prefs.min_value);ac.set_max_value(ac.prefs.max_value)}});this.prefs=this.config.values;this.visible_height_px=this.config.values.height;this.vertical_range=this.config.values.max_value-this.config.values.min_value};q(t.prototype,r.prototype,M.prototype,{on_resize:function(){this.request_draw(true)},set_min_value:function(ac){this.prefs.min_value=ac;this.tile_cache.clear();this.request_draw()},set_max_value:function(ac){this.prefs.max_value=ac;this.tile_cache.clear();this.request_draw()},draw_tile:function(ac,ae,ai,ag,ah,aj){var af=ae.canvas,ad=new L.DiagonalHeatmapPainter(ac.data,ah.get("start"),ah.get("end"),this.prefs,ai);ad.draw(ae,af.width,af.height,aj);return new b(this,ah,ag,af,ac.data)}});var c=function(af,ae,ah){var ad=this;this.display_modes=["Auto","Coverage","Dense","Squish","Pack"];M.call(this,af,ae,ah);var ag=l.get_random_color(),ac=l.get_random_color([ag,"#FFFFFF"]);this.config=new F({track:this,params:[{key:"name",label:"Name",type:"text",default_value:this.name},{key:"block_color",label:"Block color",type:"color",default_value:ag},{key:"reverse_strand_color",label:"Antisense strand color",type:"color",default_value:ac},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true,help:"Show the number of items in each bin when drawing summary histogram"},{key:"histogram_max",label:"Histogram maximum",type:"float",default_value:null,help:"clear value to set automatically"},{key:"connector_style",label:"Connector style",type:"select",default_value:"fishbones",options:[{label:"Line with arrows",value:"fishbone"},{label:"Arcs",value:"arcs"}]},{key:"mode",type:"string",default_value:this.mode,hidden:true},{key:"height",type:"int",default_value:this.visible_height_px,hidden:true}],saved_values:ah.prefs,onchange:function(){ad.set_name(ad.prefs.name);ad.tile_cache.clear();ad.set_painter_from_config();ad.request_draw()}});this.prefs=this.config.values;this.visible_height_px=this.config.values.height;this.container_div.addClass("feature-track");this.hda_ldda=ah.hda_ldda;this.dataset_id=ah.dataset_id;this.original_dataset_id=ah.dataset_id;this.show_labels_scale=0.001;this.showing_details=false;this.summary_draw_height=30;this.slotters={};this.start_end_dct={};this.left_offset=200;this.set_painter_from_config()};q(c.prototype,r.prototype,M.prototype,{set_dataset:function(ac){this.dataset_id=ac.get("id");this.hda_ldda=ac.get("hda_ldda");this.dataset=ac;this.data_manager.set("dataset",ac)},set_painter_from_config:function(){if(this.config.values.connector_style==="arcs"){this.painter=L.ArcLinkedFeaturePainter}else{this.painter=L.LinkedFeaturePainter}},before_draw:function(){this.max_height_px=0},postdraw_actions:function(ar,am,ah,ag){M.prototype.postdraw_actions.call(this,ar,ag);var al=this,ao;if(al.mode==="Coverage"){var ad=-1;for(ao=0;ao<ar.length;ao++){var an=ar[ao].max_val;if(an>ad){ad=an}}for(ao=0;ao<ar.length;ao++){var au=ar[ao];if(au.max_val!==ad){au.html_elt.remove();al.draw_helper(true,au.index,au.resolution,au.html_elt.parent(),ah,{more_tile_data:{max:ad}})}}}if(al.filters_manager){var ai=al.filters_manager.filters;for(var aq=0;aq<ai.length;aq++){ai[aq].update_ui_elt()}var at=false,ac,aj;for(ao=0;ao<ar.length;ao++){if(ar[ao].data.length){ac=ar[ao].data[0];for(var aq=0;aq<ai.length;aq++){aj=ai[aq];if(aj.applies_to(ac)&&aj.min!==aj.max){at=true;break}}}}if(al.filters_available!==at){al.filters_available=at;if(!al.filters_available){al.filters_manager.hide()}al.update_icons()}}this.container_div.find(".yaxislabel").remove();var af=ar[0];if(af instanceof j){var ak=(this.prefs.histogram_max?this.prefs.histogram_max:af.max_val),ae=$("<div/>").text(ak).make_text_editable({num_cols:12,on_finish:function(av){$(".bs-tooltip").remove();var av=parseFloat(av);al.prefs.histogram_max=(!isNaN(av)?av:null);al.tile_cache.clear();al.request_draw()},help_text:"Set max value; leave blank to use default"}).addClass("yaxislabel top").css("color",this.prefs.label_color);this.container_div.prepend(ae)}if(af instanceof O){var ap=true;for(ao=0;ao<ar.length;ao++){if(!ar[ao].all_slotted){ap=false;break}}if(!ap){this.action_icons.show_more_rows_icon.show()}else{this.action_icons.show_more_rows_icon.hide()}}else{this.action_icons.show_more_rows_icon.hide()}},update_auto_mode:function(ac){var ac;if(this.mode==="Auto"){if(ac==="no_detail"){ac="feature spans"}else{if(ac==="summary_tree"){ac="coverage histogram"}}this.action_icons.mode_icon.attr("title","Set display mode (now: Auto/"+ac+")")}},incremental_slots:function(ag,ac,af){var ad=this.view.canvas_manager.dummy_context,ae=this.slotters[ag];if(!ae||(ae.mode!==af)){ae=new (u.FeatureSlotter)(ag,af,A,function(ah){return ad.measureText(ah)});this.slotters[ag]=ae}return ae.slot_features(ac)},get_mode:function(ac){if(ac.dataset_type==="summary_tree"){mode="summary_tree"}else{if(ac.extra_info==="no_detail"||this.is_overview){mode="no_detail"}else{if(this.view.high-this.view.low>I){mode="Squish"}else{mode="Pack"}}}return mode},get_canvas_height:function(ac,ag,ah,ad){if(ag==="summary_tree"||ag==="Coverage"){return this.summary_draw_height}else{var af=this.incremental_slots(ah,ac.data,ag);var ae=new (this.painter)(null,null,null,this.prefs,ag);return Math.max(aa,ae.get_required_height(af,ad))}},draw_tile:function(am,aq,ao,ar,af,aj,ae){var ap=this,ad=aq.canvas,ay=af.get("start"),ac=af.get("end"),ag=this.left_offset;if(ao==="summary_tree"||ao==="Coverage"){var aA=new L.SummaryTreePainter(am,ay,ac,this.prefs);aA.draw(aq,ad.width,ad.height,aj);return new j(ap,af,ar,ad,am.data,am.max)}var ai=[],an=this.slotters[aj].slots;all_slotted=true;if(am.data){var ak=this.filters_manager.filters;for(var at=0,av=am.data.length;at<av;at++){var ah=am.data[at];var au=false;var al;for(var ax=0,aC=ak.length;ax<aC;ax++){al=ak[ax];al.update_attrs(ah);if(!al.keep(ah)){au=true;break}}if(!au){ai.push(ah);if(!(ah[0] in an)){all_slotted=false}}}}var aB=(this.filters_manager.alpha_filter?new C(this.filters_manager.alpha_filter):null);var az=(this.filters_manager.height_filter?new C(this.filters_manager.height_filter):null);var aA=new (this.painter)(ai,ay,ac,this.prefs,ao,aB,az,ae);var aw=null;aq.fillStyle=this.prefs.block_color;aq.font=aq.canvas.manager.default_font;aq.textAlign="right";if(am.data){aw=aA.draw(aq,ad.width,ad.height,aj,an);aw.translation=-ag}return new O(ap,af,ar,ad,am.data,aj,ao,am.message,all_slotted,aw)},data_and_mode_compatible:function(ac,ad){if(ad==="Auto"){return true}else{if(ad==="Coverage"){return ac.dataset_type==="summary_tree"}else{if(ac.extra_info==="no_detail"||ac.dataset_type==="summary_tree"){return false}else{return true}}}},can_subset:function(ac){if(ac.dataset_type==="summary_tree"||ac.message||ac.extra_info==="no_detail"){return false}return true}});var R=function(ad,ac,ae){c.call(this,ad,ac,ae);this.config=new F({track:this,params:[{key:"name",label:"Name",type:"text",default_value:this.name},{key:"block_color",label:"Block color",type:"color",default_value:l.get_random_color()},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"mode",type:"string",default_value:this.mode,hidden:true}],saved_values:ae.prefs,onchange:function(){this.track.set_name(this.track.prefs.name);this.track.tile_cache.clear();this.track.request_draw()}});this.prefs=this.config.values;this.painter=L.ReadPainter};q(R.prototype,r.prototype,M.prototype,c.prototype);var T=function(ae,ad,ag){c.call(this,ae,ad,ag);var af=l.get_random_color(),ac=l.get_random_color([af,"#ffffff"]);this.config=new F({track:this,params:[{key:"name",label:"Name",type:"text",default_value:this.name},{key:"block_color",label:"Block and sense strand color",type:"color",default_value:af},{key:"reverse_strand_color",label:"Antisense strand color",type:"color",default_value:ac},{key:"label_color",label:"Label color",type:"color",default_value:"black"},{key:"show_insertions",label:"Show insertions",type:"bool",default_value:false},{key:"show_differences",label:"Show differences only",type:"bool",default_value:true},{key:"show_counts",label:"Show summary counts",type:"bool",default_value:true},{key:"histogram_max",label:"Histogram maximum",type:"float",default_value:null,help:"Clear value to set automatically"},{key:"mode",type:"string",default_value:this.mode,hidden:true}],saved_values:ag.prefs,onchange:function(){this.track.set_name(this.track.prefs.name);this.track.tile_cache.clear();this.track.request_draw()}});this.prefs=this.config.values;this.painter=L.ReadPainter;this.update_icons()};q(T.prototype,r.prototype,M.prototype,c.prototype);var d={LineTrack:h,FeatureTrack:c,VcfTrack:R,ReadTrack:T,DiagonalHeatmapTrack:t,CompositeTrack:f,DrawableGroup:P};var p=function(ae,ad,ac){if("copy" in ae){return ae.copy(ac)}else{var af=ae.obj_type;if(!af){af=ae.track_type}return new d[af](ad,ac,ae)}};return{TracksterView:Z,DrawableGroup:P,LineTrack:h,FeatureTrack:c,DiagonalHeatmapTrack:t,ReadTrack:T,VcfTrack:R,CompositeTrack:f,object_from_template:p}});
\ No newline at end of file
diff -r fbfa0c78ea29b1e8d1ad339ab2d7d6ababb17e2a -r 166303bbdd86eefc263d9947b35c65ec3847ddc9 static/scripts/packed/viz/trackster_ui.js
--- a/static/scripts/packed/viz/trackster_ui.js
+++ b/static/scripts/packed/viz/trackster_ui.js
@@ -1,1 +1,1 @@
-define(["base","libs/underscore","viz/trackster/slotting","viz/trackster/painters","viz/trackster/tracks","viz/visualization"],function(g,c,h,e,b,d){var a=b.object_from_template;var f=g.Base.extend({initialize:function(j){this.baseURL=j},createButtonMenu:function(){var j=this,k=create_icon_buttons_menu([{icon_class:"plus-button",title:"Add tracks",on_click:function(){d.select_datasets(select_datasets_url,add_track_async_url,{"f-dbkey":view.dbkey},function(l){c.each(l,function(m){view.add_drawable(a(m,view,view))})})}},{icon_class:"block--plus",title:"Add group",on_click:function(){view.add_drawable(new b.DrawableGroup(view,view,{name:"New Group"}))}},{icon_class:"bookmarks",title:"Bookmarks",on_click:function(){parent.force_right_panel(($("div#right").css("right")=="0px"?"hide":"show"))}},{icon_class:"globe",title:"Circster",on_click:function(){window.location=j.baseURL+"visualization/circster?id="+view.vis_id}},{icon_class:"disk--arrow",title:"Save",on_click:function(){show_modal("Saving...","progress");var l=[];$(".bookmark").each(function(){l.push({position:$(this).children(".position").text(),annotation:$(this).children(".annotation").text()})});var m=(view.overview_drawable?view.overview_drawable.name:null),n={view:view.to_dict(),viewport:{chrom:view.chrom,start:view.low,end:view.high,overview:m},bookmarks:l};$.ajax({url:galaxy_paths.get("visualization_url"),type:"POST",dataType:"json",data:{id:view.vis_id,title:view.name,dbkey:view.dbkey,type:"trackster",vis_json:JSON.stringify(n)}}).success(function(o){hide_modal();view.vis_id=o.vis_id;view.has_changes=false;window.history.pushState({},"",o.url+window.location.hash)}).error(function(){show_modal("Could Not Save","Could not save visualization. Please try again later.",{Close:hide_modal})})}},{icon_class:"cross-circle",title:"Close",on_click:function(){window.location=j.baseURL+"visualization/list"}}],{tooltip_config:{placement:"bottom"}});this.buttonMenu=k;return k},add_bookmarks:function(){var j=this,k=this.baseURL;show_modal("Select dataset for new bookmarks","progress");$.ajax({url:this.baseURL+"/visualization/list_histories",data:{"f-dbkey":view.dbkey},error:function(){alert("Grid failed")},success:function(l){show_modal("Select dataset for new bookmarks",l,{Cancel:function(){hide_modal()},Insert:function(){$("input[name=id]:checked,input[name=ldda_ids]:checked").first().each(function(){var m,n=$(this).val();if($(this).attr("name")==="id"){m={hda_id:n}}else{m={ldda_id:n}}$.ajax({url:this.baseURL+"/visualization/bookmarks_from_dataset",data:m,dataType:"json"}).then(function(o){for(i=0;i<o.data.length;i++){var p=o.data[i];j.add_bookmark(p[0],p[1])}})});hide_modal()}})}})},add_bookmark:function(n,l,j){var p=$("#bookmarks-container"),r=$("<div/>").addClass("bookmark").appendTo(p);var s=$("<div/>").addClass("position").appendTo(r),o=$("<a href=''/>").text(n).appendTo(s).click(function(){view.go_to(n);return false}),m=$("<div/>").text(l).appendTo(r);if(j){var q=$("<div/>").addClass("delete-icon-container").prependTo(r).click(function(){r.slideUp("fast");r.remove();view.has_changes=true;return false}),k=$("<a href=''/>").addClass("icon-button delete").appendTo(q);m.make_text_editable({num_rows:3,use_textarea:true,help_text:"Edit bookmark note"}).addClass("annotation")}view.has_changes=true;return r},create_visualization:function(o,j,n,p,m){var l=this,k=new b.TracksterView(o);k.editor=true;$.when(k.load_chroms_deferred).then(function(){if(j){var y=j.chrom,q=j.start,v=j.end,s=j.overview;if(y&&(q!==undefined)&&v){k.change_chrom(y,q,v)}}if(n){var t,r,u;for(var w=0;w<n.length;w++){k.add_drawable(a(n[w],k,k))}}k.update_intro_div();var z;for(var w=0;w<k.drawables.length;w++){if(k.drawables[w].name===s){k.set_overview(k.drawables[w]);break}}if(p){var x;for(var w=0;w<p.length;w++){x=p[w];l.add_bookmark(x.position,x.annotation,m)}}k.has_changes=false});return k},init_keyboard_nav:function(j){$(document).keydown(function(k){if($(k.srcElement).is(":input")){return}switch(k.which){case 37:j.move_fraction(0.25);break;case 38:var l=Math.round(j.viewport_container.height()/15);j.viewport_container.scrollTop(j.viewport_container.scrollTop()-20);break;case 39:j.move_fraction(-0.25);break;case 40:var l=Math.round(j.viewport_container.height()/15);j.viewport_container.scrollTop(j.viewport_container.scrollTop()+20);break}})}});return{object_from_template:a,TracksterUI:f}});
\ No newline at end of file
+define(["base","libs/underscore","viz/trackster/slotting","viz/trackster/painters","viz/trackster/tracks","viz/visualization"],function(g,c,h,e,b,d){var a=b.object_from_template;var f=g.Base.extend({initialize:function(j){this.baseURL=j},createButtonMenu:function(){var j=this,k=create_icon_buttons_menu([{icon_class:"plus-button",title:"Add tracks",on_click:function(){d.select_datasets(select_datasets_url,add_track_async_url,{"f-dbkey":view.dbkey},function(l){c.each(l,function(m){view.add_drawable(a(m,view,view))})})}},{icon_class:"block--plus",title:"Add group",on_click:function(){view.add_drawable(new b.DrawableGroup(view,view,{name:"New Group"}))}},{icon_class:"bookmarks",title:"Bookmarks",on_click:function(){parent.force_right_panel(($("div#right").css("right")=="0px"?"hide":"show"))}},{icon_class:"globe",title:"Circster",on_click:function(){window.location=j.baseURL+"visualization/circster?id="+view.vis_id}},{icon_class:"disk--arrow",title:"Save",on_click:function(){show_modal("Saving...","progress");var l=[];$(".bookmark").each(function(){l.push({position:$(this).children(".position").text(),annotation:$(this).children(".annotation").text()})});var m=(view.overview_drawable?view.overview_drawable.name:null),n={view:view.to_dict(),viewport:{chrom:view.chrom,start:view.low,end:view.high,overview:m},bookmarks:l};$.ajax({url:galaxy_paths.get("visualization_url"),type:"POST",dataType:"json",data:{id:view.vis_id,title:view.name,dbkey:view.dbkey,type:"trackster",vis_json:JSON.stringify(n)}}).success(function(o){hide_modal();view.vis_id=o.vis_id;view.has_changes=false;window.history.pushState({},"",o.url+window.location.hash)}).error(function(){show_modal("Could Not Save","Could not save visualization. Please try again later.",{Close:hide_modal})})}},{icon_class:"cross-circle",title:"Close",on_click:function(){window.location=j.baseURL+"visualization/list"}}],{tooltip_config:{placement:"bottom"}});this.buttonMenu=k;return k},add_bookmarks:function(){var j=this,k=this.baseURL;show_modal("Select dataset for new bookmarks","progress");$.ajax({url:this.baseURL+"/visualization/list_histories",data:{"f-dbkey":view.dbkey},error:function(){alert("Grid failed")},success:function(l){show_modal("Select dataset for new bookmarks",l,{Cancel:function(){hide_modal()},Insert:function(){$("input[name=id]:checked,input[name=ldda_ids]:checked").first().each(function(){var m,n=$(this).val();if($(this).attr("name")==="id"){m={hda_id:n}}else{m={ldda_id:n}}$.ajax({url:this.baseURL+"/visualization/bookmarks_from_dataset",data:m,dataType:"json"}).then(function(o){for(i=0;i<o.data.length;i++){var p=o.data[i];j.add_bookmark(p[0],p[1])}})});hide_modal()}})}})},add_bookmark:function(n,l,j){var p=$("#bookmarks-container"),r=$("<div/>").addClass("bookmark").appendTo(p);var s=$("<div/>").addClass("position").appendTo(r),o=$("<a href=''/>").text(n).appendTo(s).click(function(){view.go_to(n);return false}),m=$("<div/>").text(l).appendTo(r);if(j){var q=$("<div/>").addClass("delete-icon-container").prependTo(r).click(function(){r.slideUp("fast");r.remove();view.has_changes=true;return false}),k=$("<a href=''/>").addClass("icon-button delete").appendTo(q);m.make_text_editable({num_rows:3,use_textarea:true,help_text:"Edit bookmark note"}).addClass("annotation")}view.has_changes=true;return r},create_visualization:function(o,j,n,p,m){var l=this,k=new b.TracksterView(o);k.editor=true;$.when(k.load_chroms_deferred).then(function(A){if(j){var y=j.chrom,q=j.start,v=j.end,s=j.overview;if(y&&(q!==undefined)&&v){k.change_chrom(y,q,v)}}else{k.change_chrom(A[0].chrom)}if(n){var t,r,u;for(var w=0;w<n.length;w++){k.add_drawable(a(n[w],k,k))}}k.update_intro_div();var z;for(var w=0;w<k.drawables.length;w++){if(k.drawables[w].name===s){k.set_overview(k.drawables[w]);break}}if(p){var x;for(var w=0;w<p.length;w++){x=p[w];l.add_bookmark(x.position,x.annotation,m)}}k.has_changes=false});return k},init_keyboard_nav:function(j){$(document).keydown(function(k){if($(k.srcElement).is(":input")){return}switch(k.which){case 37:j.move_fraction(0.25);break;case 38:var l=Math.round(j.viewport_container.height()/15);j.viewport_container.scrollTop(j.viewport_container.scrollTop()-20);break;case 39:j.move_fraction(-0.25);break;case 40:var l=Math.round(j.viewport_container.height()/15);j.viewport_container.scrollTop(j.viewport_container.scrollTop()+20);break}})}});return{object_from_template:a,TracksterUI:f}});
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Add the framework for discovering and installing simple repository dependencies.
by Bitbucket 17 Dec '12
by Bitbucket 17 Dec '12
17 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/fbfa0c78ea29/
changeset: fbfa0c78ea29
user: greg
date: 2012-12-17 21:02:54
summary: Add the framework for discovering and installing simple repository dependencies.
affected #: 9 files
diff -r a3ecba6f3e0c1ecc719a42b6bccfa0b32746ba27 -r fbfa0c78ea29b1e8d1ad339ab2d7d6ababb17e2a lib/galaxy/tool_shed/common_util.py
--- a/lib/galaxy/tool_shed/common_util.py
+++ b/lib/galaxy/tool_shed/common_util.py
@@ -1,7 +1,7 @@
import os, urllib2
from galaxy import util
from galaxy.util.odict import odict
-from galaxy.tool_shed.encoding_util import tool_shed_decode
+from galaxy.tool_shed import encoding_util
REPOSITORY_OWNER = 'devteam'
@@ -36,7 +36,7 @@
print "The URL\n%s\nraised the exception:\n%s\n" % ( url, str( e ) )
if tool_shed_accessible:
if text:
- tool_dependencies_dict = tool_shed_decode( text )
+ tool_dependencies_dict = encoding_util.tool_shed_decode( text )
for dependency_key, requirements_dict in tool_dependencies_dict.items():
tool_dependency_name = requirements_dict[ 'name' ]
tool_dependency_version = requirements_dict[ 'version' ]
diff -r a3ecba6f3e0c1ecc719a42b6bccfa0b32746ba27 -r fbfa0c78ea29b1e8d1ad339ab2d7d6ababb17e2a lib/galaxy/tool_shed/encoding_util.py
--- a/lib/galaxy/tool_shed/encoding_util.py
+++ b/lib/galaxy/tool_shed/encoding_util.py
@@ -11,6 +11,7 @@
log = logging.getLogger( __name__ )
encoding_sep = '__esep__'
+encoding_sep2 = '__esepii__'
def tool_shed_decode( value ):
# Extract and verify hash
@@ -23,12 +24,12 @@
try:
values = simplejson.loads( value )
except Exception, e:
- log.debug( "Decoding json value from tool shed threw exception: %s" % str( e ) )
+ log.debug( "Decoding json value from tool shed for value '%s' threw exception: %s" % ( str( value ), str( e ) ) )
if values is not None:
try:
return json_fix( values )
except Exception, e:
- log.debug( "Fixing decoded json value from tool shed threw exception: %s" % str( e ) )
+ log.debug( "Fixing decoded json values '%s' from tool shed threw exception: %s" % ( str( values ), str( e ) ) )
fixed_values = values
if values is None:
values = value
diff -r a3ecba6f3e0c1ecc719a42b6bccfa0b32746ba27 -r fbfa0c78ea29b1e8d1ad339ab2d7d6ababb17e2a lib/galaxy/tool_shed/tool_dependencies/install_util.py
--- a/lib/galaxy/tool_shed/tool_dependencies/install_util.py
+++ b/lib/galaxy/tool_shed/tool_dependencies/install_util.py
@@ -1,7 +1,7 @@
import sys, os, subprocess, tempfile
import common_util
import fabric_util
-from galaxy.tool_shed.encoding_util import encoding_sep, tool_shed_encode, tool_shed_decode
+from galaxy.tool_shed import encoding_util
from galaxy.model.orm import and_
from galaxy import eggs
@@ -214,10 +214,10 @@
for action_elem in param_elem:
actions.append( action_elem.text.replace( '$INSTALL_DIR', install_dir ) )
if actions:
- params_str += 'actions=%s,' % tool_shed_encode( encoding_sep.join( actions ) )
+ params_str += 'actions=%s,' % encoding_util.tool_shed_encode( encoding_util.encoding_sep.join( actions ) )
else:
if param_elem.text:
- param_value = tool_shed_encode( param_elem.text )
+ param_value = encoding_util.tool_shed_encode( param_elem.text )
params_str += '%s=%s,' % ( param_name, param_value )
if package_name:
params_str += 'package_name=%s' % package_name
diff -r a3ecba6f3e0c1ecc719a42b6bccfa0b32746ba27 -r fbfa0c78ea29b1e8d1ad339ab2d7d6ababb17e2a lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -1279,6 +1279,14 @@
valid_filenames.append( '%s.txt' % r )
valid_filenames.append( '%s.txt' % repository_name )
return valid_filenames
+def get_repo_info_tuple_contents( repo_info_tuple ):
+ # Take care in handling the repo_info_tuple as it evolves over time as new tool shed features are introduced.
+ if len( repo_info_tuple ) == 6:
+ description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, tool_dependencies = repo_info_tuple
+ repository_dependencies = None
+ elif len( repo_info_tuple ) == 7:
+ description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = repo_info_tuple
+ return description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies
def get_repository_by_name_and_owner( trans, name, owner ):
"""Get a repository from the database via name and owner"""
if trans.webapp.name == 'galaxy':
diff -r a3ecba6f3e0c1ecc719a42b6bccfa0b32746ba27 -r fbfa0c78ea29b1e8d1ad339ab2d7d6ababb17e2a lib/galaxy/webapps/community/controllers/repository.py
--- a/lib/galaxy/webapps/community/controllers/repository.py
+++ b/lib/galaxy/webapps/community/controllers/repository.py
@@ -11,7 +11,7 @@
from galaxy.util.json import from_json_string, to_json_string
from galaxy.model.orm import and_
import galaxy.util.shed_util_common as suc
-from galaxy.tool_shed.encoding_util import tool_shed_encode
+from galaxy.tool_shed import encoding_util
import common
from galaxy import eggs
@@ -1264,14 +1264,14 @@
update_dict = dict( changeset_revision=changeset_revision, ctx_rev=ctx_rev )
if changeset_revision == repository.tip( trans.app ):
# If changeset_revision is the repository tip, there are no additional updates.
- return tool_shed_encode( update_dict )
+ return encoding_util.tool_shed_encode( update_dict )
else:
repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans,
trans.security.encode_id( repository.id ),
changeset_revision )
if repository_metadata:
# If changeset_revision is in the repository_metadata table for this repository, there are no additional updates.
- return tool_shed_encode( update_dict )
+ return encoding_util.tool_shed_encode( update_dict )
else:
# The changeset_revision column in the repository_metadata table has been updated with a new changeset_revision value since the
# repository was installed. We need to find the changeset_revision to which we need to update.
@@ -1295,7 +1295,7 @@
update_to_changeset_hash = changeset_hash
update_dict[ 'changeset_revision' ] = str( latest_changeset_revision )
update_dict[ 'ctx_rev' ] = str( update_to_ctx.rev() )
- return tool_shed_encode( update_dict )
+ return encoding_util.tool_shed_encode( update_dict )
@web.expose
def get_ctx_rev( self, trans, **kwd ):
"""Given a repository and changeset_revision, return the correct ctx.rev() value."""
@@ -1328,7 +1328,20 @@
return repository_metadata.metadata
return None
@web.json
+ def get_readme_files( self, trans, **kwd ):
+ """
+ This method is called when installing or re-installing a single repository into a Galaxy instance. If the received changeset_revision
+ includes one or more readme files, return them in a dictionary.
+ """
+ repository_name = kwd[ 'name' ]
+ repository_owner = kwd[ 'owner' ]
+ changeset_revision = kwd[ 'changeset_revision' ]
+ repository = suc.get_repository_by_name_and_owner( trans, repository_name, repository_owner )
+ repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, trans.security.encode_id( repository.id ), changeset_revision )
+ return suc.build_readme_files_dict( repository_metadata )
+ @web.json
def get_repository_dependencies( self, trans, **kwd ):
+ """Return an encoded dictionary of all repositories upon which the contents of the received repository depends."""
params = util.Params( kwd )
name = params.get( 'name', None )
owner = params.get( 'owner', None )
@@ -1339,7 +1352,6 @@
if repository_metadata:
metadata = repository_metadata.metadata
if metadata:
- # Get a dictionary of all repositories upon which the contents of the received repository depends.
repository_dependencies = suc.get_repository_dependencies_for_changeset_revision( trans=trans,
repository=repository,
repository_metadata=repository_metadata,
@@ -1349,7 +1361,7 @@
handled_key_rd_dicts=None,
circular_repository_dependencies=None )
if repository_dependencies:
- return tool_shed_encode( repository_dependencies )
+ return encoding_util.tool_shed_encode( repository_dependencies )
return ''
@web.json
def get_repository_information( self, trans, repository_ids, changeset_revisions, **kwd ):
@@ -1385,26 +1397,34 @@
repository=repository,
metadata=None,
repository_metadata=repository_metadata )
- repo_info_dicts.append( tool_shed_encode( repo_info_dict ) )
+ repo_info_dicts.append( encoding_util.tool_shed_encode( repo_info_dict ) )
return dict( includes_tools=includes_tools,
includes_repository_dependencies=includes_repository_dependencies,
includes_tool_dependencies=includes_tool_dependencies,
repo_info_dicts=repo_info_dicts )
@web.json
- def get_readme_files( self, trans, **kwd ):
- """
- This method is called when installing or re-installing a single repository into a Galaxy instance. If the received changeset_revision
- includes one or more readme files, return them in a dictionary.
- """
- repository_name = kwd[ 'name' ]
- repository_owner = kwd[ 'owner' ]
- changeset_revision = kwd[ 'changeset_revision' ]
- repository = suc.get_repository_by_name_and_owner( trans, repository_name, repository_owner )
- repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans, trans.security.encode_id( repository.id ), changeset_revision )
- return suc.build_readme_files_dict( repository_metadata )
+ def get_required_repo_info_dict( self, trans, encoded_str ):
+ """Retrive a list of dictionaries that each contain all of the information needed to install the list of repositories defined by encoded_str."""
+ encoded_required_repository_str = encoding_util.tool_shed_decode( encoded_str )
+ encoded_required_repository_tups = encoded_required_repository_str.split( encoding_util.encoding_sep2 )
+ decoded_required_repository_tups = []
+ for encoded_required_repository_tup in encoded_required_repository_tups:
+ decoded_required_repository_tups.append( encoded_required_repository_tup.split( encoding_util.encoding_sep ) )
+ encoded_repository_ids = []
+ changeset_revisions = []
+ for required_repository_tup in decoded_required_repository_tups:
+ tool_shed, name, owner, changeset_revision = required_repository_tup
+ repository = suc.get_repository_by_name_and_owner( trans, name, owner )
+ encoded_repository_ids.append( trans.security.encode_id( repository.id ) )
+ changeset_revisions.append( changeset_revision )
+ if encoded_repository_ids and changeset_revisions:
+ repo_info_dict = from_json_string( self.get_repository_information( trans, encoded_repository_ids, changeset_revisions ) )
+ else:
+ repo_info_dict = {}
+ return repo_info_dict
@web.expose
def get_tool_dependencies( self, trans, **kwd ):
- """Handle a request from a local Galaxy instance."""
+ """Handle a request from the InstallManager of a local Galaxy instance."""
params = util.Params( kwd )
message = util.restore_text( params.get( 'message', '' ) )
status = params.get( 'status', 'done' )
@@ -1422,9 +1442,8 @@
from_install_manager = kwd.get( 'from_install_manager', False )
if from_install_manager:
if tool_dependencies:
- return tool_shed_encode( tool_dependencies )
- return ''
- # TODO: future handler where request comes from some Galaxy admin feature.
+ return encoding_util.tool_shed_encode( tool_dependencies )
+ return ''
@web.expose
def get_tool_versions( self, trans, **kwd ):
"""
diff -r a3ecba6f3e0c1ecc719a42b6bccfa0b32746ba27 -r fbfa0c78ea29b1e8d1ad339ab2d7d6ababb17e2a lib/galaxy/webapps/community/controllers/workflow.py
--- a/lib/galaxy/webapps/community/controllers/workflow.py
+++ b/lib/galaxy/webapps/community/controllers/workflow.py
@@ -11,7 +11,7 @@
from galaxy.webapps.galaxy.controllers.workflow import attach_ordered_steps
import common
import galaxy.util.shed_util_common as suc
-from galaxy.tool_shed.encoding_util import tool_shed_encode, tool_shed_decode
+from galaxy.tool_shed import encoding_util
class RepoInputDataModule( InputDataModule ):
@@ -141,7 +141,7 @@
repository_metadata_id = kwd.get( 'repository_metadata_id', '' )
workflow_name = kwd.get( 'workflow_name', '' )
if workflow_name:
- workflow_name = tool_shed_decode( workflow_name )
+ workflow_name = encoding_util.tool_shed_decode( workflow_name )
message = kwd.get( 'message', '' )
status = kwd.get( 'status', 'done' )
repository_metadata = common.get_repository_metadata_by_id( trans, repository_metadata_id )
@@ -160,7 +160,7 @@
repository_id = trans.security.encode_id( repository_metadata.repository_id )
changeset_revision = repository_metadata.changeset_revision
metadata = repository_metadata.metadata
- workflow_name = tool_shed_decode( workflow_name )
+ workflow_name = encoding_util.tool_shed_decode( workflow_name )
# metadata[ 'workflows' ] is a list of tuples where each contained tuple is
# [ <relative path to the .ga file in the repository>, <exported workflow dict> ]
for workflow_tup in metadata[ 'workflows' ]:
@@ -386,7 +386,7 @@
repository_metadata_id = kwd.get( 'repository_metadata_id', '' )
workflow_name = kwd.get( 'workflow_name', '' )
if workflow_name:
- workflow_name = tool_shed_decode( workflow_name )
+ workflow_name = encoding_util.tool_shed_decode( workflow_name )
message = kwd.get( 'message', '' )
status = kwd.get( 'status', 'done' )
repository_metadata = get_repository_metadata_by_id( trans, repository_metadata_id )
@@ -403,7 +403,7 @@
return open( tmp_fname )
galaxy_url = trans.get_cookie( name='toolshedgalaxyurl' )
url = '%sworkflow/import_workflow?tool_shed_url=%s&repository_metadata_id=%s&workflow_name=%s' % \
- ( galaxy_url, url_for( '/', qualified=True ), repository_metadata_id, tool_shed_encode( workflow_name ) )
+ ( galaxy_url, url_for( '/', qualified=True ), repository_metadata_id, encoding_util.tool_shed_encode( workflow_name ) )
return trans.response.send_redirect( url )
return trans.response.send_redirect( web.url_for( controller='workflow',
action='view_workflow',
diff -r a3ecba6f3e0c1ecc719a42b6bccfa0b32746ba27 -r fbfa0c78ea29b1e8d1ad339ab2d7d6ababb17e2a lib/galaxy/webapps/galaxy/controllers/admin.py
--- a/lib/galaxy/webapps/galaxy/controllers/admin.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin.py
@@ -10,7 +10,7 @@
from galaxy.web.params import QuotaParamParser
from galaxy.exceptions import *
from galaxy.util.odict import *
-from galaxy.tool_shed.encoding_util import tool_shed_decode
+from galaxy.tool_shed import encoding_util
import galaxy.datatypes.registry
import logging, imp, subprocess, urllib2
@@ -717,7 +717,7 @@
text = response.read()
response.close()
if text:
- tool_dependencies_dict = tool_shed_decode( text )
+ tool_dependencies_dict = encoding_util.tool_shed_decode( text )
for dependency_key, requirements_dict in tool_dependencies_dict.items():
tool_dependency_name = requirements_dict[ 'name' ]
tool_dependency_version = requirements_dict[ 'version' ]
diff -r a3ecba6f3e0c1ecc719a42b6bccfa0b32746ba27 -r fbfa0c78ea29b1e8d1ad339ab2d7d6ababb17e2a lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
--- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
@@ -3,7 +3,8 @@
from galaxy.util.json import from_json_string, to_json_string
import galaxy.util.shed_util as shed_util
import galaxy.util.shed_util_common as suc
-from galaxy.tool_shed.encoding_util import tool_shed_encode, tool_shed_decode
+from galaxy.tool_shed import encoding_util
+from galaxy.webapps.community.util import container_util
from galaxy import eggs, tools
eggs.require( 'mercurial' )
@@ -584,11 +585,59 @@
raw_text = response.read()
response.close()
if len( raw_text ) > 2:
- text = json.from_json_string( tool_shed_decode( raw_text ) )
+ text = json.from_json_string( encoding_util.tool_shed_decode( raw_text ) )
log.debug( text )
else:
text = ''
return text
+ def get_required_repo_info_dicts( self, tool_shed_url, repo_info_dicts ):
+ """
+ Inspect the list of repo_info_dicts for repository dependencies and append a repo_info_dict for each of them to the list. All
+ repository_dependencies entries in each of the received repo_info_dicts includes all required repositories, so only one pass through
+ this methid is required to retrieve all repository dependencies.
+ """
+ if repo_info_dicts:
+ all_repo_info_dicts = [ rid for rid in repo_info_dicts ]
+ # We'll send tuples of ( tool_shed, repository_name, repository_owner, changeset_revision ) to the tool shed to discover repository ids.
+ required_repository_tups = []
+ for repo_info_dict in repo_info_dicts:
+ for repository_name, repo_info_tup in repo_info_dict.items():
+ description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = \
+ suc.get_repo_info_tuple_contents( repo_info_tup )
+ if repository_dependencies:
+ for key, val in repository_dependencies.items():
+ if key in [ 'root_key', 'description' ]:
+ continue
+ toolshed, name, owner, changeset_revision = container_util.get_components_from_key( key )
+ components_list = [ toolshed, name, owner, changeset_revision ]
+ if components_list not in required_repository_tups:
+ required_repository_tups.append( components_list )
+ for components_list in val:
+ if components_list not in required_repository_tups:
+ required_repository_tups.append( components_list )
+ if required_repository_tups:
+ # The value of required_repository_tups is a list of tuples, so we need to encode it.
+ encoded_required_repository_tups = []
+ for required_repository_tup in required_repository_tups:
+ encoded_required_repository_tups.append( encoding_util.encoding_sep.join( required_repository_tup ) )
+ encoded_required_repository_str = encoding_util.encoding_sep2.join( encoded_required_repository_tups )
+ encoded_required_repository_str = encoding_util.tool_shed_encode( encoded_required_repository_str )
+ url = suc.url_join( tool_shed_url, '/repository/get_required_repo_info_dict?encoded_str=%s' % encoded_required_repository_str )
+ response = urllib2.urlopen( url )
+ text = response.read()
+ response.close()
+ if text:
+ required_repo_info_dict = from_json_string( text )
+ required_repo_info_dicts = []
+ encoded_dict_strings = required_repo_info_dict[ 'repo_info_dicts' ]
+ for encoded_dict_str in encoded_dict_strings:
+ decoded_dict = encoding_util.tool_shed_decode( encoded_dict_str )
+ required_repo_info_dicts.append( decoded_dict )
+ if required_repo_info_dicts:
+ for required_repo_info_dict in required_repo_info_dicts:
+ if required_repo_info_dict not in all_repo_info_dicts:
+ all_repo_info_dicts.append( required_repo_info_dict )
+ return all_repo_info_dicts
def get_versions_of_tool( self, app, guid ):
tool_version = shed_util.get_tool_version( app, guid )
return tool_version.get_version_ids( app, reverse=True )
@@ -694,7 +743,7 @@
tool_section = None
for tup in zip( tool_shed_repositories, repo_info_dicts ):
tool_shed_repository, repo_info_dict = tup
- repo_info_dict = tool_shed_decode( repo_info_dict )
+ repo_info_dict = encoding_util.tool_shed_decode( repo_info_dict )
# Clone each repository to the configured location.
shed_util.update_tool_shed_repository_status( trans.app, tool_shed_repository, trans.model.ToolShedRepository.installation_status.CLONING )
repo_info_tuple = repo_info_dict[ tool_shed_repository.name ]
@@ -939,7 +988,7 @@
elif operation == "install":
reinstalling = util.string_as_bool( params.get( 'reinstalling', False ) )
encoded_kwd = kwd[ 'encoded_kwd' ]
- decoded_kwd = tool_shed_decode( encoded_kwd )
+ decoded_kwd = encoding_util.tool_shed_decode( encoded_kwd )
tsr_ids = decoded_kwd[ 'tool_shed_repository_ids' ]
repositories_for_installation = []
for tsr_id in tsr_ids:
@@ -1095,7 +1144,7 @@
includes_repository_dependencies = util.string_as_bool( repo_information_dict.get( 'includes_repository_dependencies', False ) )
includes_tool_dependencies = util.string_as_bool( repo_information_dict.get( 'includes_tool_dependencies', False ) )
encoded_repo_info_dicts = util.listify( repo_information_dict.get( 'repo_info_dicts', [] ) )
- repo_info_dicts = [ tool_shed_decode( encoded_repo_info_dict ) for encoded_repo_info_dict in encoded_repo_info_dicts ]
+ repo_info_dicts = [ encoding_util.tool_shed_decode( encoded_repo_info_dict ) for encoded_repo_info_dict in encoded_repo_info_dicts ]
if ( not includes_tools and not includes_repository_dependencies ) or \
( ( includes_tools or includes_repository_dependencies ) and kwd.get( 'select_tool_panel_section_button', False ) ):
install_repository_dependencies = CheckboxField.is_checked( install_repository_dependencies )
@@ -1122,14 +1171,12 @@
created_or_updated_tool_shed_repositories = []
# Repositories will be filtered (e.g., if already installed, etc), so filter the associated repo_info_dicts accordingly.
filtered_repo_info_dicts = []
+ # Disciver all repository dependencies and retrieve information for installing them.
+ repo_info_dicts = self.get_required_repo_info_dicts( tool_shed_url, repo_info_dicts )
for repo_info_dict in repo_info_dicts:
for name, repo_info_tuple in repo_info_dict.items():
- # Take care in handling the repo_info_tuple as it evolves over time as new features are introduced.
- if len( repo_info_tuple ) == 6:
- description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, tool_dependencies = repo_info_tuple
- repository_dependencies = None
- elif len( repo_info_tuple ) == 7:
- description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = repo_info_tuple
+ description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = \
+ suc.get_repo_info_tuple_contents( repo_info_tuple )
clone_dir = os.path.join( tool_path, self.generate_tool_path( repository_clone_url, changeset_revision ) )
relative_install_dir = os.path.join( clone_dir, name )
# Make sure the repository was not already installed.
@@ -1173,7 +1220,7 @@
owner=repository_owner,
dist_to_shed=False )
created_or_updated_tool_shed_repositories.append( tool_shed_repository )
- filtered_repo_info_dicts.append( tool_shed_encode( repo_info_dict ) )
+ filtered_repo_info_dicts.append( encoding_util.tool_shed_encode( repo_info_dict ) )
if created_or_updated_tool_shed_repositories:
if includes_tools and ( new_tool_panel_section or tool_panel_section ):
if new_tool_panel_section:
@@ -1201,6 +1248,7 @@
tsrids_list = [ trans.security.encode_id( tsr.id ) for tsr in created_or_updated_tool_shed_repositories ]
new_kwd = dict( includes_tools=includes_tools,
includes_repository_dependencies=includes_repository_dependencies,
+ install_repository_dependencies=install_repository_dependencies,
includes_tool_dependencies=includes_tool_dependencies,
install_tool_dependencies=install_tool_dependencies,
message=message,
@@ -1211,7 +1259,7 @@
tool_panel_section_key=tool_panel_section_key,
tool_shed_repository_ids=tsrids_list,
tool_shed_url=tool_shed_url )
- encoded_kwd = tool_shed_encode( new_kwd )
+ encoded_kwd = encoding_util.tool_shed_encode( new_kwd )
tsrids_str = ','.join( tsrids_list )
return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
action='initiate_repository_installation',
@@ -1391,7 +1439,7 @@
repository_metadata=None,
metadata=metadata,
repository_dependencies=repository_dependencies )
- repo_info_dict = tool_shed_encode( repo_info_dict )
+ repo_info_dict = encoding_util.tool_shed_encode( repo_info_dict )
new_kwd = dict( includes_tool_dependencies=tool_shed_repository.includes_tool_dependencies,
includes_tools=tool_shed_repository.includes_tools,
install_tool_dependencies=install_tool_dependencies,
@@ -1405,7 +1453,7 @@
tool_panel_section_key=tool_panel_section_key,
tool_shed_repository_ids=[ repository_id ],
tool_shed_url=tool_shed_url )
- encoded_kwd = tool_shed_encode( new_kwd )
+ encoded_kwd = encoding_util.tool_shed_encode( new_kwd )
return trans.response.send_redirect( web.url_for( controller='admin_toolshed',
action='initiate_repository_installation',
shed_repository_ids=repository_id,
@@ -1437,11 +1485,8 @@
# Handle case where the repository was previously installed using an older changeset_revsion, but later the repository was updated
# in the tool shed and now we're trying to install the latest changeset revision of the same repository instead of updating the one
# that was previously installed. We'll look in the database instead of on disk since the repository may be uninstalled.
- if len( repo_info_tuple ) == 6:
- description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, tool_dependencies = repo_info_tuple
- repository_dependencies = None
- elif len( repo_info_tuple ) == 7:
- description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = repo_info_tuple
+ description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = \
+ suc.get_repo_info_tuple_contents( repo_info_tuple )
tool_shed = suc.get_tool_shed_from_clone_url( repository_clone_url )
# Get all previous change set revisions from the tool shed for the repository back to, but excluding, the previous valid changeset
# revision to see if it was previously installed using one of them.
@@ -1553,7 +1598,7 @@
install_tool_dependencies_check_box=install_tool_dependencies_check_box,
containers_dict=containers_dict,
tool_panel_section_select_field=tool_panel_section_select_field,
- encoded_repo_info_dict=tool_shed_encode( repo_info_dict ),
+ encoded_repo_info_dict=encoding_util.tool_shed_encode( repo_info_dict ),
repo_info_dict=repo_info_dict,
message=message,
status=status )
diff -r a3ecba6f3e0c1ecc719a42b6bccfa0b32746ba27 -r fbfa0c78ea29b1e8d1ad339ab2d7d6ababb17e2a lib/galaxy/webapps/galaxy/controllers/workflow.py
--- a/lib/galaxy/webapps/galaxy/controllers/workflow.py
+++ b/lib/galaxy/webapps/galaxy/controllers/workflow.py
@@ -14,7 +14,7 @@
from galaxy.util.odict import odict
from galaxy.util.sanitize_html import sanitize_html
from galaxy.util.topsort import topsort, topsort_levels, CycleError
-from galaxy.tool_shed.encoding_util import tool_shed_encode, tool_shed_decode
+from galaxy.tool_shed import encoding_util
from galaxy.workflow.modules import *
from galaxy import model
from galaxy import util
@@ -1044,7 +1044,7 @@
# from a Galaxy tool shed, in which case the value was encoded.
workflow_name = kwd.get( 'workflow_name', '' )
if workflow_name:
- workflow_name = tool_shed_decode( workflow_name )
+ workflow_name = encoding_util.tool_shed_decode( workflow_name )
# The following parameters will have a value only if the import originated
# from a tool shed repository installed locally or from the API.
installed_repository_file = kwd.get( 'installed_repository_file', '' )
@@ -1057,7 +1057,7 @@
if tool_shed_url and not import_button:
# Use urllib (send another request to the tool shed) to retrieve the workflow.
workflow_url = '%s/workflow/import_workflow?repository_metadata_id=%s&workflow_name=%s&open_for_url=true' % \
- ( tool_shed_url, repository_metadata_id, tool_shed_encode( workflow_name ) )
+ ( tool_shed_url, repository_metadata_id, encoding_util.tool_shed_encode( workflow_name ) )
response = urllib2.urlopen( workflow_url )
workflow_text = response.read()
response.close()
@@ -1164,7 +1164,7 @@
# We've received the textual representation of a workflow from a Galaxy tool shed.
message = "Workflow <b>%s</b> imported successfully." % workflow.name
url = '%s/workflow/view_workflow?repository_metadata_id=%s&workflow_name=%s&message=%s' % \
- ( tool_shed_url, repository_metadata_id, tool_shed_encode( workflow_name ), message )
+ ( tool_shed_url, repository_metadata_id, encoding_util.tool_shed_encode( workflow_name ), message )
return trans.response.send_redirect( url )
elif installed_repository_file:
# The workflow was read from a file included with an installed tool shed repository.
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: api/history_contents: temporarily disabling get_display_types
by Bitbucket 17 Dec '12
by Bitbucket 17 Dec '12
17 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/a3ecba6f3e0c/
changeset: a3ecba6f3e0c
user: carlfeberhard
date: 2012-12-17 16:50:34
summary: api/history_contents: temporarily disabling get_display_types
affected #: 1 file
diff -r 4033d81b3311e105f79377cfe64df5861851f5d1 -r a3ecba6f3e0c1ecc719a42b6bccfa0b32746ba27 lib/galaxy/webapps/galaxy/api/history_contents.py
--- a/lib/galaxy/webapps/galaxy/api/history_contents.py
+++ b/lib/galaxy/webapps/galaxy/api/history_contents.py
@@ -196,7 +196,7 @@
hda_dict[ 'meta_files' ] = meta_files
hda_dict[ 'display_apps' ] = get_display_apps( trans, hda )
- hda_dict[ 'display_types' ] = get_display_types( trans, hda )
+ #hda_dict[ 'display_types' ] = get_display_types( trans, hda )
hda_dict[ 'visualizations' ] = hda.get_visualizations()
hda_dict[ 'peek' ] = to_unicode( hda.display_peek() )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/4033d81b3311/
changeset: 4033d81b3311
user: greg
date: 2012-12-14 22:37:42
summary: Missed an import.
affected #: 1 file
diff -r f14ca41c8cf34779d0b89979320488ebe04eb943 -r 4033d81b3311e105f79377cfe64df5861851f5d1 lib/galaxy/tool_shed/tool_dependencies/install_util.py
--- a/lib/galaxy/tool_shed/tool_dependencies/install_util.py
+++ b/lib/galaxy/tool_shed/tool_dependencies/install_util.py
@@ -1,7 +1,7 @@
import sys, os, subprocess, tempfile
import common_util
import fabric_util
-from galaxy.tool_shed.encoding_util import tool_shed_encode
+from galaxy.tool_shed.encoding_util import encoding_sep, tool_shed_encode, tool_shed_decode
from galaxy.model.orm import and_
from galaxy import eggs
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: inithello: More tool shed functional test enhancements.
by Bitbucket 14 Dec '12
by Bitbucket 14 Dec '12
14 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/f14ca41c8cf3/
changeset: f14ca41c8cf3
user: inithello
date: 2012-12-14 22:20:22
summary: More tool shed functional test enhancements.
affected #: 13 files
diff -r 33d4ab5cc642f2bdc5ad8670abf4400063bb8415 -r f14ca41c8cf34779d0b89979320488ebe04eb943 lib/galaxy/visualization/genomes.py
--- a/lib/galaxy/visualization/genomes.py
+++ b/lib/galaxy/visualization/genomes.py
@@ -1,9 +1,11 @@
-import os, re, sys, glob
+import os, re, sys, glob, logging
from bx.seq.twobit import TwoBitFile
from galaxy.util.json import from_json_string
from galaxy import model
from galaxy.util.bunch import Bunch
+log = logging.getLogger( __name__ )
+
# FIXME: copied from tracks.py
# Message strings returned to browser
messages = Bunch(
@@ -166,13 +168,18 @@
self.genomes[ key ] = Genome( key, len_file=f )
# Add genome data (twobit files) to genomes.
- for line in open( os.path.join( app.config.tool_data_path, "twobit.loc" ) ):
- if line.startswith("#"): continue
- val = line.split()
- if len( val ) == 2:
- key, path = val
- if key in self.genomes:
- self.genomes[ key ].twobit_file = path
+ # FIXME: If a galaxy instance does not have ~/tool-data/twobit.loc file, the following error is thrown:
+ # IOError: [Errno 2] No such file or directory: '~/tool-data/twobit.loc'
+ try:
+ for line in open( os.path.join( app.config.tool_data_path, "twobit.loc" ) ):
+ if line.startswith("#"): continue
+ val = line.split()
+ if len( val ) == 2:
+ key, path = val
+ if key in self.genomes:
+ self.genomes[ key ].twobit_file = path
+ except IOError, e:
+ log.exception( str( e ) )
def get_build( self, dbkey ):
""" Returns build for the given key. """
diff -r 33d4ab5cc642f2bdc5ad8670abf4400063bb8415 -r f14ca41c8cf34779d0b89979320488ebe04eb943 test/tool_shed/base/twilltestcase.py
--- a/test/tool_shed/base/twilltestcase.py
+++ b/test/tool_shed/base/twilltestcase.py
@@ -1,6 +1,7 @@
import galaxy.webapps.community.util.hgweb_config
import galaxy.model as galaxy_model
-import common, string, os, re, test_db_util
+import common, string, os, re, test_db_util, simplejson
+import galaxy.util as util
from base.twilltestcase import tc, from_json_string, TwillTestCase, security, urllib
from galaxy.tool_shed.encoding_util import tool_shed_encode
@@ -23,8 +24,10 @@
self.galaxy_host = os.environ.get( 'GALAXY_TEST_HOST' )
self.galaxy_port = os.environ.get( 'GALAXY_TEST_PORT' )
self.galaxy_url = "http://%s:%s" % ( self.galaxy_host, self.galaxy_port )
+ self.shed_tool_data_table_conf = os.environ.get( 'TOOL_SHED_TEST_TOOL_DATA_TABLE_CONF' )
self.file_dir = os.environ.get( 'TOOL_SHED_TEST_FILE_DIR', None )
self.tool_shed_test_file = None
+ self.tool_data_path = os.environ.get( 'GALAXY_TEST_TOOL_DATA_PATH' )
self.shed_tools_dict = {}
self.home()
def browse_category( self, category, strings_displayed=[], strings_not_displayed=[] ):
@@ -439,9 +442,14 @@
repo = hg.repository( ui.ui(), self.get_repo_path( repository ) )
tip_ctx = repo.changectx( repo.changelog.tip() )
return tip_ctx.rev() < 0
+ def reset_installed_repository_metadata( self, repository ):
+ url = '/admin_toolshed/reset_repository_metadata?id=%s' % self.security.encode_id( repository.id )
+ self.visit_galaxy_url( url )
+ self.check_for_strings( [ 'Metadata has been reset' ] )
def reset_repository_metadata( self, repository ):
url = '/repository/reset_all_metadata?id=%s' % self.security.encode_id( repository.id )
self.visit_url( url )
+ self.check_for_strings( [ 'All repository metadata has been reset.' ] )
def revoke_write_access( self, repository, username ):
url = '/repository/manage_repository?user_access_button=Remove&id=%s&remove_auth=%s' % \
( self.security.encode_id( repository.id ), username )
@@ -466,6 +474,10 @@
def tip_has_metadata( self, repository ):
tip = self.get_repository_tip( repository )
return test_db_util.get_repository_metadata_by_repository_id_changeset_revision( repository.id, tip )
+ def update_installed_repository( self, installed_repository, strings_displayed=[], strings_not_displayed=[] ):
+ url = '/admin_toolshed/check_for_updates?id=%s' % self.security.encode_id( installed_repository.id )
+ self.visit_galaxy_url( url )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
def upload_file( self,
repository,
filename,
@@ -482,6 +494,27 @@
tc.formfile( "1", "file_data", self.get_filename( filename, filepath ) )
tc.submit( "upload_button" )
self.check_for_strings( strings_displayed, strings_not_displayed )
+ def verify_installed_repository_metadata_unchanged( self, name, owner ):
+ installed_repository = test_db_util.get_installed_repository_by_name_owner( name, owner )
+ differs = False
+ metadata = installed_repository.metadata
+ self.reset_installed_repository_metadata( installed_repository )
+ new_metadata = installed_repository.metadata
+ # This test assumes that the different metadata components will always appear in the same order. If this is ever not
+ # the case, this test must be updated.
+ for metadata_key in [ 'datatypes', 'tools', 'tool_dependencies', 'repository_dependencies', 'workflows' ]:
+ if ( metadata_key in metadata and metadata_key not in new_metadata ) or \
+ ( metadata_key not in metadata and metadata_key in new_metadata ):
+ differs = True
+ break
+ elif metadata_key not in metadata and metadata_key not in new_metadata:
+ continue
+ else:
+ if metadata[ metadata_key ] != new_metadata[ metadata_key ]:
+ differs = True
+ break
+ if differs:
+ raise AssertionError( 'Metadata for installed repository %s differs after metadata reset.' % name )
def verify_installed_repository_on_browse_page( self, installed_repository, strings_displayed=[], strings_not_displayed=[] ):
url = '/admin_toolshed/browse_repositories'
self.visit_galaxy_url( url )
@@ -491,6 +524,17 @@
installed_repository.tool_shed,
installed_repository.installed_changeset_revision ] )
self.check_for_strings( strings_displayed, strings_not_displayed )
+ def verify_installed_repository_data_table_entries( self, data_tables=[] ):
+ data_table = util.parse_xml( self.shed_tool_data_table_conf )
+ found = False
+ for table_elem in data_table.findall( 'table' ):
+ for data_table in data_tables:
+ if 'name' in table_elem.attrib and table_elem.attrib[ 'name' ] == data_table:
+ file_elem = table_elem.find( 'file' )
+ assert os.path.exists( file_elem.attrib[ 'path' ] ), 'Tool data table file %s not found.' % file_elem.path
+ found = True
+ break
+ assert found, 'No entry for %s in %s.' % ( data_table, self.shed_tool_data_table_conf )
def verify_tool_metadata_for_installed_repository( self, installed_repository, strings_displayed=[], strings_not_displayed=[] ):
repository_id = self.security.encode_id( installed_repository.id )
for tool in installed_repository.metadata[ 'tools' ]:
@@ -499,6 +543,11 @@
url = '/admin_toolshed/view_tool_metadata?repository_id=%s&tool_id=%s' % ( repository_id, urllib.quote_plus( tool[ 'id' ] ) )
self.visit_galaxy_url( url )
self.check_for_strings( strings, strings_not_displayed )
+ def verify_unchanged_repository_metadata( self, repository ):
+ self.check_repository_changelog( repository )
+ html = self.last_page()
+ self.reset_repository_metadata( repository )
+ self.check_repository_changelog( repository, strings_displayed=[ html ] )
def visit_galaxy_url( self, url ):
url = '%s%s' % ( self.galaxy_url, url )
self.visit_url( url )
diff -r 33d4ab5cc642f2bdc5ad8670abf4400063bb8415 -r f14ca41c8cf34779d0b89979320488ebe04eb943 test/tool_shed/functional/test_0000_basic_repository_features.py
--- a/test/tool_shed/functional/test_0000_basic_repository_features.py
+++ b/test/tool_shed/functional/test_0000_basic_repository_features.py
@@ -155,3 +155,7 @@
tip_changeset = self.get_repository_tip( repository )
search_fields = dict( tool_id='Filter1', tool_name='filter', tool_version='2.2.0' )
self.search_for_valid_tools( search_fields=search_fields, strings_displayed=[ tip_changeset ], strings_not_displayed=[] )
+ def test_0085_verify_repository_metadata( self ):
+ '''Verify that resetting the metadata does not change it.'''
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ self.verify_unchanged_repository_metadata( repository )
diff -r 33d4ab5cc642f2bdc5ad8670abf4400063bb8415 -r f14ca41c8cf34779d0b89979320488ebe04eb943 test/tool_shed/functional/test_0020_basic_repository_dependencies.py
--- a/test/tool_shed/functional/test_0020_basic_repository_dependencies.py
+++ b/test/tool_shed/functional/test_0020_basic_repository_dependencies.py
@@ -68,3 +68,9 @@
changeset_revision = self.get_repository_tip( datatypes_repository )
strings_displayed = [ datatypes_repository_name, common.test_user_1_name, changeset_revision, 'Repository dependencies' ]
self.display_manage_repository_page( repository, strings_displayed=strings_displayed )
+ def test_0040_verify_repository_metadata( self ):
+ '''Verify that resetting the metadata does not change it.'''
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ datatypes_repository = test_db_util.get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
+ self.verify_unchanged_repository_metadata( emboss_repository )
+ self.verify_unchanged_repository_metadata( datatypes_repository )
diff -r 33d4ab5cc642f2bdc5ad8670abf4400063bb8415 -r f14ca41c8cf34779d0b89979320488ebe04eb943 test/tool_shed/functional/test_0030_repository_dependency_revisions.py
--- a/test/tool_shed/functional/test_0030_repository_dependency_revisions.py
+++ b/test/tool_shed/functional/test_0030_repository_dependency_revisions.py
@@ -131,3 +131,11 @@
self.display_manage_repository_page( repository,
changeset_revision=changeset_revision,
strings_displayed=[ str( metadata ) for metadata in repository_dependency_metadata ] )
+ def test_0040_verify_repository_metadata( self ):
+ '''Verify that resetting the metadata does not change it.'''
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ emboss_5_repository = test_db_util.get_repository_by_name_and_owner( emboss_5_repository_name, common.test_user_1_name )
+ emboss_6_repository = test_db_util.get_repository_by_name_and_owner( emboss_6_repository_name, common.test_user_1_name )
+ datatypes_repository = test_db_util.get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
+ for repository in [ emboss_repository, emboss_5_repository, emboss_6_repository, datatypes_repository ]:
+ self.verify_unchanged_repository_metadata( repository )
diff -r 33d4ab5cc642f2bdc5ad8670abf4400063bb8415 -r f14ca41c8cf34779d0b89979320488ebe04eb943 test/tool_shed/functional/test_0040_repository_circular_dependencies.py
--- a/test/tool_shed/functional/test_0040_repository_circular_dependencies.py
+++ b/test/tool_shed/functional/test_0040_repository_circular_dependencies.py
@@ -97,3 +97,9 @@
# In this case, the displayed dependency will specify the tip revision, but this will not always be the case.
self.check_repository_dependency( filtering_repository, freebayes_repository, self.get_repository_tip( freebayes_repository ) )
self.check_repository_dependency( freebayes_repository, filtering_repository, self.get_repository_tip( filtering_repository ) )
+ def test_0035_verify_repository_metadata( self ):
+ '''Verify that resetting the metadata does not change it.'''
+ freebayes_repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
+ filtering_repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
+ for repository in [ freebayes_repository, filtering_repository ]:
+ self.verify_unchanged_repository_metadata( repository )
diff -r 33d4ab5cc642f2bdc5ad8670abf4400063bb8415 -r f14ca41c8cf34779d0b89979320488ebe04eb943 test/tool_shed/functional/test_0050_circular_n_levels.py
--- a/test/tool_shed/functional/test_0050_circular_n_levels.py
+++ b/test/tool_shed/functional/test_0050_circular_n_levels.py
@@ -147,3 +147,11 @@
for changeset_revision in self.get_repository_metadata_revisions( emboss_repository ):
self.check_repository_dependency( freebayes_repository, emboss_repository, changeset_revision )
self.display_manage_repository_page( freebayes_repository, strings_displayed=[ 'Freebayes depends on the filtering repository.' ] )
+ def test_0035_verify_repository_metadata( self ):
+ '''Verify that resetting the metadata does not change it.'''
+ emboss_datatypes_repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ filtering_repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
+ freebayes_repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
+ for repository in [ emboss_datatypes_repository, emboss_repository, freebayes_repository, filtering_repository ]:
+ self.verify_unchanged_repository_metadata( repository )
diff -r 33d4ab5cc642f2bdc5ad8670abf4400063bb8415 -r f14ca41c8cf34779d0b89979320488ebe04eb943 test/tool_shed/functional/test_0060_workflows.py
--- a/test/tool_shed/functional/test_0060_workflows.py
+++ b/test/tool_shed/functional/test_0060_workflows.py
@@ -54,3 +54,7 @@
commit_message="Uploaded filtering 2.2.0",
remove_repo_files_not_in_tar='No' )
self.load_workflow_image( repository, workflow_name, strings_not_displayed=[ '#EBBCB2' ] )
+ def test_0025_verify_repository_metadata( self ):
+ '''Verify that resetting the metadata does not change it.'''
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ self.verify_unchanged_repository_metadata( repository )
diff -r 33d4ab5cc642f2bdc5ad8670abf4400063bb8415 -r f14ca41c8cf34779d0b89979320488ebe04eb943 test/tool_shed/functional/test_1000_install_basic_repository.py
--- a/test/tool_shed/functional/test_1000_install_basic_repository.py
+++ b/test/tool_shed/functional/test_1000_install_basic_repository.py
@@ -28,4 +28,7 @@
self.verify_installed_repository_on_browse_page( installed_repository )
self.display_installed_repository_manage_page( installed_repository,
strings_displayed=[ 'Installed tool shed repository', 'Tools', 'Filter1' ] )
- self.verify_tool_metadata_for_installed_repository( installed_repository )
\ No newline at end of file
+ self.verify_tool_metadata_for_installed_repository( installed_repository )
+ def test_0025_verify_installed_repository_metadata( self ):
+ '''Verify that resetting the metadata on an installed repository does not change the metadata.'''
+ self.verify_installed_repository_metadata_unchanged( 'filtering_0000', common.test_user_1_name )
diff -r 33d4ab5cc642f2bdc5ad8670abf4400063bb8415 -r f14ca41c8cf34779d0b89979320488ebe04eb943 test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
--- a/test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
+++ b/test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
@@ -25,3 +25,10 @@
strings_displayed=[ 'Installed tool shed repository', 'Tools', 'FreeBayes' ] )
self.check_installed_repository_tool_dependencies( installed_repository, dependencies_installed=False )
self.verify_tool_metadata_for_installed_repository( installed_repository )
+ def test_0020_verify_installed_repository_metadata( self ):
+ '''Verify that resetting the metadata on an installed repository does not change the metadata.'''
+ self.verify_installed_repository_metadata_unchanged( 'freebayes_0010', common.test_user_1_name )
+ def test_0025_verify_sample_files( self ):
+ '''Verify that the installed repository populated shed_tool_data_table.xml and the sample files.'''
+ self.verify_installed_repository_data_table_entries( data_tables=[ 'sam_fa_indexes' ] )
+
diff -r 33d4ab5cc642f2bdc5ad8670abf4400063bb8415 -r f14ca41c8cf34779d0b89979320488ebe04eb943 test/tool_shed/functional/test_1020_install_repository_with_repository_dependencies.py
--- a/test/tool_shed/functional/test_1020_install_repository_with_repository_dependencies.py
+++ b/test/tool_shed/functional/test_1020_install_repository_with_repository_dependencies.py
@@ -25,3 +25,6 @@
strings_displayed=[ 'Installed tool shed repository', 'Tools', 'antigenic' ] )
self.check_installed_repository_tool_dependencies( installed_repository, dependencies_installed=False )
self.verify_tool_metadata_for_installed_repository( installed_repository )
+ def test_0020_verify_installed_repository_metadata( self ):
+ '''Verify that resetting the metadata on an installed repository does not change the metadata.'''
+ self.verify_installed_repository_metadata_unchanged( 'emboss_0020', common.test_user_1_name )
diff -r 33d4ab5cc642f2bdc5ad8670abf4400063bb8415 -r f14ca41c8cf34779d0b89979320488ebe04eb943 test/tool_shed/functional/test_1030_install_repository_with_dependency_revisions.py
--- a/test/tool_shed/functional/test_1030_install_repository_with_dependency_revisions.py
+++ b/test/tool_shed/functional/test_1030_install_repository_with_dependency_revisions.py
@@ -27,3 +27,7 @@
strings_displayed=[ 'Installed tool shed repository', 'Tools', 'antigenic' ] )
self.check_installed_repository_tool_dependencies( installed_repository, dependencies_installed=False )
self.verify_tool_metadata_for_installed_repository( installed_repository )
+ self.update_installed_repository( installed_repository, strings_displayed=[ "there are no updates available" ] )
+ def test_0025_verify_installed_repository_metadata( self ):
+ '''Verify that resetting the metadata on an installed repository does not change the metadata.'''
+ self.verify_installed_repository_metadata_unchanged( 'emboss_0030', common.test_user_1_name )
diff -r 33d4ab5cc642f2bdc5ad8670abf4400063bb8415 -r f14ca41c8cf34779d0b89979320488ebe04eb943 test/tool_shed/functional_tests.py
--- a/test/tool_shed/functional_tests.py
+++ b/test/tool_shed/functional_tests.py
@@ -68,6 +68,14 @@
</toolbox>
'''
+tool_conf_xml = '''<?xml version="1.0"?>
+<toolbox>
+ <section name="Get Data" id="getext">
+ <tool file="data_source/upload.xml"/>
+ </section>
+</toolbox>
+'''
+
tool_data_table_conf_xml_template = '''<?xml version="1.0"?><tables></tables>
@@ -113,8 +121,14 @@
shed_db_path = os.path.join( tempdir, 'database' )
shed_tool_data_table_conf_file = os.environ.get( 'TOOL_SHED_TEST_TOOL_DATA_TABLE_CONF', os.path.join( tool_shed_test_tmp_dir, 'shed_tool_data_table_conf.xml' ) )
galaxy_tool_data_table_conf_file = os.environ.get( 'GALAXY_TEST_TOOL_DATA_TABLE_CONF', os.path.join( tool_shed_test_tmp_dir, 'tool_data_table_conf.xml' ) )
- galaxy_shed_tool_conf_file = os.environ.get( 'GALAXY_TEST_TOOL_CONF', os.path.join( tool_shed_test_tmp_dir, 'test_tool_conf.xml' ) )
+ galaxy_tool_conf_file = os.environ.get( 'GALAXY_TEST_TOOL_CONF', os.path.join( tool_shed_test_tmp_dir, 'test_tool_conf.xml' ) )
+ galaxy_shed_tool_conf_file = os.environ.get( 'GALAXY_TEST_SHED_TOOL_CONF', os.path.join( tool_shed_test_tmp_dir, 'test_shed_tool_conf.xml' ) )
galaxy_tool_sheds_conf_file = os.environ.get( 'GALAXY_TEST_SHED_TOOLS_CONF', os.path.join( tool_shed_test_tmp_dir, 'test_sheds_conf.xml' ) )
+ if 'GALAXY_TEST_TOOL_DATA_PATH' in os.environ:
+ tool_data_path = os.environ.get( 'GALAXY_TEST_TOOL_DATA_PATH' )
+ else:
+ tool_data_path = tempfile.mkdtemp( dir=tool_shed_test_tmp_dir )
+ os.environ[ 'GALAXY_TEST_TOOL_DATA_PATH' ] = tool_data_path
if 'GALAXY_TEST_DBPATH' in os.environ:
galaxy_db_path = os.environ[ 'GALAXY_TEST_DBPATH' ]
else:
@@ -153,7 +167,7 @@
file( galaxy_tool_data_table_conf_file, 'w' ).write( tool_data_table_conf_xml_template )
# Generate the shed_tool_data_table_conf.xml file.
file( shed_tool_data_table_conf_file, 'w' ).write( tool_data_table_conf_xml_template )
-
+ os.environ[ 'TOOL_SHED_TEST_TOOL_DATA_TABLE_CONF' ] = shed_tool_data_table_conf_file
# ---- Build Tool Shed Application --------------------------------------------------
toolshedapp = None
global_conf = { '__file__' : 'community_wsgi.ini.sample' }
@@ -231,6 +245,8 @@
# ---- Optionally start up a Galaxy instance ------------------------------------------------------
if 'TOOL_SHED_TEST_OMIT_GALAXY' not in os.environ:
+ # Generate the tool_conf.xml file.
+ file( galaxy_tool_conf_file, 'w' ).write( tool_conf_xml )
# Generate the shed_tool_conf.xml file.
tool_sheds_conf_template_parser = string.Template( tool_sheds_conf_xml_template )
tool_sheds_conf_xml = tool_sheds_conf_template_parser.safe_substitute( shed_url=tool_shed_test_host, shed_port=tool_shed_test_port )
@@ -251,10 +267,11 @@
database_engine_option_pool_size = '10',
file_path = galaxy_file_path,
tool_path = tool_path,
+ tool_data_path = tool_data_path,
tool_dependency_dir=galaxy_tool_dependency_dir,
shed_tool_path=galaxy_shed_tool_path,
update_integrated_tool_panel = False,
- tool_config_file = galaxy_shed_tool_conf_file,
+ tool_config_file = [ galaxy_tool_conf_file, galaxy_shed_tool_conf_file ],
tool_sheds_config_file = galaxy_tool_sheds_conf_file,
datatype_converters_config_file = "datatype_converters_conf.xml.sample",
tool_parse_help = False,
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: history panel: do not render body html until hda is expanded
by Bitbucket 14 Dec '12
by Bitbucket 14 Dec '12
14 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/33d4ab5cc642/
changeset: 33d4ab5cc642
user: carlfeberhard
date: 2012-12-14 21:41:51
summary: history panel: do not render body html until hda is expanded
affected #: 1 file
diff -r f45730d9e8904783f5f8a29cf2a2a0c93e5a2047 -r 33d4ab5cc642f2bdc5ad8670abf4400063bb8415 static/scripts/mvc/dataset/hda-base.js
--- a/static/scripts/mvc/dataset/hda-base.js
+++ b/static/scripts/mvc/dataset/hda-base.js
@@ -77,6 +77,7 @@
itemWrapper.append( this._render_warnings() );
itemWrapper.append( this._render_titleBar() );
+
this.body = $( this._render_body() );
itemWrapper.append( this.body );
@@ -321,18 +322,31 @@
},
// ......................................................................... state body renderers
- /** Render the (expanded) body of an HDA, dispatching to other functions based on the HDA state
+ /** Render the enclosing div of the hda body and, if expanded, the html in the body
* @returns {jQuery} rendered DOM
*/
//TODO: only render these on expansion (or already expanded)
_render_body : function(){
- //this.log( this + '_render_body' );
-
var body = $( '<div/>' )
.attr( 'id', 'info-' + this.model.get( 'id' ) )
.addClass( 'historyItemBody' )
- .attr( 'style', 'display: block' );
+ .attr( 'style', 'display: none' );
+ if( this.expanded ){
+ // only render the body html if it's being shown
+ this._render_body_html( body );
+ body.show();
+ }
+ return body;
+ },
+
+ /** Render the (expanded) body of an HDA, dispatching to other functions based on the HDA state
+ * @param {jQuery} body the body element to append the html to
+ */
+ //TODO: only render these on expansion (or already expanded)
+ _render_body_html : function( body ){
+ //this.log( this + '_render_body' );
+ body.html( '' );
//TODO: not a fan of this dispatch
switch( this.model.get( 'state' ) ){
case HistoryDatasetAssociation.STATES.NEW :
@@ -375,13 +389,6 @@
body.append( $( '<div>Error: unknown dataset state "' + this.model.get( 'state' ) + '".</div>' ) );
}
body.append( '<div style="clear: both"></div>' );
-
- if( this.expanded ){
- body.show();
- } else {
- body.hide();
- }
- return body;
},
/** Render inaccessible, not-owned by curr user.
@@ -514,17 +521,17 @@
* @fires body-collapsed when a body has been collapsed
*/
toggleBodyVisibility : function( event, expanded ){
- var hdaView = this,
- $body = this.$el.find( '.historyItemBody' );
- expanded = ( expanded === undefined )?( !$body.is( ':visible' ) ):( expanded );
+ var hdaView = this;
+ this.expanded = ( expanded === undefined )?( !this.body.is( ':visible' ) ):( expanded );
//this.log( 'toggleBodyVisibility, expanded:', expanded, '$body:', $body );
- if( expanded ){
- $body.slideDown( 'fast', function(){
+ if( this.expanded ){
+ hdaView._render_body_html( hdaView.body );
+ this.body.slideDown( 'fast', function(){
hdaView.trigger( 'body-expanded', hdaView.model.get( 'id' ) );
});
} else {
- $body.slideUp( 'fast', function(){
+ this.body.slideUp( 'fast', function(){
hdaView.trigger( 'body-collapsed', hdaView.model.get( 'id' ) );
});
}
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
14 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/f45730d9e890/
changeset: f45730d9e890
user: carlfeberhard
date: 2012-12-14 20:53:41
summary: Make hda name text selectable
affected #: 1 file
diff -r 4b4ea995233684e49259a8126257a2d226b8a026 -r f45730d9e8904783f5f8a29cf2a2a0c93e5a2047 templates/root/alternate_history.mako
--- a/templates/root/alternate_history.mako
+++ b/templates/root/alternate_history.mako
@@ -537,9 +537,6 @@
.historyItemTitle {
text-decoration: underline;
cursor: pointer;
- -webkit-user-select: none;
- -moz-user-select: none;
- -khtml-user-select: none;
}
.historyItemTitle:hover {
text-decoration: underline;
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jgoecks: Remove deprecated parameters from Tophat2 wrapper.
by Bitbucket 14 Dec '12
by Bitbucket 14 Dec '12
14 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/4b4ea9952336/
changeset: 4b4ea9952336
user: jgoecks
date: 2012-12-14 19:10:39
summary: Remove deprecated parameters from Tophat2 wrapper.
affected #: 2 files
diff -r 52ecc79edd361051da70e81d63cb670a3a265dc7 -r 4b4ea995233684e49259a8126257a2d226b8a026 tools/ngs_rna/tophat2_wrapper.py
--- a/tools/ngs_rna/tophat2_wrapper.py
+++ b/tools/ngs_rna/tophat2_wrapper.py
@@ -20,8 +20,6 @@
where each end is 50bp, you should set -r to be 200. There is no default, \
and this parameter is required for paired end runs.')
parser.add_option( '', '--mate-std-dev', dest='mate_std_dev', help='Standard deviation of distribution on inner distances between male pairs.' )
- parser.add_option( '-n', '--transcriptome-mismatches', dest='transcriptome_mismatches' )
- parser.add_option( '', '--genome-read-mismatches', dest='genome_read_mismatches' )
parser.add_option( '', '--read-mismatches', dest='read_mismatches' )
parser.add_option( '', '--bowtie-n', action="store_true", dest='bowtie_n' )
parser.add_option( '', '--report-discordant-pair-alignments', action="store_true", dest='report_discordant_pairs' )
@@ -171,10 +169,6 @@
# need to warn user of this fact
#sys.stdout.write( "Max insertion length and max deletion length options don't work in Tophat v1.2.0\n" )
- if options.transcriptome_mismatches:
- opts += ' --transcriptome-mismatches %i' % int( options.transcriptome_mismatches )
- if options.genome_read_mismatches:
- opts += ' --genome-read-mismatches %i' % int( options.genome_read_mismatches )
if options.read_mismatches:
opts += ' --read-mismatches %i' % int( options.read_mismatches )
if options.bowtie_n:
diff -r 52ecc79edd361051da70e81d63cb670a3a265dc7 -r 4b4ea995233684e49259a8126257a2d226b8a026 tools/ngs_rna/tophat2_wrapper.xml
--- a/tools/ngs_rna/tophat2_wrapper.xml
+++ b/tools/ngs_rna/tophat2_wrapper.xml
@@ -45,8 +45,6 @@
## Set params.
--settings=$params.settingsType
#if $params.settingsType == "full":
- -n $params.transcriptome_mismatches
- --genome-read-mismatches $params.genome_read_mismatches
--read-mismatches $params.read_mismatches
#if str($params.bowtie_n) == "Yes":
--bowtie-n
@@ -167,8 +165,6 @@
<option value="fr-firststrand">FR First Strand</option><option value="fr-secondstrand">FR Second Strand</option></param>
- <param name="transcriptome_mismatches" type="integer" value="2" label="Transcriptome mismatches" help="Maximum number of mismatches allowed when reads are aligned to the transcriptome. When Bowtie2 is used, this number is also used to decide whether or not to further re-align some of the transcriptome-mapped reads to the genome. If the alignment score of the best alignment among multiple candidates for a read is lower than 'bowtie2-min-score', which is internally defined as (max_penalty - 1) * max_mismatches, then the reads will be kept for re-alignment through the rest of the pipeline. You can specify max_penalty via '--b2-mp' option." />
- <param name="genome_read_mismatches" type="integer" value="2" label="Genome read mismatches" help="When whole reads are first mapped on the genome, this many mismatches in each read alignment are allowed. The default is 2. This number is also used to decide whether to further re-align some of the reads (by splitting them into segments) with a similar scoring threshold scheme as described for the --transcriptome-mismatches option above." /><param name="read_mismatches" type="integer" value="2" label="Final read mismatches" help="Final read alignments having more than these many mismatches are discarded." /><param name="bowtie_n" type="select" label="Use bowtie -n mode"><option selected="true" value="No">No</option>
@@ -425,8 +421,6 @@
<param name="ownFile" value="tophat_in1.fasta"/><param name="settingsType" value="full"/><param name="library_type" value="FR Unstranded"/>
- <param name="transcriptome_mismatches" value="2"/>
- <param name="genome_read_mismatches" value="2"/><param name="read_mismatches" value="2"/><param name="bowtie_n" value="No"/><param name="anchor_length" value="8"/>
@@ -478,8 +472,6 @@
<param name="mate_inner_distance" value="20"/><param name="settingsType" value="full"/><param name="library_type" value="FR Unstranded"/>
- <param name="transcriptome_mismatches" value="3"/>
- <param name="genome_read_mismatches" value="4"/><param name="read_mismatches" value="5"/><param name="bowtie_n" value="Yes"/><param name="mate_std_dev" value="20"/>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
14 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/52ecc79edd36/
changeset: 52ecc79edd36
user: jgoecks
date: 2012-12-14 18:47:44
summary: Allow spaces in Cuffdiff group names.
affected #: 2 files
diff -r 3a71d40d7b9922e13c1e2d9d50d4ed6b85408137 -r 52ecc79edd361051da70e81d63cb670a3a265dc7 tools/ngs_rna/cuffdiff_wrapper.py
--- a/tools/ngs_rna/cuffdiff_wrapper.py
+++ b/tools/ngs_rna/cuffdiff_wrapper.py
@@ -172,7 +172,7 @@
if options.groups:
cmd += " --labels "
for label in options.labels:
- cmd += label + ","
+ cmd += '"%s",' % label
cmd = cmd[:-1]
cmd += " " + options.inputA + " "
diff -r 3a71d40d7b9922e13c1e2d9d50d4ed6b85408137 -r 52ecc79edd361051da70e81d63cb670a3a265dc7 tools/ngs_rna/cuffdiff_wrapper.xml
--- a/tools/ngs_rna/cuffdiff_wrapper.xml
+++ b/tools/ngs_rna/cuffdiff_wrapper.xml
@@ -59,7 +59,7 @@
## Replicates.
--labels
#for $group in $group_analysis.groups
- ${group.group}
+ "${group.group}"
#end for
--files
#for $group in $group_analysis.groups
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jgoecks: History importing/exporting: (a) create BAIs when importing BAM datasets and (b) bug fixes and code cleanup.
by Bitbucket 14 Dec '12
by Bitbucket 14 Dec '12
14 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/3a71d40d7b99/
changeset: 3a71d40d7b99
user: jgoecks
date: 2012-12-14 17:48:27
summary: History importing/exporting: (a) create BAIs when importing BAM datasets and (b) bug fixes and code cleanup.
affected #: 4 files
diff -r 4929a37823b5454178bf811b6b65f2216c7ac4c3 -r 3a71d40d7b9922e13c1e2d9d50d4ed6b85408137 lib/galaxy/jobs/__init__.py
--- a/lib/galaxy/jobs/__init__.py
+++ b/lib/galaxy/jobs/__init__.py
@@ -686,7 +686,7 @@
if self.app.config.set_metadata_externally:
self.external_output_metadata.cleanup_external_metadata( self.sa_session )
galaxy.tools.imp_exp.JobExportHistoryArchiveWrapper( self.job_id ).cleanup_after_job( self.sa_session )
- galaxy.tools.imp_exp.JobImportHistoryArchiveWrapper( self.job_id ).cleanup_after_job( self.sa_session )
+ galaxy.tools.imp_exp.JobImportHistoryArchiveWrapper( self.app, self.job_id ).cleanup_after_job()
galaxy.tools.genome_index.GenomeIndexToolWrapper( self.job_id ).postprocessing( self.sa_session, self.app )
self.app.object_store.delete(self.get_job(), base_dir='job_work', entire_dir=True, dir_only=True, extra_dir=str(self.job_id))
except:
diff -r 4929a37823b5454178bf811b6b65f2216c7ac4c3 -r 3a71d40d7b9922e13c1e2d9d50d4ed6b85408137 lib/galaxy/tools/actions/history_imp_exp.py
--- a/lib/galaxy/tools/actions/history_imp_exp.py
+++ b/lib/galaxy/tools/actions/history_imp_exp.py
@@ -34,8 +34,7 @@
archive_dir = os.path.abspath( tempfile.mkdtemp() )
jiha = trans.app.model.JobImportHistoryArchive( job=job, archive_dir=archive_dir )
trans.sa_session.add( jiha )
- job_wrapper = JobImportHistoryArchiveWrapper( job )
-
+
#
# Add parameters to job_parameter table.
#
diff -r 4929a37823b5454178bf811b6b65f2216c7ac4c3 -r 3a71d40d7b9922e13c1e2d9d50d4ed6b85408137 lib/galaxy/tools/actions/metadata.py
--- a/lib/galaxy/tools/actions/metadata.py
+++ b/lib/galaxy/tools/actions/metadata.py
@@ -13,17 +13,14 @@
"""
Execute using a web transaction.
"""
- user_id = None
- if trans.user:
- user_id = trans.user.id
job, odict = self.execute_via_app( tool, trans.app, trans.get_galaxy_session().id,
- trans.history.id, user_id, incoming, set_output_hid,
+ trans.history.id, trans.user, incoming, set_output_hid,
overwrite, history, job_params )
# FIXME: can remove this when logging in execute_via_app method.
trans.log_event( "Added set external metadata job to the job queue, id: %s" % str(job.id), tool_id=job.tool_id )
return job, odict
- def execute_via_app( self, tool, app, session_id, history_id, user_id = None,
+ def execute_via_app( self, tool, app, session_id, history_id, user=None,
incoming = {}, set_output_hid = False, overwrite = True,
history=None, job_params=None ):
"""
@@ -50,8 +47,8 @@
job.session_id = session_id
job.history_id = history_id
job.tool_id = tool.id
- if user_id:
- job.user_id = user_id
+ if user:
+ job.user_id = user.id
if job_params:
job.params = to_json_string( job_params )
start_job_state = job.state #should be job.states.NEW
diff -r 4929a37823b5454178bf811b6b65f2216c7ac4c3 -r 3a71d40d7b9922e13c1e2d9d50d4ed6b85408137 lib/galaxy/tools/imp_exp/__init__.py
--- a/lib/galaxy/tools/imp_exp/__init__.py
+++ b/lib/galaxy/tools/imp_exp/__init__.py
@@ -3,7 +3,7 @@
from galaxy.tools.parameters.basic import UnvalidatedValue
from galaxy.web.framework.helpers import to_unicode
from galaxy.model.item_attrs import UsesAnnotations
-from galaxy.util.json import *
+from galaxy.util.json import from_json_string, to_json_string
from galaxy.web.base.controller import UsesHistoryMixin
log = logging.getLogger(__name__)
@@ -47,10 +47,12 @@
Class provides support for performing jobs that import a history from
an archive.
"""
- def __init__( self, job_id ):
+ def __init__( self, app, job_id ):
+ self.app = app
self.job_id = job_id
+ self.sa_session = self.app.model.context
- def cleanup_after_job( self, db_session ):
+ def cleanup_after_job( self ):
""" Set history, datasets, and jobs' attributes and clean up archive directory. """
#
@@ -88,7 +90,7 @@
# Import history.
#
- jiha = db_session.query( model.JobImportHistoryArchive ).filter_by( job_id=self.job_id ).first()
+ jiha = self.sa_session.query( model.JobImportHistoryArchive ).filter_by( job_id=self.job_id ).first()
if jiha:
try:
archive_dir = jiha.archive_dir
@@ -107,13 +109,13 @@
new_history.importing = True
new_history.hid_counter = history_attrs['hid_counter']
new_history.genome_build = history_attrs['genome_build']
- db_session.add( new_history )
+ self.sa_session.add( new_history )
jiha.history = new_history
- db_session.flush()
+ self.sa_session.flush()
# Add annotation, tags.
if user:
- self.add_item_annotation( db_session, user, new_history, history_attrs[ 'annotation' ] )
+ self.add_item_annotation( self.sa_session, user, new_history, history_attrs[ 'annotation' ] )
"""
TODO: figure out to how add tags to item.
for tag, value in history_attrs[ 'tags' ].items():
@@ -153,16 +155,16 @@
metadata = metadata,
history = new_history,
create_dataset = True,
- sa_session = db_session )
+ sa_session = self.sa_session )
hda.state = hda.states.OK
- db_session.add( hda )
- db_session.flush()
+ self.sa_session.add( hda )
+ self.sa_session.flush()
new_history.add_dataset( hda, genome_build = None )
hda.hid = dataset_attrs['hid'] # Overwrite default hid set when HDA added to history.
# TODO: Is there a way to recover permissions? Is this needed?
#permissions = trans.app.security_agent.history_get_default_permissions( new_history )
#trans.app.security_agent.set_all_dataset_permissions( hda.dataset, permissions )
- db_session.flush()
+ self.sa_session.flush()
# Do security check and move/copy dataset data.
temp_dataset_file_name = \
@@ -177,13 +179,25 @@
# Set tags, annotations.
if user:
- self.add_item_annotation( db_session, user, hda, dataset_attrs[ 'annotation' ] )
+ self.add_item_annotation( self.sa_session, user, hda, dataset_attrs[ 'annotation' ] )
# TODO: Set tags.
"""
for tag, value in dataset_attrs[ 'tags' ].items():
trans.app.tag_handler.apply_item_tags( trans, trans.user, hda, get_tag_str( tag, value ) )
- db_session.flush()
+ self.sa_session.flush()
"""
+
+ # Although metadata is set above, need to set metadata to recover BAI for BAMs.
+ if hda.extension == 'bam':
+ if self.app.config.set_metadata_externally:
+ self.app.datatypes_registry.set_external_metadata_tool.tool_action.execute_via_app(
+ self.app.datatypes_registry.set_external_metadata_tool, self.app, jiha.job.session_id,
+ new_history.id, jiha.job.user, incoming={ 'input1': hda }, overwrite=False
+ )
+ else:
+ message = 'Attributes updated'
+ hda.set_meta()
+ hda.datatype.after_setting_metadata( hda )
#
# Create jobs.
@@ -198,7 +212,7 @@
""" Hook to 'decode' an HDA; method uses history and HID to get the HDA represented by
the encoded object. This only works because HDAs are created above. """
if obj_dct.get( '__HistoryDatasetAssociation__', False ):
- return db_session.query( model.HistoryDatasetAssociation ) \
+ return self.sa_session.query( model.HistoryDatasetAssociation ) \
.filter_by( history=new_history, hid=obj_dct['hid'] ).first()
return obj_dct
jobs_attrs = from_json_string( jobs_attr_str, object_hook=as_hda )
@@ -214,8 +228,8 @@
imported_job.tool_version = job_attrs[ 'tool_version' ]
imported_job.set_state( job_attrs[ 'state' ] )
imported_job.imported = True
- db_session.add( imported_job )
- db_session.flush()
+ self.sa_session.add( imported_job )
+ self.sa_session.flush()
class HistoryDatasetAssociationIDEncoder( simplejson.JSONEncoder ):
""" Custom JSONEncoder for a HistoryDatasetAssociation that encodes an HDA as its ID. """
@@ -235,7 +249,7 @@
# Transform parameter values when necessary.
if isinstance( value, model.HistoryDatasetAssociation ):
# HDA input: use hid to find input.
- input_hda = db_session.query( model.HistoryDatasetAssociation ) \
+ input_hda = self.sa_session.query( model.HistoryDatasetAssociation ) \
.filter_by( history=new_history, hid=value.hid ).first()
value = input_hda.id
#print "added parameter %s-->%s to job %i" % ( name, value, imported_job.id )
@@ -246,22 +260,23 @@
# Connect jobs to output datasets.
for output_hid in job_attrs[ 'output_datasets' ]:
#print "%s job has output dataset %i" % (imported_job.id, output_hid)
- output_hda = db_session.query( model.HistoryDatasetAssociation ) \
+ output_hda = self.sa_session.query( model.HistoryDatasetAssociation ) \
.filter_by( history=new_history, hid=output_hid ).first()
if output_hda:
imported_job.add_output_dataset( output_hda.name, output_hda )
- # Done importing.
- new_history.importing = False
+ self.sa_session.flush()
- db_session.flush()
+ # Done importing.
+ new_history.importing = False
+ self.sa_session.flush()
# Cleanup.
if os.path.exists( archive_dir ):
shutil.rmtree( archive_dir )
except Exception, e:
jiha.job.stderr += "Error cleaning up history import job: %s" % e
- db_session.flush()
+ self.sa_session.flush()
class JobExportHistoryArchiveWrapper( object, UsesHistoryMixin, UsesAnnotations ):
"""
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: carlfeberhard: api/histories, show: remove get_api_value for each dataset in get_dataset_state_summaries
by Bitbucket 14 Dec '12
by Bitbucket 14 Dec '12
14 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/4929a37823b5/
changeset: 4929a37823b5
user: carlfeberhard
date: 2012-12-14 17:05:43
summary: api/histories, show: remove get_api_value for each dataset in get_dataset_state_summaries
affected #: 1 file
diff -r 742aac57ec941aa89ac7ca07548bf531127bc31b -r 4929a37823b5454178bf811b6b65f2216c7ac4c3 lib/galaxy/webapps/galaxy/api/histories.py
--- a/lib/galaxy/webapps/galaxy/api/histories.py
+++ b/lib/galaxy/webapps/galaxy/api/histories.py
@@ -75,14 +75,10 @@
# cycle through datasets saving each ds' state
for dataset in datasets:
- dataset_dict = dataset.get_api_value( view='element' )
- item_state = dataset_dict[ 'state' ]
-
- if not dataset_dict['deleted']:
+ item_state = dataset.state
+ if not dataset.deleted:
state_counts[ item_state ] = state_counts[ item_state ] + 1
-
- state_ids[ item_state ].append( trans.security.encode_id( dataset_dict[ 'id' ] ) )
-
+ state_ids[ item_state ].append( trans.security.encode_id( dataset.id ) )
return ( state_counts, state_ids )
# try to load the history, by most_recently_used or the given id
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Don't munge the Galaxy root's tool_data_table_conf.sml file or the shed_tool_data_table_conf.xml file when running tool shed functional tests.
by Bitbucket 14 Dec '12
by Bitbucket 14 Dec '12
14 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/742aac57ec94/
changeset: 742aac57ec94
user: greg
date: 2012-12-14 16:59:53
summary: Don't munge the Galaxy root's tool_data_table_conf.sml file or the shed_tool_data_table_conf.xml file when running tool shed functional tests.
affected #: 1 file
diff -r a749bcb137928ede156899ca5ef4d2eef6e9f45c -r 742aac57ec941aa89ac7ca07548bf531127bc31b test/tool_shed/functional_tests.py
--- a/test/tool_shed/functional_tests.py
+++ b/test/tool_shed/functional_tests.py
@@ -68,6 +68,11 @@
</toolbox>
'''
+tool_data_table_conf_xml_template = '''<?xml version="1.0"?>
+<tables>
+</tables>
+'''
+
def run_tests( test_config ):
loader = nose.loader.TestLoader( config=test_config )
plug_loader = test_config.plugins.prepareTestLoader( loader )
@@ -95,14 +100,8 @@
if not os.path.isabs( tool_shed_test_file_dir ):
tool_shed_test_file_dir = tool_shed_test_file_dir
ignore_files = ()
- if os.path.exists( 'tool_data_table_conf.test.xml' ):
- tool_data_table_config_path = 'tool_data_table_conf.test.xml'
- else:
- tool_data_table_config_path = 'tool_data_table_conf.xml'
- shed_tool_data_table_config = 'shed_tool_data_table_conf.xml'
tool_dependency_dir = os.environ.get( 'TOOL_SHED_TOOL_DEPENDENCY_DIR', None )
use_distributed_object_store = os.environ.get( 'TOOL_SHED_USE_DISTRIBUTED_OBJECT_STORE', False )
-
if not os.path.isdir( tool_shed_test_tmp_dir ):
os.mkdir( tool_shed_test_tmp_dir )
tool_shed_test_proxy_port = None
@@ -112,6 +111,8 @@
else:
tempdir = tempfile.mkdtemp( dir=tool_shed_test_tmp_dir )
shed_db_path = os.path.join( tempdir, 'database' )
+ shed_tool_data_table_conf_file = os.environ.get( 'TOOL_SHED_TEST_TOOL_DATA_TABLE_CONF', os.path.join( tool_shed_test_tmp_dir, 'shed_tool_data_table_conf.xml' ) )
+ galaxy_tool_data_table_conf_file = os.environ.get( 'GALAXY_TEST_TOOL_DATA_TABLE_CONF', os.path.join( tool_shed_test_tmp_dir, 'tool_data_table_conf.xml' ) )
galaxy_shed_tool_conf_file = os.environ.get( 'GALAXY_TEST_TOOL_CONF', os.path.join( tool_shed_test_tmp_dir, 'test_tool_conf.xml' ) )
galaxy_tool_sheds_conf_file = os.environ.get( 'GALAXY_TEST_SHED_TOOLS_CONF', os.path.join( tool_shed_test_tmp_dir, 'test_sheds_conf.xml' ) )
if 'GALAXY_TEST_DBPATH' in os.environ:
@@ -148,6 +149,11 @@
print "Directory location for hgweb.config:", hgweb_config_dir
+ # Generate the tool_data_table_conf.xml file.
+ file( galaxy_tool_data_table_conf_file, 'w' ).write( tool_data_table_conf_xml_template )
+ # Generate the shed_tool_data_table_conf.xml file.
+ file( shed_tool_data_table_conf_file, 'w' ).write( tool_data_table_conf_xml_template )
+
# ---- Build Tool Shed Application --------------------------------------------------
toolshedapp = None
global_conf = { '__file__' : 'community_wsgi.ini.sample' }
@@ -169,8 +175,8 @@
tool_path=tool_path,
datatype_converters_config_file = 'datatype_converters_conf.xml.sample',
tool_parse_help = False,
- tool_data_table_config_path = tool_data_table_config_path,
- shed_tool_data_table_config = shed_tool_data_table_config,
+ tool_data_table_config_path = galaxy_tool_data_table_conf_file,
+ shed_tool_data_table_config = shed_tool_data_table_conf_file,
log_destination = "stdout",
use_heartbeat = False,
allow_user_creation = True,
@@ -225,10 +231,11 @@
# ---- Optionally start up a Galaxy instance ------------------------------------------------------
if 'TOOL_SHED_TEST_OMIT_GALAXY' not in os.environ:
- # Generate the shed_tool_conf.xml and tool_sheds_conf.xml files
+ # Generate the shed_tool_conf.xml file.
tool_sheds_conf_template_parser = string.Template( tool_sheds_conf_xml_template )
tool_sheds_conf_xml = tool_sheds_conf_template_parser.safe_substitute( shed_url=tool_shed_test_host, shed_port=tool_shed_test_port )
file( galaxy_tool_sheds_conf_file, 'w' ).write( tool_sheds_conf_xml )
+ # Generate the tool_sheds_conf.xml file.
shed_tool_conf_template_parser = string.Template( shed_tool_conf_xml_template )
shed_tool_conf_xml = shed_tool_conf_template_parser.safe_substitute( shed_tool_path=galaxy_shed_tool_path )
file( galaxy_shed_tool_conf_file, 'w' ).write( shed_tool_conf_xml )
@@ -251,8 +258,8 @@
tool_sheds_config_file = galaxy_tool_sheds_conf_file,
datatype_converters_config_file = "datatype_converters_conf.xml.sample",
tool_parse_help = False,
- tool_data_table_config_path = tool_data_table_config_path,
- shed_tool_data_table_config = shed_tool_data_table_config,
+ tool_data_table_config_path = galaxy_tool_data_table_conf_file,
+ shed_tool_data_table_config = shed_tool_data_table_conf_file,
log_destination = "stdout",
use_heartbeat = False,
allow_user_creation = True,
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jgoecks: Decouple set metadata tool from a web transaction and require only an app.
by Bitbucket 14 Dec '12
by Bitbucket 14 Dec '12
14 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/a749bcb13792/
changeset: a749bcb13792
user: jgoecks
date: 2012-12-14 16:31:19
summary: Decouple set metadata tool from a web transaction and require only an app.
affected #: 1 file
diff -r 2d7a64c143d1136fdfa6ed2203c22527b04b5ff1 -r a749bcb137928ede156899ca5ef4d2eef6e9f45c lib/galaxy/tools/actions/metadata.py
--- a/lib/galaxy/tools/actions/metadata.py
+++ b/lib/galaxy/tools/actions/metadata.py
@@ -8,29 +8,50 @@
class SetMetadataToolAction( ToolAction ):
"""Tool action used for setting external metadata on an existing dataset"""
+
+ def execute( self, tool, trans, incoming={}, set_output_hid=False, overwrite=True, history=None, job_params=None ):
+ """
+ Execute using a web transaction.
+ """
+ user_id = None
+ if trans.user:
+ user_id = trans.user.id
+ job, odict = self.execute_via_app( tool, trans.app, trans.get_galaxy_session().id,
+ trans.history.id, user_id, incoming, set_output_hid,
+ overwrite, history, job_params )
+ # FIXME: can remove this when logging in execute_via_app method.
+ trans.log_event( "Added set external metadata job to the job queue, id: %s" % str(job.id), tool_id=job.tool_id )
+ return job, odict
- def execute( self, tool, trans, incoming = {}, set_output_hid = False, overwrite = True, history=None, job_params=None ):
+ def execute_via_app( self, tool, app, session_id, history_id, user_id = None,
+ incoming = {}, set_output_hid = False, overwrite = True,
+ history=None, job_params=None ):
+ """
+ Execute using application.
+ """
for name, value in incoming.iteritems():
- if isinstance( value, trans.app.model.HistoryDatasetAssociation ):
+ if isinstance( value, app.model.HistoryDatasetAssociation ):
dataset = value
dataset_name = name
type = 'hda'
break
- elif isinstance( value, trans.app.model.LibraryDatasetDatasetAssociation ):
+ elif isinstance( value, app.model.LibraryDatasetDatasetAssociation ):
dataset = value
dataset_name = name
type = 'ldda'
break
else:
raise Exception( 'The dataset to set metadata on could not be determined.' )
+
+ sa_session = app.model.context
# Create the job object
- job = trans.app.model.Job()
- job.session_id = trans.get_galaxy_session().id
- job.history_id = trans.history.id
+ job = app.model.Job()
+ job.session_id = session_id
+ job.history_id = history_id
job.tool_id = tool.id
- if trans.user:
- job.user_id = trans.user.id
+ if user_id:
+ job.user_id = user_id
if job_params:
job.params = to_json_string( job_params )
start_job_state = job.state #should be job.states.NEW
@@ -40,26 +61,26 @@
except:
job.tool_version = "1.0.1"
job.state = job.states.WAITING #we need to set job state to something other than NEW, or else when tracking jobs in db it will be picked up before we have added input / output parameters
- trans.sa_session.add( job )
- trans.sa_session.flush() #ensure job.id is available
+ sa_session.add( job )
+ sa_session.flush() #ensure job.id is available
#add parameters to job_parameter table
# Store original dataset state, so we can restore it. A separate table might be better (no chance of 'losing' the original state)?
incoming[ '__ORIGINAL_DATASET_STATE__' ] = dataset.state
external_metadata_wrapper = JobExternalOutputMetadataWrapper( job )
cmd_line = external_metadata_wrapper.setup_external_metadata( dataset,
- trans.sa_session,
+ sa_session,
exec_dir = None,
- tmp_dir = trans.app.config.new_file_path,
- dataset_files_path = trans.app.model.Dataset.file_path,
+ tmp_dir = app.config.new_file_path,
+ dataset_files_path = app.model.Dataset.file_path,
output_fnames = None,
- config_root = trans.app.config.root,
- config_file = trans.app.config.config_file,
- datatypes_config = trans.app.datatypes_registry.integrated_datatypes_configs,
+ config_root = app.config.root,
+ config_file = app.config.config_file,
+ datatypes_config = app.datatypes_registry.integrated_datatypes_configs,
job_metadata = None,
kwds = { 'overwrite' : overwrite } )
incoming[ '__SET_EXTERNAL_METADATA_COMMAND_LINE__' ] = cmd_line
- for name, value in tool.params_to_strings( incoming, trans.app ).iteritems():
+ for name, value in tool.params_to_strings( incoming, app ).iteritems():
job.add_parameter( name, value )
#add the dataset to job_to_input_dataset table
if type == 'hda':
@@ -70,11 +91,12 @@
# i.e. if state was set to 'running' the set metadata job would never run, as it would wait for input (the dataset to set metadata on) to be in a ready state
dataset._state = dataset.states.SETTING_METADATA
job.state = start_job_state #job inputs have been configured, restore initial job state
- trans.sa_session.flush()
+ sa_session.flush()
# Queue the job for execution
- trans.app.job_queue.put( job.id, tool )
- trans.log_event( "Added set external metadata job to the job queue, id: %s" % str(job.id), tool_id=job.tool_id )
+ app.job_queue.put( job.id, tool )
+ # FIXME: need to add event logging to app and log events there rather than trans.
+ #trans.log_event( "Added set external metadata job to the job queue, id: %s" % str(job.id), tool_id=job.tool_id )
#clear e.g. converted files
dataset.datatype.before_setting_metadata( dataset )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Ensure than installed tool dependency information is renderable.
by Bitbucket 14 Dec '12
by Bitbucket 14 Dec '12
14 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/2d7a64c143d1/
changeset: 2d7a64c143d1
user: greg
date: 2012-12-14 16:28:29
summary: Ensure than installed tool dependency information is renderable.
affected #: 2 files
diff -r 4516a0bae905696584040bf9237f1a628400ad37 -r 2d7a64c143d1136fdfa6ed2203c22527b04b5ff1 lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -705,10 +705,6 @@
original_repository_metadata = None
readme_file_names = get_readme_file_names( repository.name )
metadata_dict = { 'shed_config_filename' : shed_config_dict.get( 'config_filename' ) }
- # If we're regenerating metadata for a repository that contains tools, make sure we keep the tool panel section information.
- # Fixme: do we need this?
- #if original_repository_metadata and 'tool_panel_section' in original_repository_metadata:
- # metadata_dict[ 'tool_panel_section' ] = original_repository_metadata[ 'tool_panel_section' ]
readme_files = []
invalid_file_tups = []
invalid_tool_configs = []
diff -r 4516a0bae905696584040bf9237f1a628400ad37 -r 2d7a64c143d1136fdfa6ed2203c22527b04b5ff1 lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
--- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
@@ -414,6 +414,11 @@
message += "if necessary, and try installing the dependency again."
status = "error"
tool_shed_repository = tool_dependency.tool_shed_repository
+ tool_dependency.name = suc.to_safe_string( tool_dependency.name )
+ tool_dependency.version = suc.to_safe_string( tool_dependency.version )
+ tool_dependency.type = suc.to_safe_string( tool_dependency.type )
+ tool_dependency.status = suc.to_safe_string( tool_dependency.status )
+ tool_dependency.error_message = suc.to_safe_string( tool_dependency.error_message )
return trans.fill_template( '/admin/tool_shed_repository/browse_tool_dependency.mako',
repository=tool_shed_repository,
tool_dependency=tool_dependency,
@@ -620,7 +625,7 @@
tool_dependencies=tool_dependencies )
for installed_tool_dependency in installed_tool_dependencies:
if installed_tool_dependency.status == trans.app.model.ToolDependency.installation_status.ERROR:
- message += ' %s' % installed_tool_dependency.error_message
+ message += ' %s' % suc.to_safe_string( installed_tool_dependency.error_message )
tool_dependency_ids = [ trans.security.encode_id( td.id ) for td in tool_dependencies ]
if message:
status = 'error'
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: inithello: Functional tests for repositories with workflows.
by Bitbucket 14 Dec '12
by Bitbucket 14 Dec '12
14 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/4516a0bae905/
changeset: 4516a0bae905
user: inithello
date: 2012-12-14 15:38:23
summary: Functional tests for repositories with workflows.
affected #: 4 files
diff -r 0ec7f0b6dec8707b6f4d114468367c9131e61200 -r 4516a0bae905696584040bf9237f1a628400ad37 test/tool_shed/base/twilltestcase.py
--- a/test/tool_shed/base/twilltestcase.py
+++ b/test/tool_shed/base/twilltestcase.py
@@ -2,6 +2,7 @@
import galaxy.model as galaxy_model
import common, string, os, re, test_db_util
from base.twilltestcase import tc, from_json_string, TwillTestCase, security, urllib
+from galaxy.tool_shed.encoding_util import tool_shed_encode
from galaxy import eggs
eggs.require('mercurial')
@@ -52,8 +53,12 @@
self.check_repository_changelog( repository )
self.check_string_count_in_page( 'Repository metadata is associated with this change set.', metadata_count )
def check_installed_repository_tool_dependencies( self, installed_repository, dependencies_installed=False ):
+ # Tool dependencies are not being installed in these functional tests. If this is changed, the test method will also need to be updated.
strings_not_displayed = []
- strings_displayed = []
+ if not dependencies_installed:
+ strings_displayed = [ 'Missing tool dependencies' ]
+ else:
+ strings_displayed = [ 'Tool dependencies' ]
for dependency in installed_repository.metadata[ 'tool_dependencies' ]:
tool_dependency = installed_repository.metadata[ 'tool_dependencies' ][ dependency ]
strings_displayed.extend( [ tool_dependency[ 'name' ], tool_dependency[ 'version' ], tool_dependency[ 'type' ] ] )
@@ -417,6 +422,12 @@
( self.security.encode_id( repository.id ), tool_xml_path, changeset_revision )
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+ def load_workflow_image( self, repository, workflow_name, strings_displayed=[], strings_not_displayed=[] ):
+ metadata = self.get_repository_metadata( repository )
+ url = '/workflow/generate_workflow_image?repository_metadata_id=%s&workflow_name=%s' % \
+ ( self.security.encode_id( metadata[0].id ), tool_shed_encode( workflow_name ) )
+ self.visit_url( url )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
def preview_repository_in_tool_shed( self, name, owner, changeset_revision=None, strings_displayed=[], strings_not_displayed=[] ):
repository = test_db_util.get_repository_by_name_and_owner( name, owner )
if changeset_revision is None:
diff -r 0ec7f0b6dec8707b6f4d114468367c9131e61200 -r 4516a0bae905696584040bf9237f1a628400ad37 test/tool_shed/functional/test_0060_workflows.py
--- /dev/null
+++ b/test/tool_shed/functional/test_0060_workflows.py
@@ -0,0 +1,56 @@
+from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
+import tool_shed.base.test_db_util as test_db_util
+
+repository_name = 'filtering_0060'
+repository_description = "Galaxy's filtering tool"
+repository_long_description = "Long description of Galaxy's filtering tool"
+workflow_repository_name = 'filtering_workflow_0060'
+workflow_filename = 'Workflow_for_0060_filter_workflow_repository.ga'
+workflow_name = 'Workflow for 0060_filter_workflow_repository'
+
+class TestToolShedWorkflowFeatures( ShedTwillTestCase ):
+ def test_0000_initiate_users( self ):
+ """Create necessary user accounts and login as an admin user."""
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
+ def test_0005_create_categories( self ):
+ """Create categories for this test suite"""
+ self.create_category( 'Test 0060 Workflow Features', 'Test 0060 - Workflow Features' )
+ def test_0010_create_repository( self ):
+ """Create and populate the filtering repository"""
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ self.create_repository( repository_name,
+ repository_description,
+ repository_long_description=repository_long_description,
+ categories=[ 'Test 0060 Workflow Features' ],
+ strings_displayed=[] )
+ def test_0015_upload_workflow( self ):
+ '''Upload a workflow with a missing tool, and verify that the tool specified is marked as missing.'''
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ workflow = file( self.get_filename( 'filtering_workflow/Workflow_for_0060_filter_workflow_repository.ga' ), 'r' ).read()
+ workflow = workflow.replace( '__TEST_TOOL_SHED_URL__', self.url.replace( 'http://', '' ) )
+ workflow_filepath = self.generate_temp_path( 'test_0060', additional_paths=[ 'filtering_workflow' ] )
+ os.makedirs( workflow_filepath )
+ file( os.path.join( workflow_filepath, workflow_filename ), 'w+' ).write( workflow )
+ self.upload_file( repository,
+ workflow_filename,
+ filepath=workflow_filepath,
+ commit_message='Uploaded filtering workflow.' )
+ self.load_workflow_image( repository, workflow_name, strings_displayed=[ '#EBBCB2' ] )
+ def test_0020_upload_tool( self ):
+ '''Upload the missing tool for the workflow in the previous step, and verify that the error is no longer present.'''
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ self.upload_file( repository,
+ 'filtering/filtering_2.2.0.tar',
+ commit_message="Uploaded filtering 2.2.0",
+ remove_repo_files_not_in_tar='No' )
+ self.load_workflow_image( repository, workflow_name, strings_not_displayed=[ '#EBBCB2' ] )
diff -r 0ec7f0b6dec8707b6f4d114468367c9131e61200 -r 4516a0bae905696584040bf9237f1a628400ad37 test/tool_shed/functional_tests.py
--- a/test/tool_shed/functional_tests.py
+++ b/test/tool_shed/functional_tests.py
@@ -224,7 +224,7 @@
log.info( "Embedded web server started" )
# ---- Optionally start up a Galaxy instance ------------------------------------------------------
- if 'TEST_TOOL_SHED_START_GALAXY' in os.environ:
+ if 'TOOL_SHED_TEST_OMIT_GALAXY' not in os.environ:
# Generate the shed_tool_conf.xml and tool_sheds_conf.xml files
tool_sheds_conf_template_parser = string.Template( tool_sheds_conf_xml_template )
tool_sheds_conf_xml = tool_sheds_conf_template_parser.safe_substitute( shed_url=tool_shed_test_host, shed_port=tool_shed_test_port )
@@ -346,16 +346,17 @@
toolshedapp.shutdown()
toolshedapp = None
log.info( "Embedded tool shed application stopped" )
- if galaxy_server:
- log.info( "Shutting down galaxy web server" )
- galaxy_server.server_close()
- galaxy_server = None
- log.info( "Embedded galaxy server stopped" )
- if galaxyapp:
- log.info( "Shutting down galaxy app" )
- galaxyapp.shutdown()
- galaxyapp = None
- log.info( "Embedded galaxy application stopped" )
+ if 'TOOL_SHED_TEST_OMIT_GALAXY' not in os.environ:
+ if galaxy_server:
+ log.info( "Shutting down galaxy web server" )
+ galaxy_server.server_close()
+ galaxy_server = None
+ log.info( "Embedded galaxy server stopped" )
+ if galaxyapp:
+ log.info( "Shutting down galaxy app" )
+ galaxyapp.shutdown()
+ galaxyapp = None
+ log.info( "Embedded galaxy application stopped" )
if 'TOOL_SHED_TEST_NO_CLEANUP' not in os.environ:
try:
for dir in [ tool_shed_test_tmp_dir ]:
diff -r 0ec7f0b6dec8707b6f4d114468367c9131e61200 -r 4516a0bae905696584040bf9237f1a628400ad37 test/tool_shed/test_data/filtering_workflow/Workflow_for_0060_filter_workflow_repository.ga
--- /dev/null
+++ b/test/tool_shed/test_data/filtering_workflow/Workflow_for_0060_filter_workflow_repository.ga
@@ -0,0 +1,60 @@
+{
+ "a_galaxy_workflow": "true",
+ "annotation": "",
+ "format-version": "0.1",
+ "name": "Workflow for 0060_filter_workflow_repository",
+ "steps": {
+ "0": {
+ "annotation": "",
+ "id": 0,
+ "input_connections": {},
+ "inputs": [
+ {
+ "description": "",
+ "name": "Input Dataset"
+ }
+ ],
+ "name": "Input dataset",
+ "outputs": [],
+ "position": {
+ "left": 10,
+ "top": 10
+ },
+ "tool_errors": null,
+ "tool_id": null,
+ "tool_state": "{\"name\": \"Input Dataset\"}",
+ "tool_version": null,
+ "type": "data_input",
+ "user_outputs": []
+ },
+ "1": {
+ "annotation": "",
+ "id": 1,
+ "input_connections": {
+ "input": {
+ "id": 0,
+ "output_name": "output"
+ }
+ },
+ "inputs": [],
+ "name": "Filter",
+ "outputs": [
+ {
+ "name": "out_file1",
+ "type": "input"
+ }
+ ],
+ "position": {
+ "left": 230,
+ "top": 10
+ },
+ "post_job_actions": {},
+ "tool_errors": null,
+ "tool_id": "__TEST_TOOL_SHED_URL__/repos/user1/filtering_0060/Filter1/2.2.0",
+ "tool_state": "{\"__page__\": 0, \"cond\": \"\\\"c1=='chr22'\\\"\", \"chromInfo\": \"\\\"/Users/dave/Documents/workspace/dev-galaxy/tool-data/shared/ucsc/chrom/?.len\\\"\", \"input\": \"null\"}",
+ "tool_version": null,
+ "type": "tool",
+ "user_outputs": []
+ }
+ }
+}
\ No newline at end of file
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jgoecks: Include custom genomes in dbkey field when uploading library datasets.
by Bitbucket 14 Dec '12
by Bitbucket 14 Dec '12
14 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/0ec7f0b6dec8/
changeset: 0ec7f0b6dec8
user: jgoecks
date: 2012-12-14 14:47:08
summary: Include custom genomes in dbkey field when uploading library datasets.
affected #: 1 file
diff -r 1d73c973c9adfa27e1759c280e94c712145e1e03 -r 0ec7f0b6dec8707b6f4d114468367c9131e61200 lib/galaxy/webapps/galaxy/controllers/library_common.py
--- a/lib/galaxy/webapps/galaxy/controllers/library_common.py
+++ b/lib/galaxy/webapps/galaxy/controllers/library_common.py
@@ -944,11 +944,7 @@
# Send list of data formats to the upload form so the "extension" select list can be populated dynamically
file_formats = trans.app.datatypes_registry.upload_file_formats
- # Send list of genome builds to the form so the "dbkey" select list can be populated dynamically
- def get_dbkey_options( last_used_build ):
- for dbkey, build_name in util.dbnames:
- yield build_name, dbkey, ( dbkey==last_used_build )
- dbkeys = get_dbkey_options( last_used_build )
+ dbkeys = trans.app.genomes.get_dbkeys_with_chrom_info( trans )
# Send the current history to the form to enable importing datasets from history to library
history = trans.get_history()
if history is not None:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: When getting updates to an installed tool shed repository that contains tools, automatically load any updated tools into the Galaxy tool panel.
by Bitbucket 13 Dec '12
by Bitbucket 13 Dec '12
13 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/1d73c973c9ad/
changeset: 1d73c973c9ad
user: greg
date: 2012-12-13 23:13:40
summary: When getting updates to an installed tool shed repository that contains tools, automatically load any updated tools into the Galaxy tool panel.
affected #: 3 files
diff -r 97ec62934b6b17e674706f2c41ce4b34032fa338 -r 1d73c973c9adfa27e1759c280e94c712145e1e03 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -397,7 +397,7 @@
# If there is not yet a tool_shed_repository record, we're in the process of installing
# a new repository, so any included tools can be loaded into the tool panel.
can_load_into_panel_dict = True
- tool = self.load_tool( os.path.join( tool_path, path ), guid=guid )
+ tool = self.load_tool( os.path.join( tool_path, path ), guid=guid )
key = 'tool_%s' % str( tool.id )
if can_load_into_panel_dict:
if guid is not None:
@@ -435,9 +435,12 @@
tta = self.app.model.ToolTagAssociation( tool_id=tool.id, tag_id=tag.id )
self.sa_session.add( tta )
self.sa_session.flush()
- if tool.id not in self.tools_by_id:
- # Allow for the same tool to be loaded into multiple places in the tool panel.
- self.tools_by_id[ tool.id ] = tool
+ #if tool.id not in self.tools_by_id:
+ # Allow for the same tool to be loaded into multiple places in the tool panel. We have to handle the case where the tool is contained
+ # in a repository installed from the tool shed, and the Galaxy administrator has retrieved updates to the installed repository. In this
+ # case, the tool may have been updated, but the version was not changed, so the tool should always be reloaded here. We used to only load
+ # the tool if it's it was not found in self.tools_by_id, but performing that check did not enable this scenario.
+ self.tools_by_id[ tool.id ] = tool
if load_panel_dict:
self.__add_tool_to_tool_panel( tool.id, panel_dict, section=isinstance( panel_dict, galaxy.tools.ToolSection ) )
# Always load the tool into the integrated_panel_dict, or it will not be included in the integrated_tool_panel.xml file.
diff -r 97ec62934b6b17e674706f2c41ce4b34032fa338 -r 1d73c973c9adfa27e1759c280e94c712145e1e03 lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -1036,7 +1036,7 @@
return metadata_dict
def generate_tool_panel_dict_from_shed_tool_conf_entries( app, repository ):
"""
- Keep track of the section in the tool panel in which this repository's tools will be contained by parsing the shed-tool_conf in
+ Keep track of the section in the tool panel in which this repository's tools will be contained by parsing the shed_tool_conf in
which the repository's tools are defined and storing the tool panel definition of each tool in the repository. This method is called
only when the repository is being deactivated or uninstalled and allows for activation or reinstallation using the original layout.
"""
@@ -2232,8 +2232,10 @@
sa_session.flush()
return new_tool_dependency
def update_in_shed_tool_config( app, repository ):
- # A tool shed repository is being updated so change the shed_tool_conf file. Parse the config file to generate the entire list
- # of config_elems instead of using the in-memory list.
+ """
+ A tool shed repository is being updated so change the shed_tool_conf file. Parse the config file to generate the entire list
+ of config_elems instead of using the in-memory list.
+ """
shed_conf_dict = repository.get_shed_config_dict( app )
shed_tool_conf = shed_conf_dict[ 'config_filename' ]
tool_path = shed_conf_dict[ 'tool_path' ]
diff -r 97ec62934b6b17e674706f2c41ce4b34032fa338 -r 1d73c973c9adfa27e1759c280e94c712145e1e03 lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
--- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
@@ -327,7 +327,7 @@
shed_util.add_to_tool_panel( trans.app,
repository.name,
repository_clone_url,
- repository.changeset_revision,
+ repository.installed_changeset_revision,
repository_tools_tups,
repository.owner,
shed_tool_conf,
@@ -810,7 +810,7 @@
shed_util.add_to_tool_panel( app=trans.app,
repository_name=tool_shed_repository.name,
repository_clone_url=repository_clone_url,
- changeset_revision=tool_shed_repository.changeset_revision,
+ changeset_revision=tool_shed_repository.installed_changeset_revision,
repository_tools_tups=repository_tools_tups,
owner=tool_shed_repository.owner,
shed_tool_conf=shed_tool_conf,
@@ -1777,7 +1777,20 @@
repository.update_available = False
trans.sa_session.add( repository )
trans.sa_session.flush()
- # Fixme: call shed_util.add_to_tool_panel here?
+ if 'tools' in metadata_dict:
+ tool_panel_dict = metadata_dict.get( 'tool_panel_section', None )
+ if tool_panel_dict is None:
+ tool_panel_dict = suc.generate_tool_panel_dict_from_shed_tool_conf_entries( trans.app, repository )
+ repository_tools_tups = suc.get_repository_tools_tups( trans.app, metadata_dict )
+ shed_util.add_to_tool_panel( app=trans.app,
+ repository_name=repository.name,
+ repository_clone_url=repository_clone_url,
+ changeset_revision=repository.installed_changeset_revision,
+ repository_tools_tups=repository_tools_tups,
+ owner=repository.owner,
+ shed_tool_conf=shed_tool_conf,
+ tool_panel_dict=tool_panel_dict,
+ new_install=False )
# Create tool_dependency records if necessary.
if 'tool_dependencies' in metadata_dict:
tool_dependencies = shed_util.create_tool_dependency_objects( trans.app, repository, relative_install_dir, set_status=False )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Eliminate unnecessary trans object when only the app is needed downstream. More tool shed util refactoring.
by Bitbucket 13 Dec '12
by Bitbucket 13 Dec '12
13 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/97ec62934b6b/
changeset: 97ec62934b6b
user: greg
date: 2012-12-13 22:19:54
summary: Eliminate unnecessary trans object when only the app is needed downstream. More tool shed util refactoring.
affected #: 5 files
diff -r 90b28e58bb11eb65bd4f461e0b380c5921c626e2 -r 97ec62934b6b17e674706f2c41ce4b34032fa338 lib/galaxy/tool_shed/install_manager.py
--- a/lib/galaxy/tool_shed/install_manager.py
+++ b/lib/galaxy/tool_shed/install_manager.py
@@ -39,7 +39,7 @@
root = tree.getroot()
self.tool_shed = suc.clean_tool_shed_url( root.get( 'name' ) )
self.repository_owner = common_util.REPOSITORY_OWNER
- index, self.shed_config_dict = shed_util.get_shed_tool_conf_dict( app, self.migrated_tools_config )
+ index, self.shed_config_dict = suc.get_shed_tool_conf_dict( app, self.migrated_tools_config )
# Since tool migration scripts can be executed any number of times, we need to make sure the appropriate tools are defined in
# tool_conf.xml. If no tools associated with the migration stage are defined, no repositories will be installed on disk.
# The default behavior is that the tool shed is down.
@@ -202,7 +202,7 @@
tool_index_sample_files = shed_util.get_tool_index_sample_files( sample_files )
shed_util.copy_sample_files( self.app, tool_index_sample_files, tool_path=self.tool_path )
sample_files_copied = [ s for s in tool_index_sample_files ]
- repository_tools_tups = shed_util.get_repository_tools_tups( self.app, metadata_dict )
+ repository_tools_tups = suc.get_repository_tools_tups( self.app, metadata_dict )
if repository_tools_tups:
# Handle missing data table entries for tool parameters that are dynamically generated select lists.
repository_tools_tups = shed_util.handle_missing_data_table_entry( self.app, relative_install_dir, self.tool_path, repository_tools_tups )
diff -r 90b28e58bb11eb65bd4f461e0b380c5921c626e2 -r 97ec62934b6b17e674706f2c41ce4b34032fa338 lib/galaxy/util/shed_util.py
--- a/lib/galaxy/util/shed_util.py
+++ b/lib/galaxy/util/shed_util.py
@@ -34,12 +34,12 @@
for elem_entry in elem_list:
config_elems.append( elem_entry )
# Persist the altered shed_tool_config file.
- config_elems_to_xml_file( app, config_elems, shed_tool_conf, tool_path )
+ suc.config_elems_to_xml_file( app, config_elems, shed_tool_conf, tool_path )
def add_to_tool_panel( app, repository_name, repository_clone_url, changeset_revision, repository_tools_tups, owner, shed_tool_conf, tool_panel_dict,
new_install=True ):
"""A tool shed repository is being installed or updated so handle tool panel alterations accordingly."""
# We need to change the in-memory version and the file system version of the shed_tool_conf file.
- index, shed_tool_conf_dict = get_shed_tool_conf_dict( app, shed_tool_conf )
+ index, shed_tool_conf_dict = suc.get_shed_tool_conf_dict( app, shed_tool_conf )
tool_path = shed_tool_conf_dict[ 'tool_path' ]
# Generate the list of ElementTree Element objects for each section or tool.
elem_list = generate_tool_panel_elem_list( repository_name,
@@ -155,17 +155,6 @@
except:
pass
return converter_path, display_path
-def config_elems_to_xml_file( app, config_elems, config_filename, tool_path ):
- # Persist the current in-memory list of config_elems to a file named by the value of config_filename.
- fd, filename = tempfile.mkstemp()
- os.write( fd, '<?xml version="1.0"?>\n' )
- os.write( fd, '<toolbox tool_path="%s">\n' % str( tool_path ) )
- for elem in config_elems:
- os.write( fd, '%s' % util.xml_to_string( elem, pretty=True ) )
- os.write( fd, '</toolbox>\n' )
- os.close( fd )
- shutil.move( filename, os.path.abspath( config_filename ) )
- os.chmod( config_filename, 0644 )
def copy_sample_files( app, sample_files, tool_path=None, sample_files_copied=None, dest_path=None ):
"""
Copy all appropriate files to dest_path in the local Galaxy environment that have not already been copied. Those that have been copied
@@ -289,26 +278,6 @@
set_status=set_status )
tool_dependency_objects.append( tool_dependency )
return tool_dependency_objects
-def generate_tool_elem( tool_shed, repository_name, changeset_revision, owner, tool_file_path, tool, tool_section ):
- if tool_section is not None:
- tool_elem = SubElement( tool_section, 'tool' )
- else:
- tool_elem = Element( 'tool' )
- tool_elem.attrib[ 'file' ] = tool_file_path
- tool_elem.attrib[ 'guid' ] = tool.guid
- tool_shed_elem = SubElement( tool_elem, 'tool_shed' )
- tool_shed_elem.text = tool_shed
- repository_name_elem = SubElement( tool_elem, 'repository_name' )
- repository_name_elem.text = repository_name
- repository_owner_elem = SubElement( tool_elem, 'repository_owner' )
- repository_owner_elem.text = owner
- changeset_revision_elem = SubElement( tool_elem, 'installed_changeset_revision' )
- changeset_revision_elem.text = changeset_revision
- id_elem = SubElement( tool_elem, 'id' )
- id_elem.text = tool.id
- version_elem = SubElement( tool_elem, 'version' )
- version_elem.text = tool.version
- return tool_elem
def generate_tool_panel_elem_list( repository_name, repository_clone_url, changeset_revision, tool_panel_dict, repository_tools_tups, owner='' ):
"""Generate a list of ElementTree Element objects for each section or tool."""
elem_list = []
@@ -340,9 +309,9 @@
if tup_guid == guid:
break
if inside_section:
- tool_elem = generate_tool_elem( tool_shed, repository_name, changeset_revision, owner, tool_file_path, tool, tool_section )
+ tool_elem = suc.generate_tool_elem( tool_shed, repository_name, changeset_revision, owner, tool_file_path, tool, tool_section )
else:
- tool_elem = generate_tool_elem( tool_shed, repository_name, changeset_revision, owner, tool_file_path, tool, None )
+ tool_elem = suc.generate_tool_elem( tool_shed, repository_name, changeset_revision, owner, tool_file_path, tool, None )
if inside_section:
if section_in_elem_list:
elem_list[ index ] = tool_section
@@ -497,34 +466,6 @@
tmp_url = suc.clean_repository_clone_url( repository_clone_url )
tool_shed = tmp_url.split( 'repos' )[ 0 ].rstrip( '/' )
return get_repository_owner( tmp_url )
-def get_repository_tools_tups( app, metadata_dict ):
- repository_tools_tups = []
- index, shed_conf_dict = get_shed_tool_conf_dict( app, metadata_dict.get( 'shed_config_filename' ) )
- if 'tools' in metadata_dict:
- for tool_dict in metadata_dict[ 'tools' ]:
- load_relative_path = relative_path = tool_dict.get( 'tool_config', None )
- if shed_conf_dict.get( 'tool_path' ):
- load_relative_path = os.path.join( shed_conf_dict.get( 'tool_path' ), relative_path )
- guid = tool_dict.get( 'guid', None )
- if relative_path and guid:
- tool = app.toolbox.load_tool( os.path.abspath( load_relative_path ), guid=guid )
- else:
- tool = None
- if tool:
- repository_tools_tups.append( ( relative_path, guid, tool ) )
- return repository_tools_tups
-def get_shed_tool_conf_dict( app, shed_tool_conf ):
- """
- Return the in-memory version of the shed_tool_conf file, which is stored in the config_elems entry
- in the shed_tool_conf_dict associated with the file.
- """
- for index, shed_tool_conf_dict in enumerate( app.toolbox.shed_tool_confs ):
- if shed_tool_conf == shed_tool_conf_dict[ 'config_filename' ]:
- return index, shed_tool_conf_dict
- else:
- file_name = suc.strip_path( shed_tool_conf_dict[ 'config_filename' ] )
- if shed_tool_conf == file_name:
- return index, shed_tool_conf_dict
def get_tool_index_sample_files( sample_files ):
"""Try to return the list of all appropriate tool data sample files included in the repository."""
tool_index_sample_files = []
@@ -839,12 +780,12 @@
for config_elem in config_elems_to_remove:
config_elems.remove( config_elem )
# Persist the altered in-memory version of the tool config.
- config_elems_to_xml_file( trans.app, config_elems, shed_tool_conf, tool_path )
+ suc.config_elems_to_xml_file( trans.app, config_elems, shed_tool_conf, tool_path )
def remove_from_tool_panel( trans, repository, shed_tool_conf, uninstall ):
"""A tool shed repository is being deactivated or uninstalled so handle tool panel alterations accordingly."""
# Determine where the tools are currently defined in the tool panel and store this information so the tools can be displayed
# in the same way when the repository is activated or reinstalled.
- tool_panel_dict = suc.generate_tool_panel_dict_from_shed_tool_conf_entries( trans, repository )
+ tool_panel_dict = suc.generate_tool_panel_dict_from_shed_tool_conf_entries( trans.app, repository )
repository.metadata[ 'tool_panel_section' ] = tool_panel_dict
trans.sa_session.add( repository )
trans.sa_session.flush()
@@ -854,7 +795,7 @@
for guid_to_remove in guids_to_remove:
if guid_to_remove in trans.app.toolbox.tools_by_id:
del trans.app.toolbox.tools_by_id[ guid_to_remove ]
- index, shed_tool_conf_dict = get_shed_tool_conf_dict( trans.app, shed_tool_conf )
+ index, shed_tool_conf_dict = suc.get_shed_tool_conf_dict( trans.app, shed_tool_conf )
if uninstall:
# Remove from the shed_tool_conf file on disk.
remove_from_shed_tool_config( trans, shed_tool_conf_dict, guids_to_remove )
diff -r 90b28e58bb11eb65bd4f461e0b380c5921c626e2 -r 97ec62934b6b17e674706f2c41ce4b34032fa338 lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -479,6 +479,17 @@
else:
message = ''
return message
+def config_elems_to_xml_file( app, config_elems, config_filename, tool_path ):
+ # Persist the current in-memory list of config_elems to a file named by the value of config_filename.
+ fd, filename = tempfile.mkstemp()
+ os.write( fd, '<?xml version="1.0"?>\n' )
+ os.write( fd, '<toolbox tool_path="%s">\n' % str( tool_path ) )
+ for elem in config_elems:
+ os.write( fd, '%s' % util.xml_to_string( elem, pretty=True ) )
+ os.write( fd, '</toolbox>\n' )
+ os.close( fd )
+ shutil.move( filename, os.path.abspath( config_filename ) )
+ os.chmod( config_filename, 0644 )
def copy_disk_sample_files_to_dir( trans, repo_files_dir, dest_path ):
"""Copy all files currently on disk that end with the .sample extension to the directory to which dest_path refers."""
sample_files = []
@@ -570,9 +581,9 @@
repository_dependencies,
metadata.get( 'tool_dependencies', None ) )
return repo_info_dict
-def generate_clone_url_for_installed_repository( trans, repository ):
+def generate_clone_url_for_installed_repository( app, repository ):
"""Generate the URL for cloning a repository that has been installed into a Galaxy instance."""
- tool_shed_url = get_url_from_repository_tool_shed( trans.app, repository )
+ tool_shed_url = get_url_from_repository_tool_shed( app, repository )
return url_join( tool_shed_url, 'repos', repository.owner, repository.name )
def generate_clone_url_for_repository_in_tool_shed( trans, repository ):
"""Generate the URL for cloning a repository that is in the tool shed."""
@@ -949,6 +960,26 @@
handle_existing_tool_dependencies_that_changed_in_update( app, repository, original_tool_dependencies_dict, tool_dependencies_dict )
metadata_dict[ 'tool_dependencies' ] = tool_dependencies_dict
return metadata_dict
+def generate_tool_elem( tool_shed, repository_name, changeset_revision, owner, tool_file_path, tool, tool_section ):
+ if tool_section is not None:
+ tool_elem = SubElement( tool_section, 'tool' )
+ else:
+ tool_elem = Element( 'tool' )
+ tool_elem.attrib[ 'file' ] = tool_file_path
+ tool_elem.attrib[ 'guid' ] = tool.guid
+ tool_shed_elem = SubElement( tool_elem, 'tool_shed' )
+ tool_shed_elem.text = tool_shed
+ repository_name_elem = SubElement( tool_elem, 'repository_name' )
+ repository_name_elem.text = repository_name
+ repository_owner_elem = SubElement( tool_elem, 'repository_owner' )
+ repository_owner_elem.text = owner
+ changeset_revision_elem = SubElement( tool_elem, 'installed_changeset_revision' )
+ changeset_revision_elem.text = changeset_revision
+ id_elem = SubElement( tool_elem, 'id' )
+ id_elem.text = tool.id
+ version_elem = SubElement( tool_elem, 'version' )
+ version_elem.text = tool.version
+ return tool_elem
def generate_tool_guid( repository_clone_url, tool ):
"""
Generate a guid for the installed tool. It is critical that this guid matches the guid for
@@ -1003,14 +1034,14 @@
else:
metadata_dict[ 'tools' ] = [ tool_dict ]
return metadata_dict
-def generate_tool_panel_dict_from_shed_tool_conf_entries( trans, repository ):
+def generate_tool_panel_dict_from_shed_tool_conf_entries( app, repository ):
"""
Keep track of the section in the tool panel in which this repository's tools will be contained by parsing the shed-tool_conf in
which the repository's tools are defined and storing the tool panel definition of each tool in the repository. This method is called
only when the repository is being deactivated or uninstalled and allows for activation or reinstallation using the original layout.
"""
tool_panel_dict = {}
- shed_tool_conf, tool_path, relative_install_dir = get_tool_panel_config_tool_path_install_dir( trans.app, repository )
+ shed_tool_conf, tool_path, relative_install_dir = get_tool_panel_config_tool_path_install_dir( app, repository )
metadata = repository.metadata
# Create a dictionary of tool guid and tool config file name for each tool in the repository.
guids_and_configs = {}
@@ -1386,6 +1417,22 @@
.filter( and_( trans.model.RepositoryMetadata.table.c.repository_id == trans.security.decode_id( id ),
trans.model.RepositoryMetadata.table.c.changeset_revision == changeset_revision ) ) \
.first()
+def get_repository_tools_tups( app, metadata_dict ):
+ repository_tools_tups = []
+ index, shed_conf_dict = get_shed_tool_conf_dict( app, metadata_dict.get( 'shed_config_filename' ) )
+ if 'tools' in metadata_dict:
+ for tool_dict in metadata_dict[ 'tools' ]:
+ load_relative_path = relative_path = tool_dict.get( 'tool_config', None )
+ if shed_conf_dict.get( 'tool_path' ):
+ load_relative_path = os.path.join( shed_conf_dict.get( 'tool_path' ), relative_path )
+ guid = tool_dict.get( 'guid', None )
+ if relative_path and guid:
+ tool = app.toolbox.load_tool( os.path.abspath( load_relative_path ), guid=guid )
+ else:
+ tool = None
+ if tool:
+ repository_tools_tups.append( ( relative_path, guid, tool ) )
+ return repository_tools_tups
def get_relative_path_to_repository_file( root, name, relative_install_dir, work_dir, shed_config_dict, resetting_all_metadata_on_repository ):
if resetting_all_metadata_on_repository:
full_path_to_file = os.path.join( root, name )
@@ -1428,6 +1475,18 @@
relative_path_to_sample_file = relative_path_to_sample_file[ len( tool_path ) + 1 :]
sample_file_metadata_paths.append( relative_path_to_sample_file )
return sample_file_metadata_paths, sample_file_copy_paths
+def get_shed_tool_conf_dict( app, shed_tool_conf ):
+ """
+ Return the in-memory version of the shed_tool_conf file, which is stored in the config_elems entry
+ in the shed_tool_conf_dict associated with the file.
+ """
+ for index, shed_tool_conf_dict in enumerate( app.toolbox.shed_tool_confs ):
+ if shed_tool_conf == shed_tool_conf_dict[ 'config_filename' ]:
+ return index, shed_tool_conf_dict
+ else:
+ file_name = suc.strip_path( shed_tool_conf_dict[ 'config_filename' ] )
+ if shed_tool_conf == file_name:
+ return index, shed_tool_conf_dict
def get_tool_panel_config_tool_path_install_dir( app, repository ):
# Return shed-related tool panel config, the tool_path configured in it, and the relative path to the directory where the
# repository is installed. This method assumes all repository tools are defined in a single shed-related tool panel config.
@@ -1852,7 +1911,7 @@
"""Reset all metadata on a single tool shed repository installed into a Galaxy instance."""
repository = get_installed_tool_shed_repository( trans, id )
tool_shed_url = get_url_from_repository_tool_shed( trans.app, repository )
- repository_clone_url = generate_clone_url_for_installed_repository( trans, repository )
+ repository_clone_url = generate_clone_url_for_installed_repository( trans.app, repository )
tool_path, relative_install_dir = repository.get_tool_relative_path( trans.app )
if relative_install_dir:
original_metadata_dict = repository.metadata
@@ -2178,15 +2237,9 @@
shed_conf_dict = repository.get_shed_config_dict( app )
shed_tool_conf = shed_conf_dict[ 'config_filename' ]
tool_path = shed_conf_dict[ 'tool_path' ]
-
- # TODO Fix this - we should be able to pass only app - we should not need trans...
- #hack for 'trans.app' used in lots of places. These places should just directly use app
- trans = util.bunch.Bunch()
- trans.app = app
-
- tool_panel_dict = generate_tool_panel_dict_from_shed_tool_conf_entries( trans, repository )
+ tool_panel_dict = generate_tool_panel_dict_from_shed_tool_conf_entries( app, repository )
repository_tools_tups = get_repository_tools_tups( app, repository.metadata )
- cleaned_repository_clone_url = clean_repository_clone_url( generate_clone_url_for_installed_repository( trans, repository ) )
+ cleaned_repository_clone_url = clean_repository_clone_url( generate_clone_url_for_installed_repository( app, repository ) )
tool_shed = tool_shed_from_repository_clone_url( cleaned_repository_clone_url )
owner = repository.owner
if not owner:
diff -r 90b28e58bb11eb65bd4f461e0b380c5921c626e2 -r 97ec62934b6b17e674706f2c41ce4b34032fa338 lib/galaxy/webapps/community/controllers/repository.py
--- a/lib/galaxy/webapps/community/controllers/repository.py
+++ b/lib/galaxy/webapps/community/controllers/repository.py
@@ -2,6 +2,7 @@
from time import gmtime, strftime
from datetime import date, datetime
from galaxy import util
+from galaxy.util.odict import odict
from galaxy.web.base.controller import *
from galaxy.web.form_builder import CheckboxField
from galaxy.webapps.community import model
diff -r 90b28e58bb11eb65bd4f461e0b380c5921c626e2 -r 97ec62934b6b17e674706f2c41ce4b34032fa338 lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
--- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
@@ -310,13 +310,13 @@
"""Activate a repository that was deactivated but not uninstalled."""
repository = suc.get_installed_tool_shed_repository( trans, kwd[ 'id' ] )
shed_tool_conf, tool_path, relative_install_dir = suc.get_tool_panel_config_tool_path_install_dir( trans.app, repository )
- repository_clone_url = suc.generate_clone_url_for_installed_repository( trans, repository )
+ repository_clone_url = suc.generate_clone_url_for_installed_repository( trans.app, repository )
repository.deleted = False
repository.status = trans.model.ToolShedRepository.installation_status.INSTALLED
if repository.includes_tools:
metadata = repository.metadata
try:
- repository_tools_tups = shed_util.get_repository_tools_tups( trans.app, metadata )
+ repository_tools_tups = suc.get_repository_tools_tups( trans.app, metadata )
except Exception, e:
error = "Error activating repository %s: %s" % ( repository.name, str( e ) )
log.debug( error )
@@ -795,7 +795,7 @@
tool_index_sample_files = shed_util.get_tool_index_sample_files( sample_files )
shed_util.copy_sample_files( self.app, tool_index_sample_files, tool_path=tool_path )
sample_files_copied = [ str( s ) for s in tool_index_sample_files ]
- repository_tools_tups = shed_util.get_repository_tools_tups( trans.app, metadata_dict )
+ repository_tools_tups = suc.get_repository_tools_tups( trans.app, metadata_dict )
if repository_tools_tups:
# Handle missing data table entries for tool parameters that are dynamically generated select lists.
repository_tools_tups = shed_util.handle_missing_data_table_entry( trans.app, relative_install_dir, tool_path, repository_tools_tups )
@@ -1295,7 +1295,7 @@
new_tool_panel_section = kwd.get( 'new_tool_panel_section', '' )
tool_panel_section = kwd.get( 'tool_panel_section', '' )
shed_tool_conf, tool_path, relative_install_dir = suc.get_tool_panel_config_tool_path_install_dir( trans.app, tool_shed_repository )
- repository_clone_url = suc.generate_clone_url_for_installed_repository( trans, tool_shed_repository )
+ repository_clone_url = suc.generate_clone_url_for_installed_repository( trans.app, tool_shed_repository )
clone_dir = os.path.join( tool_path, self.generate_tool_path( repository_clone_url, tool_shed_repository.installed_changeset_revision ) )
relative_install_dir = os.path.join( clone_dir, tool_shed_repository.name )
tool_shed_url = suc.get_url_from_repository_tool_shed( trans.app, tool_shed_repository )
@@ -1466,7 +1466,7 @@
metadata = tool_shed_repository.metadata
tool_shed_url = suc.get_url_from_repository_tool_shed( trans.app, tool_shed_repository )
ctx_rev = shed_util.get_ctx_rev( tool_shed_url, tool_shed_repository.name, tool_shed_repository.owner, tool_shed_repository.installed_changeset_revision )
- repository_clone_url = suc.generate_clone_url_for_installed_repository( trans, tool_shed_repository )
+ repository_clone_url = suc.generate_clone_url_for_installed_repository( trans.app, tool_shed_repository )
repository_dependencies = self.get_repository_dependencies( trans=trans,
repository_id=repository_id,
repository_name=tool_shed_repository.name,
@@ -1572,7 +1572,7 @@
"""Reset all metadata on a single installed tool shed repository."""
repository = suc.get_installed_tool_shed_repository( trans, id )
tool_shed_url = suc.get_url_from_repository_tool_shed( trans.app, repository )
- repository_clone_url = suc.generate_clone_url_for_installed_repository( trans, repository )
+ repository_clone_url = suc.generate_clone_url_for_installed_repository( trans.app, repository )
tool_path, relative_install_dir = repository.get_tool_relative_path( trans.app )
if relative_install_dir:
original_metadata_dict = repository.metadata
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Tool shed util refactoring and import fixes and cleanup.
by Bitbucket 13 Dec '12
by Bitbucket 13 Dec '12
13 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/90b28e58bb11/
changeset: 90b28e58bb11
user: greg
date: 2012-12-13 22:00:34
summary: Tool shed util refactoring and import fixes and cleanup.
affected #: 5 files
diff -r 7fb4047a3d6be5847f38acba440e4113eb21e12c -r 90b28e58bb11eb65bd4f461e0b380c5921c626e2 lib/galaxy/tool_shed/__init__.py
--- a/lib/galaxy/tool_shed/__init__.py
+++ b/lib/galaxy/tool_shed/__init__.py
@@ -3,6 +3,7 @@
"""
import os
import galaxy.util.shed_util
+import galaxy.util.shed_util_common
from galaxy.model.orm import and_
from galaxy import eggs
@@ -27,7 +28,7 @@
ElementInclude.include( root )
tool_path = root.get( 'tool_path', None )
if tool_path:
- tool_shed = galaxy.util.shed_util.clean_tool_shed_url( tool_shed_repository.tool_shed )
+ tool_shed = galaxy.util.shed_util_common.clean_tool_shed_url( tool_shed_repository.tool_shed )
relative_path = os.path.join( tool_path,
tool_shed,
'repos',
diff -r 7fb4047a3d6be5847f38acba440e4113eb21e12c -r 90b28e58bb11eb65bd4f461e0b380c5921c626e2 lib/galaxy/tool_shed/install_manager.py
--- a/lib/galaxy/tool_shed/install_manager.py
+++ b/lib/galaxy/tool_shed/install_manager.py
@@ -37,7 +37,7 @@
self.tool_shed_install_config = tool_shed_install_config
tree = util.parse_xml( tool_shed_install_config )
root = tree.getroot()
- self.tool_shed = shed_util.clean_tool_shed_url( root.get( 'name' ) )
+ self.tool_shed = suc.clean_tool_shed_url( root.get( 'name' ) )
self.repository_owner = common_util.REPOSITORY_OWNER
index, self.shed_config_dict = shed_util.get_shed_tool_conf_dict( app, self.migrated_tools_config )
# Since tool migration scripts can be executed any number of times, we need to make sure the appropriate tools are defined in
@@ -198,6 +198,7 @@
tool_dependencies = None
if 'tools' in metadata_dict:
sample_files = metadata_dict.get( 'sample_files', [] )
+ sample_files = [ str( s ) for s in sample_files ]
tool_index_sample_files = shed_util.get_tool_index_sample_files( sample_files )
shed_util.copy_sample_files( self.app, tool_index_sample_files, tool_path=self.tool_path )
sample_files_copied = [ s for s in tool_index_sample_files ]
diff -r 7fb4047a3d6be5847f38acba440e4113eb21e12c -r 90b28e58bb11eb65bd4f461e0b380c5921c626e2 lib/galaxy/util/shed_util.py
--- a/lib/galaxy/util/shed_util.py
+++ b/lib/galaxy/util/shed_util.py
@@ -166,11 +166,6 @@
os.close( fd )
shutil.move( filename, os.path.abspath( config_filename ) )
os.chmod( config_filename, 0644 )
-def clean_tool_shed_url( tool_shed_url ):
- if tool_shed_url.find( ':' ) > 0:
- # Eliminate the port, if any, since it will result in an invalid directory name.
- return tool_shed_url.split( ':' )[ 0 ]
- return tool_shed_url.rstrip( '/' )
def copy_sample_files( app, sample_files, tool_path=None, sample_files_copied=None, dest_path=None ):
"""
Copy all appropriate files to dest_path in the local Galaxy environment that have not already been copied. Those that have been copied
@@ -379,53 +374,6 @@
else:
tool_panel_dict[ guid ] = [ tool_section_dict ]
return tool_panel_dict
-def generate_tool_panel_dict_from_shed_tool_conf_entries( trans, repository ):
- """
- Keep track of the section in the tool panel in which this repository's tools will be contained by parsing the shed-tool_conf in
- which the repository's tools are defined and storing the tool panel definition of each tool in the repository. This method is called
- only when the repository is being deactivated or uninstalled and allows for activation or reinstallation using the original layout.
- """
- tool_panel_dict = {}
- shed_tool_conf, tool_path, relative_install_dir = get_tool_panel_config_tool_path_install_dir( trans.app, repository )
- metadata = repository.metadata
- # Create a dictionary of tool guid and tool config file name for each tool in the repository.
- guids_and_configs = {}
- for tool_dict in metadata[ 'tools' ]:
- guid = tool_dict[ 'guid' ]
- tool_config = tool_dict[ 'tool_config' ]
- file_name = suc.strip_path( tool_config )
- guids_and_configs[ guid ] = file_name
- # Parse the shed_tool_conf file in which all of this repository's tools are defined and generate the tool_panel_dict.
- tree = util.parse_xml( shed_tool_conf )
- root = tree.getroot()
- for elem in root:
- if elem.tag == 'tool':
- guid = elem.get( 'guid' )
- if guid in guids_and_configs:
- # The tool is displayed in the tool panel outside of any tool sections.
- tool_section_dict = dict( tool_config=guids_and_configs[ guid ], id='', name='', version='' )
- if guid in tool_panel_dict:
- tool_panel_dict[ guid ].append( tool_section_dict )
- else:
- tool_panel_dict[ guid ] = [ tool_section_dict ]
- elif elem.tag == 'section':
- section_id = elem.get( 'id' ) or ''
- section_name = elem.get( 'name' ) or ''
- section_version = elem.get( 'version' ) or ''
- for section_elem in elem:
- if section_elem.tag == 'tool':
- guid = section_elem.get( 'guid' )
- if guid in guids_and_configs:
- # The tool is displayed in the tool panel inside the current tool section.
- tool_section_dict = dict( tool_config=guids_and_configs[ guid ],
- id=section_id,
- name=section_name,
- version=section_version )
- if guid in tool_panel_dict:
- tool_panel_dict[ guid ].append( tool_section_dict )
- else:
- tool_panel_dict[ guid ] = [ tool_section_dict ]
- return tool_panel_dict
def generate_tool_panel_dict_for_tool_config( guid, tool_config, tool_sections=None ):
"""
Create a dictionary of the following type for a single tool config file name. The intent is to call this method for every tool config
@@ -583,7 +531,7 @@
for s in sample_files:
# The problem with this is that Galaxy does not follow a standard naming convention for file names.
if s.endswith( '.loc.sample' ) or s.endswith( '.xml.sample' ) or s.endswith( '.txt.sample' ):
- tool_index_sample_files.append( s )
+ tool_index_sample_files.append( str( s ) )
return tool_index_sample_files
def get_tool_dependency( trans, id ):
"""Get a tool_dependency from the database via id"""
@@ -598,23 +546,6 @@
if as_string:
return ','.join( tool_dependency_ids )
return tool_dependency_ids
-def get_tool_panel_config_tool_path_install_dir( app, repository ):
- # Return shed-related tool panel config, the tool_path configured in it, and the relative path to the directory where the
- # repository is installed. This method assumes all repository tools are defined in a single shed-related tool panel config.
- tool_shed = clean_tool_shed_url( repository.tool_shed )
- partial_install_dir = '%s/repos/%s/%s/%s' % ( tool_shed, repository.owner, repository.name, repository.installed_changeset_revision )
- # Get the relative tool installation paths from each of the shed tool configs.
- relative_install_dir = None
- shed_config_dict = repository.get_shed_config_dict( app )
- if not shed_config_dict:
- #just pick a semi-random shed config
- for shed_config_dict in app.toolbox.shed_tool_confs:
- if ( repository.dist_to_shed and shed_config_dict['config_filename'] == app.config.migrated_tools_config ) or ( not repository.dist_to_shed and shed_config_dict['config_filename'] != app.config.migrated_tools_config ):
- break
- shed_tool_conf = shed_config_dict[ 'config_filename' ]
- tool_path = shed_config_dict[ 'tool_path' ]
- relative_install_dir = partial_install_dir
- return shed_tool_conf, tool_path, relative_install_dir
def get_tool_path_install_dir( partial_install_dir, shed_tool_conf_dict, tool_dict, config_elems ):
for elem in config_elems:
if elem.tag == 'tool':
@@ -913,7 +844,7 @@
"""A tool shed repository is being deactivated or uninstalled so handle tool panel alterations accordingly."""
# Determine where the tools are currently defined in the tool panel and store this information so the tools can be displayed
# in the same way when the repository is activated or reinstalled.
- tool_panel_dict = generate_tool_panel_dict_from_shed_tool_conf_entries( trans, repository )
+ tool_panel_dict = suc.generate_tool_panel_dict_from_shed_tool_conf_entries( trans, repository )
repository.metadata[ 'tool_panel_section' ] = tool_panel_dict
trans.sa_session.add( repository )
trans.sa_session.flush()
diff -r 7fb4047a3d6be5847f38acba440e4113eb21e12c -r 90b28e58bb11eb65bd4f461e0b380c5921c626e2 lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -328,6 +328,11 @@
if can_delete:
trans.sa_session.delete( repository_metadata )
trans.sa_session.flush()
+def clean_tool_shed_url( tool_shed_url ):
+ if tool_shed_url.find( ':' ) > 0:
+ # Eliminate the port, if any, since it will result in an invalid directory name.
+ return tool_shed_url.split( ':' )[ 0 ]
+ return tool_shed_url.rstrip( '/' )
def clone_repository( repository_clone_url, repository_file_dir, ctx_rev ):
"""Clone the repository up to the specified changeset_revision. No subsequent revisions will be present in the cloned repository."""
try:
@@ -567,8 +572,8 @@
return repo_info_dict
def generate_clone_url_for_installed_repository( trans, repository ):
"""Generate the URL for cloning a repository that has been installed into a Galaxy instance."""
- tool_shed_url = suc.get_url_from_repository_tool_shed( trans.app, repository )
- return suc.url_join( tool_shed_url, 'repos', repository.owner, repository.name )
+ tool_shed_url = get_url_from_repository_tool_shed( trans.app, repository )
+ return url_join( tool_shed_url, 'repos', repository.owner, repository.name )
def generate_clone_url_for_repository_in_tool_shed( trans, repository ):
"""Generate the URL for cloning a repository that is in the tool shed."""
base_url = url_for( '/', qualified=True ).rstrip( '/' )
@@ -689,6 +694,10 @@
original_repository_metadata = None
readme_file_names = get_readme_file_names( repository.name )
metadata_dict = { 'shed_config_filename' : shed_config_dict.get( 'config_filename' ) }
+ # If we're regenerating metadata for a repository that contains tools, make sure we keep the tool panel section information.
+ # Fixme: do we need this?
+ #if original_repository_metadata and 'tool_panel_section' in original_repository_metadata:
+ # metadata_dict[ 'tool_panel_section' ] = original_repository_metadata[ 'tool_panel_section' ]
readme_files = []
invalid_file_tups = []
invalid_tool_configs = []
@@ -994,6 +1003,53 @@
else:
metadata_dict[ 'tools' ] = [ tool_dict ]
return metadata_dict
+def generate_tool_panel_dict_from_shed_tool_conf_entries( trans, repository ):
+ """
+ Keep track of the section in the tool panel in which this repository's tools will be contained by parsing the shed-tool_conf in
+ which the repository's tools are defined and storing the tool panel definition of each tool in the repository. This method is called
+ only when the repository is being deactivated or uninstalled and allows for activation or reinstallation using the original layout.
+ """
+ tool_panel_dict = {}
+ shed_tool_conf, tool_path, relative_install_dir = get_tool_panel_config_tool_path_install_dir( trans.app, repository )
+ metadata = repository.metadata
+ # Create a dictionary of tool guid and tool config file name for each tool in the repository.
+ guids_and_configs = {}
+ for tool_dict in metadata[ 'tools' ]:
+ guid = tool_dict[ 'guid' ]
+ tool_config = tool_dict[ 'tool_config' ]
+ file_name = strip_path( tool_config )
+ guids_and_configs[ guid ] = file_name
+ # Parse the shed_tool_conf file in which all of this repository's tools are defined and generate the tool_panel_dict.
+ tree = util.parse_xml( shed_tool_conf )
+ root = tree.getroot()
+ for elem in root:
+ if elem.tag == 'tool':
+ guid = elem.get( 'guid' )
+ if guid in guids_and_configs:
+ # The tool is displayed in the tool panel outside of any tool sections.
+ tool_section_dict = dict( tool_config=guids_and_configs[ guid ], id='', name='', version='' )
+ if guid in tool_panel_dict:
+ tool_panel_dict[ guid ].append( tool_section_dict )
+ else:
+ tool_panel_dict[ guid ] = [ tool_section_dict ]
+ elif elem.tag == 'section':
+ section_id = elem.get( 'id' ) or ''
+ section_name = elem.get( 'name' ) or ''
+ section_version = elem.get( 'version' ) or ''
+ for section_elem in elem:
+ if section_elem.tag == 'tool':
+ guid = section_elem.get( 'guid' )
+ if guid in guids_and_configs:
+ # The tool is displayed in the tool panel inside the current tool section.
+ tool_section_dict = dict( tool_config=guids_and_configs[ guid ],
+ id=section_id,
+ name=section_name,
+ version=section_version )
+ if guid in tool_panel_dict:
+ tool_panel_dict[ guid ].append( tool_section_dict )
+ else:
+ tool_panel_dict[ guid ] = [ tool_section_dict ]
+ return tool_panel_dict
def generate_workflow_metadata( relative_path, exported_workflow_dict, metadata_dict ):
"""Update the received metadata_dict with changes that have been applied to the received exported_workflow_dict."""
if 'workflows' in metadata_dict:
@@ -1372,6 +1428,23 @@
relative_path_to_sample_file = relative_path_to_sample_file[ len( tool_path ) + 1 :]
sample_file_metadata_paths.append( relative_path_to_sample_file )
return sample_file_metadata_paths, sample_file_copy_paths
+def get_tool_panel_config_tool_path_install_dir( app, repository ):
+ # Return shed-related tool panel config, the tool_path configured in it, and the relative path to the directory where the
+ # repository is installed. This method assumes all repository tools are defined in a single shed-related tool panel config.
+ tool_shed = clean_tool_shed_url( repository.tool_shed )
+ partial_install_dir = '%s/repos/%s/%s/%s' % ( tool_shed, repository.owner, repository.name, repository.installed_changeset_revision )
+ # Get the relative tool installation paths from each of the shed tool configs.
+ relative_install_dir = None
+ shed_config_dict = repository.get_shed_config_dict( app )
+ if not shed_config_dict:
+ #just pick a semi-random shed config
+ for shed_config_dict in app.toolbox.shed_tool_confs:
+ if ( repository.dist_to_shed and shed_config_dict['config_filename'] == app.config.migrated_tools_config ) or ( not repository.dist_to_shed and shed_config_dict['config_filename'] != app.config.migrated_tools_config ):
+ break
+ shed_tool_conf = shed_config_dict[ 'config_filename' ]
+ tool_path = shed_config_dict[ 'tool_path' ]
+ relative_install_dir = partial_install_dir
+ return shed_tool_conf, tool_path, relative_install_dir
def get_tool_shed_from_clone_url( repository_clone_url ):
tmp_url = clean_repository_clone_url( repository_clone_url )
return tmp_url.split( 'repos' )[ 0 ].rstrip( '/' )
@@ -2019,7 +2092,7 @@
str( markupsafe.escape( ''.join( translated ) ) )
return ''.join( translated )
def tool_shed_from_repository_clone_url( repository_clone_url ):
- return suc.clean_repository_clone_url( repository_clone_url ).split( 'repos' )[ 0 ].rstrip( '/' )
+ return clean_repository_clone_url( repository_clone_url ).split( 'repos' )[ 0 ].rstrip( '/' )
def tool_shed_is_this_tool_shed( toolshed_base_url ):
return toolshed_base_url.rstrip( '/' ) == str( url_for( '/', qualified=True ) ).rstrip( '/' )
def translate_string( raw_text, to_html=True ):
@@ -2106,13 +2179,14 @@
shed_tool_conf = shed_conf_dict[ 'config_filename' ]
tool_path = shed_conf_dict[ 'tool_path' ]
+ # TODO Fix this - we should be able to pass only app - we should not need trans...
#hack for 'trans.app' used in lots of places. These places should just directly use app
trans = util.bunch.Bunch()
trans.app = app
tool_panel_dict = generate_tool_panel_dict_from_shed_tool_conf_entries( trans, repository )
repository_tools_tups = get_repository_tools_tups( app, repository.metadata )
- cleaned_repository_clone_url = suc.clean_repository_clone_url( suc.generate_clone_url_for_installed_repository( trans, repository ) )
+ cleaned_repository_clone_url = clean_repository_clone_url( generate_clone_url_for_installed_repository( trans, repository ) )
tool_shed = tool_shed_from_repository_clone_url( cleaned_repository_clone_url )
owner = repository.owner
if not owner:
diff -r 7fb4047a3d6be5847f38acba440e4113eb21e12c -r 90b28e58bb11eb65bd4f461e0b380c5921c626e2 lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
--- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
@@ -309,7 +309,7 @@
def activate_repository( self, trans, **kwd ):
"""Activate a repository that was deactivated but not uninstalled."""
repository = suc.get_installed_tool_shed_repository( trans, kwd[ 'id' ] )
- shed_tool_conf, tool_path, relative_install_dir = shed_util.get_tool_panel_config_tool_path_install_dir( trans.app, repository )
+ shed_tool_conf, tool_path, relative_install_dir = suc.get_tool_panel_config_tool_path_install_dir( trans.app, repository )
repository_clone_url = suc.generate_clone_url_for_installed_repository( trans, repository )
repository.deleted = False
repository.status = trans.model.ToolShedRepository.installation_status.INSTALLED
@@ -460,7 +460,7 @@
remove_from_disk = params.get( 'remove_from_disk', '' )
remove_from_disk_checked = CheckboxField.is_checked( remove_from_disk )
tool_shed_repository = suc.get_installed_tool_shed_repository( trans, kwd[ 'id' ] )
- shed_tool_conf, tool_path, relative_install_dir = shed_util.get_tool_panel_config_tool_path_install_dir( trans.app, tool_shed_repository )
+ shed_tool_conf, tool_path, relative_install_dir = suc.get_tool_panel_config_tool_path_install_dir( trans.app, tool_shed_repository )
if relative_install_dir:
if tool_path:
relative_install_dir = os.path.join( tool_path, relative_install_dir )
@@ -553,7 +553,7 @@
items = tmp_url.split( 'repos' )
tool_shed_url = items[ 0 ]
repo_path = items[ 1 ]
- tool_shed_url = shed_util.clean_tool_shed_url( tool_shed_url )
+ tool_shed_url = suc.clean_tool_shed_url( tool_shed_url )
return suc.url_join( tool_shed_url, 'repos', repo_path, changeset_revision )
@web.json
@web.require_admin
@@ -794,7 +794,7 @@
sample_files = metadata_dict.get( 'sample_files', [] )
tool_index_sample_files = shed_util.get_tool_index_sample_files( sample_files )
shed_util.copy_sample_files( self.app, tool_index_sample_files, tool_path=tool_path )
- sample_files_copied = [ s for s in tool_index_sample_files ]
+ sample_files_copied = [ str( s ) for s in tool_index_sample_files ]
repository_tools_tups = shed_util.get_repository_tools_tups( trans.app, metadata_dict )
if repository_tools_tups:
# Handle missing data table entries for tool parameters that are dynamically generated select lists.
@@ -866,7 +866,7 @@
( repository.name, repository.owner, repository.installed_changeset_revision, ( url_for( '/', qualified=True ) ) ) )
return trans.response.send_redirect( url )
description = util.restore_text( params.get( 'description', repository.description ) )
- shed_tool_conf, tool_path, relative_install_dir = shed_util.get_tool_panel_config_tool_path_install_dir( trans.app, repository )
+ shed_tool_conf, tool_path, relative_install_dir = suc.get_tool_panel_config_tool_path_install_dir( trans.app, repository )
if relative_install_dir:
repo_files_dir = os.path.abspath( os.path.join( tool_path, relative_install_dir, repository.name ) )
else:
@@ -1294,7 +1294,7 @@
install_tool_dependencies = CheckboxField.is_checked( kwd.get( 'install_tool_dependencies', '' ) )
new_tool_panel_section = kwd.get( 'new_tool_panel_section', '' )
tool_panel_section = kwd.get( 'tool_panel_section', '' )
- shed_tool_conf, tool_path, relative_install_dir = shed_util.get_tool_panel_config_tool_path_install_dir( trans.app, tool_shed_repository )
+ shed_tool_conf, tool_path, relative_install_dir = suc.get_tool_panel_config_tool_path_install_dir( trans.app, tool_shed_repository )
repository_clone_url = suc.generate_clone_url_for_installed_repository( trans, tool_shed_repository )
clone_dir = os.path.join( tool_path, self.generate_tool_path( repository_clone_url, tool_shed_repository.installed_changeset_revision ) )
relative_install_dir = os.path.join( clone_dir, tool_shed_repository.name )
@@ -1660,7 +1660,7 @@
message += "Reset all of this reppository's metadata in the tool shed, then set the installed tool versions "
message ++ "from the installed repository's <b>Repository Actions</b> menu. "
status = 'error'
- shed_tool_conf, tool_path, relative_install_dir = shed_util.get_tool_panel_config_tool_path_install_dir( trans.app, repository )
+ shed_tool_conf, tool_path, relative_install_dir = suc.get_tool_panel_config_tool_path_install_dir( trans.app, repository )
repo_files_dir = os.path.abspath( os.path.join( relative_install_dir, repository.name ) )
return trans.fill_template( '/admin/tool_shed_repository/manage_repository.mako',
repository=repository,
@@ -1749,7 +1749,7 @@
if changeset_revision == latest_changeset_revision:
message = "The installed repository named '%s' is current, there are no updates available. " % name
else:
- shed_tool_conf, tool_path, relative_install_dir = shed_util.get_tool_panel_config_tool_path_install_dir( trans.app, repository )
+ shed_tool_conf, tool_path, relative_install_dir = suc.get_tool_panel_config_tool_path_install_dir( trans.app, repository )
if relative_install_dir:
if tool_path:
repo_files_dir = os.path.abspath( os.path.join( tool_path, relative_install_dir, name ) )
@@ -1759,7 +1759,7 @@
repository_clone_url = os.path.join( tool_shed_url, 'repos', owner, name )
shed_util.pull_repository( repo, repository_clone_url, latest_ctx_rev )
suc.update_repository( repo, latest_ctx_rev )
- tool_shed = shed_util.clean_tool_shed_url( tool_shed_url )
+ tool_shed = suc.clean_tool_shed_url( tool_shed_url )
# Update the repository metadata.
metadata_dict, invalid_file_tups = suc.generate_metadata_for_changeset_revision( app=trans.app,
repository=repository,
@@ -1777,12 +1777,13 @@
repository.update_available = False
trans.sa_session.add( repository )
trans.sa_session.flush()
+ # Fixme: call shed_util.add_to_tool_panel here?
# Create tool_dependency records if necessary.
if 'tool_dependencies' in metadata_dict:
tool_dependencies = shed_util.create_tool_dependency_objects( trans.app, repository, relative_install_dir, set_status=False )
message = "The installed repository named '%s' has been updated to change set revision '%s'. " % ( name, latest_changeset_revision )
# See if any tool dependencies can be installed.
- shed_tool_conf, tool_path, relative_install_dir = shed_util.get_tool_panel_config_tool_path_install_dir( trans.app, repository )
+ shed_tool_conf, tool_path, relative_install_dir = suc.get_tool_panel_config_tool_path_install_dir( trans.app, repository )
if repository.missing_tool_dependencies:
message += "Click the name of one of the missing tool dependencies listed below to install tool dependencies."
else:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: inithello: Cleaned up imports in tool_shed/twilltestcase.py.
by Bitbucket 13 Dec '12
by Bitbucket 13 Dec '12
13 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/7fb4047a3d6b/
changeset: 7fb4047a3d6b
user: inithello
date: 2012-12-13 21:19:29
summary: Cleaned up imports in tool_shed/twilltestcase.py.
affected #: 1 file
diff -r b00822d6733f9a4fa93dac20a67d63e56fcc51be -r 7fb4047a3d6be5847f38acba440e4113eb21e12c test/tool_shed/base/twilltestcase.py
--- a/test/tool_shed/base/twilltestcase.py
+++ b/test/tool_shed/base/twilltestcase.py
@@ -1,9 +1,7 @@
import galaxy.webapps.community.util.hgweb_config
import galaxy.model as galaxy_model
-import common, string, os, re
+import common, string, os, re, test_db_util
from base.twilltestcase import tc, from_json_string, TwillTestCase, security, urllib
-from test_db_util import get_repository_by_name_and_owner, get_repository_metadata_by_repository_id_changeset_revision, \
- get_galaxy_repository_by_name_owner_changeset_revision, get_installed_repository_by_name_owner
from galaxy import eggs
eggs.require('mercurial')
@@ -88,7 +86,7 @@
Loop through each tool dictionary in the repository metadata associated with the received changeset_revision.
For each of these, check for a tools attribute, and load the tool metadata page if it exists, then display that tool's page.
'''
- repository_metadata = get_repository_metadata_by_repository_id_changeset_revision( repository.id, changeset_revision )
+ repository_metadata = test_db_util.get_repository_metadata_by_repository_id_changeset_revision( repository.id, changeset_revision )
metadata = repository_metadata.metadata
if 'tools' not in metadata:
raise AssertionError( 'No tools in %s revision %s.' % ( repository.name, changeset_revision ) )
@@ -109,7 +107,7 @@
strings_not_displayed=[] )
def check_repository_invalid_tools_for_changeset_revision( self, repository, changeset_revision, strings_displayed=[], strings_not_displayed=[] ):
'''Load the invalid tool page for each invalid tool associated with this changeset revision and verify the received error messages.'''
- repository_metadata = get_repository_metadata_by_repository_id_changeset_revision( repository.id, changeset_revision )
+ repository_metadata = test_db_util.get_repository_metadata_by_repository_id_changeset_revision( repository.id, changeset_revision )
metadata = repository_metadata.metadata
if 'invalid_tools' not in metadata:
return
@@ -382,7 +380,7 @@
tc.submit( 'user_access_button' )
self.check_for_strings( strings_displayed, strings_not_displayed )
def install_repository( self, name, owner, install_tool_dependencies=False, changeset_revision=None, strings_displayed=[], strings_not_displayed=[] ):
- repository = get_repository_by_name_and_owner( name, owner )
+ repository = test_db_util.get_repository_by_name_and_owner( name, owner )
repository_id = self.security.encode_id( repository.id )
if changeset_revision is None:
changeset_revision = self.get_repository_tip( repository )
@@ -420,7 +418,7 @@
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
def preview_repository_in_tool_shed( self, name, owner, changeset_revision=None, strings_displayed=[], strings_not_displayed=[] ):
- repository = get_repository_by_name_and_owner( name, owner )
+ repository = test_db_util.get_repository_by_name_and_owner( name, owner )
if changeset_revision is None:
changeset_revision = self.get_repository_tip( repository )
self.visit_url( '/repository/preview_tools_in_changeset?repository_id=%s&changeset_revision=%s' % \
@@ -456,7 +454,7 @@
self.check_for_strings( strings_displayed, strings_not_displayed )
def tip_has_metadata( self, repository ):
tip = self.get_repository_tip( repository )
- return get_repository_metadata_by_repository_id_changeset_revision( repository.id, tip )
+ return test_db_util.get_repository_metadata_by_repository_id_changeset_revision( repository.id, tip )
def upload_file( self,
repository,
filename,
@@ -502,7 +500,7 @@
owner = repository.user.username
if changeset_revision is None:
changeset_revision = self.get_repository_tip( repository )
- galaxy_repository = get_galaxy_repository_by_name_owner_changeset_revision( repository_name, owner, changeset_revision )
+ galaxy_repository = test_db_util.get_galaxy_repository_by_name_owner_changeset_revision( repository_name, owner, changeset_revision )
timeout_counter = 0
while galaxy_repository.status not in final_states:
ga_refresh( galaxy_repository )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: inithello: Functional tests for installing tool shed repositories.
by Bitbucket 13 Dec '12
by Bitbucket 13 Dec '12
13 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/b00822d6733f/
changeset: b00822d6733f
user: inithello
date: 2012-12-13 21:14:51
summary: Functional tests for installing tool shed repositories.
affected #: 14 files
diff -r 34f61e53a563e4b2b44b45b94aff8ed2d1e17738 -r b00822d6733f9a4fa93dac20a67d63e56fcc51be test/tool_shed/base/common.py
--- a/test/tool_shed/base/common.py
+++ b/test/tool_shed/base/common.py
@@ -14,4 +14,7 @@
</repositories>
'''
-new_repository_dependencies_line = ''' <repository toolshed="${toolshed_url}" name="${repository_name}" owner="${owner}" changeset_revision="${changeset_revision}" />'''
\ No newline at end of file
+new_repository_dependencies_line = ''' <repository toolshed="${toolshed_url}" name="${repository_name}" owner="${owner}" changeset_revision="${changeset_revision}" />'''
+
+# Set a 3 minute timeout for repository installation. This should be sufficient, since we're not installing tool dependencies.
+repository_installation_timeout = 180
\ No newline at end of file
diff -r 34f61e53a563e4b2b44b45b94aff8ed2d1e17738 -r b00822d6733f9a4fa93dac20a67d63e56fcc51be test/tool_shed/base/test_db_util.py
--- a/test/tool_shed/base/test_db_util.py
+++ b/test/tool_shed/base/test_db_util.py
@@ -32,6 +32,11 @@
galaxy.model.ToolShedRepository.table.c.owner == owner,
galaxy.model.ToolShedRepository.table.c.changeset_revision == changeset_revision ) ) \
.first()
+def get_installed_repository_by_name_owner( repository_name, owner ):
+ return ga_session.query( galaxy.model.ToolShedRepository ) \
+ .filter( and_( galaxy.model.ToolShedRepository.table.c.name == repository_name,
+ galaxy.model.ToolShedRepository.table.c.owner == owner ) ) \
+ .first()
def get_private_role( user ):
for role in user.all_roles():
if role.name == user.email and role.description == 'Private Role for %s' % user.email:
diff -r 34f61e53a563e4b2b44b45b94aff8ed2d1e17738 -r b00822d6733f9a4fa93dac20a67d63e56fcc51be test/tool_shed/base/twilltestcase.py
--- a/test/tool_shed/base/twilltestcase.py
+++ b/test/tool_shed/base/twilltestcase.py
@@ -1,9 +1,9 @@
import galaxy.webapps.community.util.hgweb_config
import galaxy.model as galaxy_model
import common, string, os, re
-from base.twilltestcase import tc, from_json_string, TwillTestCase, security
+from base.twilltestcase import tc, from_json_string, TwillTestCase, security, urllib
from test_db_util import get_repository_by_name_and_owner, get_repository_metadata_by_repository_id_changeset_revision, \
- get_galaxy_repository_by_name_owner_changeset_revision
+ get_galaxy_repository_by_name_owner_changeset_revision, get_installed_repository_by_name_owner
from galaxy import eggs
eggs.require('mercurial')
@@ -53,6 +53,19 @@
def check_count_of_metadata_revisions_associated_with_repository( self, repository, metadata_count ):
self.check_repository_changelog( repository )
self.check_string_count_in_page( 'Repository metadata is associated with this change set.', metadata_count )
+ def check_installed_repository_tool_dependencies( self, installed_repository, dependencies_installed=False ):
+ strings_not_displayed = []
+ strings_displayed = []
+ for dependency in installed_repository.metadata[ 'tool_dependencies' ]:
+ tool_dependency = installed_repository.metadata[ 'tool_dependencies' ][ dependency ]
+ strings_displayed.extend( [ tool_dependency[ 'name' ], tool_dependency[ 'version' ], tool_dependency[ 'type' ] ] )
+ if dependencies_installed:
+ strings_displayed.append( 'Installed' )
+ else:
+ strings_displayed.append( 'Never installed' )
+ url = '/admin_toolshed/manage_repository?id=%s' % self.security.encode_id( installed_repository.id )
+ self.visit_galaxy_url( url )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
def check_repository_changelog( self, repository, strings_displayed=[], strings_not_displayed=[] ):
url = '/repository/view_changelog?id=%s' % self.security.encode_id( repository.id )
self.visit_url( url )
@@ -180,6 +193,15 @@
tc.fv( "1", "selected_files_to_delete", ','.join( files_to_delete ) )
tc.submit( 'select_files_to_delete_button' )
self.check_for_strings( strings_displayed, strings_not_displayed )
+ def display_installed_repository_manage_page( self, installed_repository, strings_displayed=[], strings_not_displayed=[] ):
+ url = '/admin_toolshed/manage_repository?id=%s' % self.security.encode_id( installed_repository.id )
+ self.visit_galaxy_url( url )
+ strings_displayed.extend( [ installed_repository.name,
+ installed_repository.description,
+ installed_repository.owner,
+ installed_repository.tool_shed,
+ installed_repository.installed_changeset_revision ] )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
def display_manage_repository_page( self, repository, changeset_revision=None, strings_displayed=[], strings_not_displayed=[] ):
base_url = '/repository/manage_repository?id=%s' % self.security.encode_id( repository.id )
if changeset_revision is not None:
@@ -359,7 +381,7 @@
tc.fv( "3", "allow_push", '+%s' % username )
tc.submit( 'user_access_button' )
self.check_for_strings( strings_displayed, strings_not_displayed )
- def install_repository( self, name, owner, changeset_revision=None, strings_displayed=[], strings_not_displayed=[] ):
+ def install_repository( self, name, owner, install_tool_dependencies=False, changeset_revision=None, strings_displayed=[], strings_not_displayed=[] ):
repository = get_repository_by_name_and_owner( name, owner )
repository_id = self.security.encode_id( repository.id )
if changeset_revision is None:
@@ -368,6 +390,11 @@
( changeset_revision, repository_id, self.galaxy_url )
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
+ if 'install_tool_dependencies' in self.last_page():
+ if install_tool_dependencies:
+ tc.fv( '1', 'install_tool_dependencies', True )
+ else:
+ tc.fv( '1', 'install_tool_dependencies', False )
tc.submit( 'select_tool_panel_section_button' )
html = self.last_page()
# Since the installation process is by necessity asynchronous, we have to get the parameters to 'manually' initiate the
@@ -381,7 +408,7 @@
url = '/admin_toolshed/manage_repositories?operation=install&tool_shed_repository_ids=%s&encoded_kwd=%s&reinstalling=%s' % \
( iri_ids, encoded_kwd, reinstalling )
self.visit_galaxy_url( url )
- self.wait_for_repository_installation( repository )
+ self.wait_for_repository_installation( repository, changeset_revision )
def load_invalid_tool_page( self, repository, tool_xml, changeset_revision, strings_displayed=[], strings_not_displayed=[] ):
url = '/repository/load_invalid_tool?repository_id=%s&tool_config=%s&changeset_revision=%s' % \
( self.security.encode_id( repository.id ), tool_xml, changeset_revision )
@@ -446,18 +473,42 @@
tc.formfile( "1", "file_data", self.get_filename( filename, filepath ) )
tc.submit( "upload_button" )
self.check_for_strings( strings_displayed, strings_not_displayed )
+ def verify_installed_repository_on_browse_page( self, installed_repository, strings_displayed=[], strings_not_displayed=[] ):
+ url = '/admin_toolshed/browse_repositories'
+ self.visit_galaxy_url( url )
+ strings_displayed.extend( [ installed_repository.name,
+ installed_repository.description,
+ installed_repository.owner,
+ installed_repository.tool_shed,
+ installed_repository.installed_changeset_revision ] )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
+ def verify_tool_metadata_for_installed_repository( self, installed_repository, strings_displayed=[], strings_not_displayed=[] ):
+ repository_id = self.security.encode_id( installed_repository.id )
+ for tool in installed_repository.metadata[ 'tools' ]:
+ strings = list( strings_displayed )
+ strings.extend( [ tool[ 'id' ], tool[ 'description' ], tool[ 'version' ], tool[ 'guid' ], tool[ 'name' ] ] )
+ url = '/admin_toolshed/view_tool_metadata?repository_id=%s&tool_id=%s' % ( repository_id, urllib.quote_plus( tool[ 'id' ] ) )
+ self.visit_galaxy_url( url )
+ self.check_for_strings( strings, strings_not_displayed )
def visit_galaxy_url( self, url ):
url = '%s%s' % ( self.galaxy_url, url )
self.visit_url( url )
- def wait_for_repository_installation( self, repository ):
+ def wait_for_repository_installation( self, repository, changeset_revision ):
final_states = [ galaxy_model.ToolShedRepository.installation_status.ERROR,
galaxy_model.ToolShedRepository.installation_status.INSTALLED,
galaxy_model.ToolShedRepository.installation_status.UNINSTALLED,
galaxy_model.ToolShedRepository.installation_status.DEACTIVATED ]
repository_name = repository.name
owner = repository.user.username
- changeset_revision = self.get_repository_tip( repository )
+ if changeset_revision is None:
+ changeset_revision = self.get_repository_tip( repository )
galaxy_repository = get_galaxy_repository_by_name_owner_changeset_revision( repository_name, owner, changeset_revision )
+ timeout_counter = 0
while galaxy_repository.status not in final_states:
ga_refresh( galaxy_repository )
+ timeout_counter = timeout_counter + 1
+ if timeout_counter > common.repository_installation_timeout:
+ raise AssertionError( 'Repository installation timed out, %d seconds elapsed, repository state is %s.' % \
+ ( timeout_counter, repository.status ) )
+ break
time.sleep( 1 )
diff -r 34f61e53a563e4b2b44b45b94aff8ed2d1e17738 -r b00822d6733f9a4fa93dac20a67d63e56fcc51be test/tool_shed/functional/test_0000_basic_repository_features.py
--- a/test/tool_shed/functional/test_0000_basic_repository_features.py
+++ b/test/tool_shed/functional/test_0000_basic_repository_features.py
@@ -1,5 +1,5 @@
from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
-from tool_shed.base.test_db_util import get_repository_by_name_and_owner, get_user, get_private_role
+import tool_shed.base.test_db_util as test_db_util
repository_name = 'filtering_0000'
repository_description = "Galaxy's filtering tool"
@@ -10,14 +10,14 @@
def test_0000_initiate_users( self ):
"""Create necessary user accounts and login as an admin user."""
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
- test_user_1 = get_user( common.test_user_1_email )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
- test_user_1_private_role = get_private_role( test_user_1 )
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
self.logout()
self.login( email=common.admin_email, username=common.admin_username )
- admin_user = get_user( common.admin_email )
+ admin_user = test_db_util.get_user( common.admin_email )
assert admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
- admin_user_private_role = get_private_role( admin_user )
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
def test_0005_create_categories( self ):
"""Create categories for this test suite"""
self.create_category( 'Test 0000 Basic Repository Features 1', 'Test 0000 Basic Repository Features 1' )
@@ -26,9 +26,9 @@
"""Create the filtering repository"""
self.logout()
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
- test_user_1 = get_user( common.test_user_1_email )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
- test_user_1_private_role = get_private_role( test_user_1 )
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
strings_displayed = [ 'Repository %s' % "'%s'" % repository_name,
'Repository %s has been created' % "'%s'" % repository_name ]
self.create_repository( repository_name,
@@ -38,29 +38,29 @@
strings_displayed=strings_displayed )
def test_0015_edit_repository( self ):
"""Edit the repository name, description, and long description"""
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
new_name = "renamed_filtering"
new_description = "Edited filtering tool"
new_long_description = "Edited long description"
self.edit_repository_information( repository, repo_name=new_name, description=new_description, long_description=new_long_description )
def test_0020_change_repository_category( self ):
"""Change the categories associated with the filtering repository"""
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.edit_repository_categories( repository,
categories_to_add=[ "Test 0000 Basic Repository Features 2" ],
categories_to_remove=[ "Test 0000 Basic Repository Features 1" ] )
def test_0025_grant_write_access( self ):
'''Grant write access to another user'''
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.grant_write_access( repository, usernames=[ common.admin_username ] )
self.revoke_write_access( repository, common.admin_username )
def test_0030_upload_filtering_1_1_0( self ):
"""Upload filtering_1.1.0.tar to the repository"""
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.upload_file( repository, 'filtering/filtering_1.1.0.tar', commit_message="Uploaded filtering 1.1.0" )
def test_0035_verify_repository( self ):
'''Display basic repository pages'''
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
latest_changeset_revision = self.get_repository_tip( repository )
self.check_for_valid_tools( repository, strings_displayed=[ 'Filter1' ] )
self.check_count_of_metadata_revisions_associated_with_repository( repository, metadata_count=1 )
@@ -73,7 +73,7 @@
strings_displayed=[ 'Uploaded filtering 1.1.0', latest_changeset_revision ] )
def test_0040_alter_repository_states( self ):
'''Test toggling the malicious and deprecated repository flags.'''
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.logout()
self.login( email=common.admin_email, username=common.admin_username )
self.set_repository_malicious( repository, set_malicious=True, strings_displayed=[ 'The repository tip has been defined as malicious.' ] )
@@ -93,7 +93,7 @@
set_deprecated=False )
def test_0045_display_repository_tip_file( self ):
'''Display the contents of filtering.xml in the repository tip revision'''
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.display_repository_file_contents( repository=repository,
filename='filtering.xml',
filepath=None,
@@ -101,7 +101,7 @@
strings_not_displayed=[] )
def test_0050_upload_filtering_txt_file( self ):
'''Upload filtering.txt file associated with tool version 1.1.0.'''
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.upload_file( repository,
'filtering/filtering_0000.txt',
commit_message="Uploaded filtering.txt",
@@ -110,7 +110,7 @@
self.display_manage_repository_page( repository, strings_displayed=[ 'Readme file for filtering 1.1.0' ] )
def test_0055_upload_filtering_test_data( self ):
'''Upload filtering test data.'''
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.upload_file( repository, 'filtering/filtering_test_data.tar', commit_message="Uploaded filtering test data", remove_repo_files_not_in_tar='No' )
self.display_repository_file_contents( repository=repository,
filename='1.bed',
@@ -120,14 +120,14 @@
self.check_repository_metadata( repository, tip_only=True )
def test_0060_upload_filtering_2_2_0( self ):
'''Upload filtering version 2.2.0'''
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.upload_file( repository,
'filtering/filtering_2.2.0.tar',
commit_message="Uploaded filtering 2.2.0",
remove_repo_files_not_in_tar='No' )
def test_0065_verify_filtering_repository( self ):
'''Verify the new tool versions and repository metadata.'''
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
tip = self.get_repository_tip( repository )
self.check_for_valid_tools( repository )
strings_displayed = self.get_repository_metadata_revisions( repository ).append( 'Select a revision' )
@@ -137,7 +137,7 @@
self.check_repository_metadata( repository, tip_only=False )
def test_0070_upload_readme_txt_file( self ):
'''Upload readme.txt file associated with tool version 2.2.0.'''
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.upload_file( repository, 'readme.txt', commit_message="Uploaded readme.txt" )
self.display_manage_repository_page( repository, strings_displayed=[ 'This is a readme file.' ] )
# Verify that there is a different readme file for each metadata revision.
@@ -145,13 +145,13 @@
self.display_manage_repository_page( repository, strings_displayed=[ 'Readme file for filtering 1.1.0', 'This is a readme file.' ] )
def test_0075_delete_readme_txt_file( self ):
'''Delete the readme.txt file.'''
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.delete_files_from_repository( repository, filenames=[ 'readme.txt' ] )
self.check_count_of_metadata_revisions_associated_with_repository( repository, metadata_count=2 )
self.display_manage_repository_page( repository, strings_displayed=[ 'Readme file for filtering 1.1.0' ] )
def test_0080_search_for_valid_filter_tool( self ):
'''Search for the filtering tool by tool ID, name, and version.'''
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
tip_changeset = self.get_repository_tip( repository )
search_fields = dict( tool_id='Filter1', tool_name='filter', tool_version='2.2.0' )
self.search_for_valid_tools( search_fields=search_fields, strings_displayed=[ tip_changeset ], strings_not_displayed=[] )
diff -r 34f61e53a563e4b2b44b45b94aff8ed2d1e17738 -r b00822d6733f9a4fa93dac20a67d63e56fcc51be test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py
--- a/test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py
+++ b/test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py
@@ -1,5 +1,5 @@
from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
-from tool_shed.base.test_db_util import get_repository_by_name_and_owner, get_user, get_private_role
+import tool_shed.base.test_db_util as test_db_util
repository_name = 'freebayes_0010'
repository_description = "Galaxy's freebayes tool"
@@ -11,14 +11,14 @@
"""Create necessary user accounts and login as an admin user."""
self.logout()
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
- test_user_1 = get_user( common.test_user_1_email )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
- test_user_1_private_role = get_private_role( test_user_1 )
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
self.logout()
self.login( email=common.admin_email, username=common.admin_username )
- admin_user = get_user( common.admin_email )
+ admin_user = test_db_util.get_user( common.admin_email )
assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
- admin_user_private_role = get_private_role( admin_user )
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
def test_0005_create_category( self ):
"""Create a category for this test suite"""
self.create_category( 'Test 0010 Repository With Tool Dependencies', 'Tests for a repository with tool dependencies.' )
@@ -31,7 +31,7 @@
repository_long_description=repository_long_description,
categories=[ 'Test 0010 Repository With Tool Dependencies' ],
strings_displayed=[] )
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.upload_file( repository,
'freebayes/freebayes.xml',
valid_tools_only=False,
@@ -44,7 +44,7 @@
strings_displayed=[ 'requires an entry', 'tool_data_table_conf.xml' ] )
def test_0015_upload_missing_tool_data_table_conf_file( self ):
'''Upload the missing tool_data_table_conf.xml.sample file to the repository.'''
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.upload_file( repository,
'freebayes/tool_data_table_conf.xml.sample',
valid_tools_only=False,
@@ -57,27 +57,27 @@
strings_displayed=[ 'refers to a file', 'sam_fa_indices.loc' ] )
def test_0020_upload_missing_sample_loc_file( self ):
'''Upload the missing sam_fa_indices.loc.sample file to the repository.'''
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.upload_file( repository,
'freebayes/sam_fa_indices.loc.sample',
strings_displayed=[],
commit_message='Uploaded tool data table .loc file.' )
def test_0025_upload_invalid_tool_dependency_xml( self ):
'''Upload tool_dependencies.xml defining version 0.9.5 of the freebayes package.'''
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.upload_file( repository,
os.path.join( 'freebayes', 'invalid_tool_dependencies', 'tool_dependencies.xml' ),
strings_displayed=[ 'Name, version and type from a tool requirement tag does not match' ],
commit_message='Uploaded invalid tool dependency XML.' )
def test_0030_upload_valid_tool_dependency_xml( self ):
'''Upload tool_dependencies.xml defining version 0.9.4_9696d0ce8a962f7bb61c4791be5ce44312b81cf8 of the freebayes package.'''
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.upload_file( repository,
os.path.join( 'freebayes', 'tool_dependencies.xml' ),
commit_message='Uploaded valid tool dependency XML.' )
def test_0035_verify_tool_dependencies( self ):
'''Verify that the uploaded tool_dependencies.xml specifies the correct package versions.'''
- repository = get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.display_manage_repository_page( repository,
strings_displayed=[ 'freebayes', '0.9.4_9696d0ce8a9', 'samtools', '0.1.18', 'Valid tools' ],
strings_not_displayed=[ 'Invalid tools' ] )
diff -r 34f61e53a563e4b2b44b45b94aff8ed2d1e17738 -r b00822d6733f9a4fa93dac20a67d63e56fcc51be test/tool_shed/functional/test_0020_basic_repository_dependencies.py
--- a/test/tool_shed/functional/test_0020_basic_repository_dependencies.py
+++ b/test/tool_shed/functional/test_0020_basic_repository_dependencies.py
@@ -1,5 +1,5 @@
from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
-from tool_shed.base.test_db_util import get_repository_by_name_and_owner, get_user, get_private_role
+import tool_shed.base.test_db_util as test_db_util
datatypes_repository_name = 'emboss_datatypes_0020'
datatypes_repository_description = "Galaxy applicable data formats used by Emboss tools."
@@ -15,14 +15,14 @@
"""Create necessary user accounts and login as an admin user."""
self.logout()
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
- test_user_1 = get_user( common.test_user_1_email )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % common.test_user_1_email
- test_user_1_private_role = get_private_role( test_user_1 )
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
self.logout()
self.login( email=common.admin_email, username=common.admin_username )
- admin_user = get_user( common.admin_email )
+ admin_user = test_db_util.get_user( common.admin_email )
assert admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
- admin_user_private_role = get_private_role( admin_user )
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
def test_0005_create_category( self ):
"""Create a category for this test suite"""
self.create_category( 'Test 0020 Basic Repository Dependencies', 'Testing basic repository dependency features.' )
@@ -35,11 +35,11 @@
repository_long_description=datatypes_repository_long_description,
categories=[ 'Test 0020 Basic Repository Dependencies' ],
strings_displayed=[] )
- repository = get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
self.upload_file( repository, 'emboss/datatypes/datatypes_conf.xml', commit_message='Uploaded datatypes_conf.xml.' )
def test_0015_verify_datatypes_in_datatypes_repository( self ):
'''Verify that the emboss_datatypes repository contains datatype entries.'''
- repository = get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
self.display_manage_repository_page( repository, strings_displayed=[ 'Datatypes', 'equicktandem', 'hennig86', 'vectorstrip' ] )
def test_0020_create_emboss_5_repository_and_upload_files( self ):
'''Create and populate the emboss_5_0020 repository.'''
@@ -48,12 +48,12 @@
repository_long_description=emboss_repository_long_description,
categories=[ 'Test 0020 Basic Repository Dependencies' ],
strings_displayed=[] )
- repository = get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
self.upload_file( repository, 'emboss/emboss.tar', commit_message='Uploaded emboss_5.tar' )
def test_0025_generate_and_upload_repository_dependencies_xml( self ):
'''Generate and upload the repository_dependencies.xml file'''
- repository = get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
- datatypes_repository = get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ datatypes_repository = test_db_util.get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
repository_dependencies_path = self.generate_temp_path( 'test_0020', additional_paths=[ 'emboss', '5' ] )
self.generate_repository_dependency_xml( [ datatypes_repository ],
self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ) )
@@ -63,8 +63,8 @@
commit_message='Uploaded repository_dependencies.xml' )
def test_0030_verify_emboss_5_repository_dependency_on_emboss_datatypes( self ):
'''Verify that the emboss_5 repository now depends on the emboss_datatypes repository with correct name, owner, and changeset revision.'''
- repository = get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
- datatypes_repository = get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ datatypes_repository = test_db_util.get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
changeset_revision = self.get_repository_tip( datatypes_repository )
strings_displayed = [ datatypes_repository_name, common.test_user_1_name, changeset_revision, 'Repository dependencies' ]
self.display_manage_repository_page( repository, strings_displayed=strings_displayed )
diff -r 34f61e53a563e4b2b44b45b94aff8ed2d1e17738 -r b00822d6733f9a4fa93dac20a67d63e56fcc51be test/tool_shed/functional/test_0030_repository_dependency_revisions.py
--- a/test/tool_shed/functional/test_0030_repository_dependency_revisions.py
+++ b/test/tool_shed/functional/test_0030_repository_dependency_revisions.py
@@ -1,5 +1,5 @@
from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
-from tool_shed.base.test_db_util import get_repository_by_name_and_owner, get_user, get_private_role
+import tool_shed.base.test_db_util as test_db_util
datatypes_repository_name = 'emboss_datatypes_0030'
datatypes_repository_description = "Galaxy applicable data formats used by Emboss tools."
@@ -17,14 +17,14 @@
"""Create necessary user accounts."""
self.logout()
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
- test_user_1 = get_user( common.test_user_1_email )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
- test_user_1_private_role = get_private_role( test_user_1 )
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
self.logout()
self.login( email=common.admin_email, username=common.admin_username )
- admin_user = get_user( common.admin_email )
+ admin_user = test_db_util.get_user( common.admin_email )
assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
- admin_user_private_role = get_private_role( admin_user )
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
def test_0005_create_category( self ):
"""Create a category for this test suite"""
self.create_category( 'Test 0030 Repository Dependency Revisions', 'Testing repository dependencies by revision.' )
@@ -32,57 +32,57 @@
'''Create the emboss_5_0030, emboss_6_0030, emboss_datatypes_0030, and emboss_0030 repositories and populate the emboss_datatypes repository.'''
self.logout()
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
- emboss_5_repository = get_repository_by_name_and_owner( emboss_5_repository_name, common.test_user_1_name )
+ emboss_5_repository = test_db_util.get_repository_by_name_and_owner( emboss_5_repository_name, common.test_user_1_name )
if emboss_5_repository is None:
self.create_repository( emboss_5_repository_name,
emboss_repository_description,
repository_long_description=emboss_repository_long_description,
categories=[ 'Test 0030 Repository Dependency Revisions' ],
strings_displayed=[] )
- emboss_5_repository = get_repository_by_name_and_owner( emboss_5_repository_name, common.test_user_1_name )
+ emboss_5_repository = test_db_util.get_repository_by_name_and_owner( emboss_5_repository_name, common.test_user_1_name )
self.upload_file( emboss_5_repository, 'emboss/emboss.tar', commit_message='Uploaded tool tarball.' )
- emboss_6_repository = get_repository_by_name_and_owner( emboss_6_repository_name, common.test_user_1_name )
+ emboss_6_repository = test_db_util.get_repository_by_name_and_owner( emboss_6_repository_name, common.test_user_1_name )
if emboss_6_repository is None:
self.create_repository( emboss_6_repository_name,
emboss_repository_description,
repository_long_description=emboss_repository_long_description,
categories=[ 'Test 0030 Repository Dependency Revisions' ],
strings_displayed=[] )
- emboss_6_repository = get_repository_by_name_and_owner( emboss_6_repository_name, common.test_user_1_name )
+ emboss_6_repository = test_db_util.get_repository_by_name_and_owner( emboss_6_repository_name, common.test_user_1_name )
self.upload_file( emboss_6_repository, 'emboss/emboss.tar', commit_message='Uploaded tool tarball..' )
- datatypes_repository = get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
+ datatypes_repository = test_db_util.get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
if datatypes_repository is None:
self.create_repository( datatypes_repository_name,
datatypes_repository_description,
repository_long_description=datatypes_repository_long_description,
categories=[ 'Test 0030 Repository Dependency Revisions' ],
strings_displayed=[] )
- datatypes_repository = get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
+ datatypes_repository = test_db_util.get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
if self.repository_is_new( datatypes_repository ):
self.upload_file( datatypes_repository, 'emboss/datatypes/datatypes_conf.xml', commit_message='Uploaded datatypes_conf.xml.' )
- emboss_repository = get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
if emboss_repository is None:
self.create_repository( emboss_repository_name,
emboss_repository_description,
repository_long_description=emboss_repository_long_description,
categories=[ 'Test 0030 Repository Dependency Revisions' ],
strings_displayed=[] )
- emboss_repository = get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
- self.upload_file( emboss_5_repository, 'emboss/emboss.tar', commit_message='Uploaded tool tarball.' )
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ self.upload_file( emboss_repository, 'emboss/emboss.tar', commit_message='Uploaded tool tarball.' )
def test_0015_generate_repository_dependencies_for_emboss_5( self ):
'''Generate a repository_dependencies.xml file specifying emboss_datatypes and upload it to the emboss_5 repository.'''
- datatypes_repository = get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
+ datatypes_repository = test_db_util.get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
repository_dependencies_path = self.generate_temp_path( 'test_0030', additional_paths=[ 'emboss' ] )
self.generate_repository_dependency_xml( [ datatypes_repository ],
self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ) )
- emboss_5_repository = get_repository_by_name_and_owner( emboss_5_repository_name, common.test_user_1_name )
+ emboss_5_repository = test_db_util.get_repository_by_name_and_owner( emboss_5_repository_name, common.test_user_1_name )
self.upload_file( emboss_5_repository,
'repository_dependencies.xml',
filepath=repository_dependencies_path,
commit_message='Uploaded repository_depepndencies.xml.' )
def test_0020_generate_repository_dependencies_for_emboss_6( self ):
'''Generate a repository_dependencies.xml file specifying emboss_datatypes and upload it to the emboss_6 repository.'''
- emboss_6_repository = get_repository_by_name_and_owner( emboss_6_repository_name, common.test_user_1_name )
+ emboss_6_repository = test_db_util.get_repository_by_name_and_owner( emboss_6_repository_name, common.test_user_1_name )
repository_dependencies_path = self.generate_temp_path( 'test_0030', additional_paths=[ 'emboss' ] )
self.upload_file( emboss_6_repository,
'repository_dependencies.xml',
@@ -90,8 +90,8 @@
commit_message='Uploaded repository_depepndencies.xml.' )
def test_0025_generate_repository_dependency_on_emboss_5( self ):
'''Create and upload repository_dependencies.xml for the emboss_5_0030 repository.'''
- emboss_repository = get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
- emboss_5_repository = get_repository_by_name_and_owner( emboss_5_repository_name, common.test_user_1_name )
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ emboss_5_repository = test_db_util.get_repository_by_name_and_owner( emboss_5_repository_name, common.test_user_1_name )
repository_dependencies_path = self.generate_temp_path( 'test_0030', additional_paths=[ 'emboss', '5' ] )
self.generate_repository_dependency_xml( [ emboss_5_repository ],
self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
@@ -102,8 +102,8 @@
commit_message='Uploaded dependency configuration specifying emboss_5' )
def test_0030_generate_repository_dependency_on_emboss_6( self ):
'''Create and upload repository_dependencies.xml for the emboss_6_0030 repository.'''
- emboss_repository = get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
- emboss_6_repository = get_repository_by_name_and_owner( emboss_6_repository_name, common.test_user_1_name )
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ emboss_6_repository = test_db_util.get_repository_by_name_and_owner( emboss_6_repository_name, common.test_user_1_name )
repository_dependencies_path = self.generate_temp_path( 'test_0030', additional_paths=[ 'emboss', '6' ] )
self.generate_repository_dependency_xml( [ emboss_6_repository ],
self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
@@ -114,9 +114,9 @@
commit_message='Uploaded dependency configuration specifying emboss_6' )
def test_0035_verify_repository_dependency_revisions( self ):
'''Verify that different metadata revisions of the emboss repository have different repository dependencies.'''
- repository = get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
repository_metadata = [ ( metadata.metadata, metadata.changeset_revision ) for metadata in self.get_repository_metadata( repository ) ]
- datatypes_repository = get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
+ datatypes_repository = test_db_util.get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
datatypes_tip = self.get_repository_tip( datatypes_repository )
# Iterate through all metadata revisions and check for repository dependencies.
for metadata, changeset_revision in repository_metadata:
diff -r 34f61e53a563e4b2b44b45b94aff8ed2d1e17738 -r b00822d6733f9a4fa93dac20a67d63e56fcc51be test/tool_shed/functional/test_0040_repository_circular_dependencies.py
--- a/test/tool_shed/functional/test_0040_repository_circular_dependencies.py
+++ b/test/tool_shed/functional/test_0040_repository_circular_dependencies.py
@@ -1,5 +1,5 @@
from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
-from tool_shed.base.test_db_util import get_repository_by_name_and_owner, get_user, get_private_role
+import tool_shed.base.test_db_util as test_db_util
freebayes_repository_name = 'freebayes_0040'
freebayes_repository_name_description = "Galaxy's freebayes tool"
@@ -15,14 +15,14 @@
"""Create necessary user accounts."""
self.logout()
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
- test_user_1 = get_user( common.test_user_1_email )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
- test_user_1_private_role = get_private_role( test_user_1 )
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
self.logout()
self.login( email=common.admin_email, username=common.admin_username )
- admin_user = get_user( common.admin_email )
+ admin_user = test_db_util.get_user( common.admin_email )
assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
- admin_user_private_role = get_private_role( admin_user )
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
def test_0005_create_category( self ):
"""Create a category for this test suite"""
self.create_category( 'test_0040_repository_circular_dependencies', 'Testing handling of circular repository dependencies.' )
@@ -35,7 +35,7 @@
repository_long_description=freebayes_repository_name_long_description,
categories=[ 'test_0040_repository_circular_dependencies' ],
strings_displayed=[] )
- repository = get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
self.upload_file( repository,
'freebayes/freebayes.tar',
strings_displayed=[],
@@ -49,7 +49,7 @@
repository_long_description=filtering_repository_long_description,
categories=[ 'test_0040_repository_circular_dependencies' ],
strings_displayed=[] )
- repository = get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
self.upload_file( repository,
'filtering/filtering_1.1.0.tar',
strings_displayed=[],
@@ -60,8 +60,8 @@
# Filtering revision 0 -> freebayes revision 0.
# Freebayes revision 0 -> filtering revision 1.
# Filtering will have two revisions, one with just the filtering tool, and one with the filtering tool and a dependency on freebayes.
- repository = get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
- filtering_repository = get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
+ filtering_repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
repository_dependencies_path = self.generate_temp_path( 'test_0040', additional_paths=[ 'filtering' ] )
self.generate_repository_dependency_xml( [ repository ],
self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
@@ -76,8 +76,8 @@
# Filtering revision 0 -> freebayes revision 0.
# Freebayes revision 0 -> filtering revision 1.
# Filtering will have two revisions, one with just the filtering tool, and one with the filtering tool and a dependency on freebayes.
- repository = get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
- freebayes_repository = get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
+ freebayes_repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
repository_dependencies_path = self.generate_temp_path( 'test_0040', additional_paths=[ 'freebayes' ] )
self.generate_repository_dependency_xml( [ repository ],
self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
@@ -88,8 +88,8 @@
commit_message='Uploaded dependency on filtering' )
def test_0030_verify_repository_dependencies( self ):
'''Verify that each repository can depend on the other without causing an infinite loop.'''
- filtering_repository = get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
- freebayes_repository = get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
+ filtering_repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
+ freebayes_repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
# The dependency structure should look like:
# Filtering revision 0 -> freebayes revision 0.
# Freebayes revision 0 -> filtering revision 1.
diff -r 34f61e53a563e4b2b44b45b94aff8ed2d1e17738 -r b00822d6733f9a4fa93dac20a67d63e56fcc51be test/tool_shed/functional/test_0050_circular_n_levels.py
--- a/test/tool_shed/functional/test_0050_circular_n_levels.py
+++ b/test/tool_shed/functional/test_0050_circular_n_levels.py
@@ -1,5 +1,5 @@
from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
-from tool_shed.base.test_db_util import get_repository_by_name_and_owner, get_user, get_private_role
+import tool_shed.base.test_db_util as test_db_util
emboss_datatypes_repository_name = 'emboss_datatypes_0050'
emboss_datatypes_repository_description = "Datatypes for emboss"
@@ -26,14 +26,14 @@
"""Create necessary user accounts."""
self.logout()
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
- test_user_1 = get_user( common.test_user_1_email )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
- test_user_1_private_role = get_private_role( test_user_1 )
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
self.logout()
self.login( email=common.admin_email, username=common.admin_username )
- admin_user = get_user( common.admin_email )
+ admin_user = test_db_util.get_user( common.admin_email )
assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
- admin_user_private_role = get_private_role( admin_user )
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
def test_0005_create_category( self ):
"""Create a category for this test suite"""
self.create_category( default_category, default_category_description )
@@ -46,7 +46,7 @@
repository_long_description=emboss_datatypes_repository_long_description,
categories=[ default_category ],
strings_displayed=[] )
- repository = get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
self.upload_file( repository,
'emboss/datatypes/datatypes_conf.xml',
strings_displayed=[],
@@ -58,12 +58,12 @@
repository_long_description=emboss_repository_long_description,
categories=[ default_category ],
strings_displayed=[] )
- repository = get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
self.upload_file( repository,
'emboss/emboss.tar',
strings_displayed=[],
commit_message='Uploaded tool tarball.' )
- datatypes_repository = get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
+ datatypes_repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
repository_dependencies_path = self.generate_temp_path( 'test_0050', additional_paths=[ 'emboss' ] )
self.generate_repository_dependency_xml( [ datatypes_repository ],
self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
@@ -79,12 +79,12 @@
repository_long_description=filtering_repository_long_description,
categories=[ default_category ],
strings_displayed=[] )
- filtering_repository = get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
+ filtering_repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
self.upload_file( filtering_repository,
'filtering/filtering_1.1.0.tar',
strings_displayed=[],
commit_message='Uploaded filtering.tar.' )
- emboss_repository = get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
repository_dependencies_path = self.generate_temp_path( 'test_0050', additional_paths=[ 'filtering' ] )
self.generate_repository_dependency_xml( [ emboss_repository ],
self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
@@ -100,14 +100,14 @@
repository_long_description=freebayes_repository_long_description,
categories=[ default_category ],
strings_displayed=[] )
- repository = get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
self.upload_file( repository,
'freebayes/freebayes.tar',
strings_displayed=[],
commit_message='Uploaded freebayes.tar.' )
- emboss_datatypes_repository = get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
- emboss_repository = get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
- filtering_repository = get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
+ emboss_datatypes_repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ filtering_repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
repository_dependencies_path = self.generate_temp_path( 'test_0050', additional_paths=[ 'freebayes' ] )
self.generate_repository_dependency_xml( [ filtering_repository ],
self.get_filename( 'repository_dependencies.xml', filepath=repository_dependencies_path ),
@@ -138,10 +138,10 @@
id: 4 key: http://localhost:8634__ESEP__emboss_0050__ESEP__user1__ESEP__9f1503046640
['http://localhost:8634', 'emboss_datatypes_0050', 'user1', '596029c334b1']
'''
- emboss_datatypes_repository = get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
- emboss_repository = get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
- filtering_repository = get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
- freebayes_repository = get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
+ emboss_datatypes_repository = test_db_util.get_repository_by_name_and_owner( emboss_datatypes_repository_name, common.test_user_1_name )
+ emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
+ filtering_repository = test_db_util.get_repository_by_name_and_owner( filtering_repository_name, common.test_user_1_name )
+ freebayes_repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
for repository in [ emboss_datatypes_repository, emboss_repository, filtering_repository ]:
self.check_repository_dependency( freebayes_repository, repository, self.get_repository_tip( repository ) )
for changeset_revision in self.get_repository_metadata_revisions( emboss_repository ):
diff -r 34f61e53a563e4b2b44b45b94aff8ed2d1e17738 -r b00822d6733f9a4fa93dac20a67d63e56fcc51be test/tool_shed/functional/test_1000_install_basic_repository.py
--- /dev/null
+++ b/test/tool_shed/functional/test_1000_install_basic_repository.py
@@ -0,0 +1,31 @@
+from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
+import tool_shed.base.test_db_util as test_db_util
+
+class BasicToolShedFeatures( ShedTwillTestCase ):
+ '''Test installing a basic repository.'''
+ def test_0000_initiate_users( self ):
+ """Create necessary user accounts."""
+ self.galaxy_logout()
+ self.galaxy_login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_galaxy_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
+ admin_user_private_role = test_db_util.get_galaxy_private_role( admin_user )
+ def test_0005_browse_tool_sheds( self ):
+ """Browse the available tool sheds in this Galaxy instance."""
+ self.visit_galaxy_url( '/admin_toolshed/browse_tool_sheds' )
+ self.check_page_for_string( 'Embedded tool shed for functional tests' )
+ self.browse_tool_shed( url=self.url, strings_displayed=[ 'Test 0000 Basic Repository Features 1', 'Test 0000 Basic Repository Features 2' ] )
+ def test_0010_browse_test_0000_category( self ):
+ '''Browse the category created in test 0000. It should contain the filtering_0000 repository also created in that test.'''
+ category = test_db_util.get_category_by_name( 'Test 0000 Basic Repository Features 1' )
+ self.browse_category( category, strings_displayed=[ 'filtering_0000' ] )
+ def test_0015_preview_filtering_repository( self ):
+ '''Load the preview page for the filtering_0000 repository in the tool shed.'''
+ self.preview_repository_in_tool_shed( 'filtering_0000', common.test_user_1_name, strings_displayed=[ 'filtering_0000', 'Valid tools' ] )
+ def test_0020_install_filtering_repository( self ):
+ self.install_repository( 'filtering_0000', common.test_user_1_name )
+ installed_repository = test_db_util.get_installed_repository_by_name_owner( 'filtering_0000', common.test_user_1_name )
+ self.verify_installed_repository_on_browse_page( installed_repository )
+ self.display_installed_repository_manage_page( installed_repository,
+ strings_displayed=[ 'Installed tool shed repository', 'Tools', 'Filter1' ] )
+ self.verify_tool_metadata_for_installed_repository( installed_repository )
\ No newline at end of file
diff -r 34f61e53a563e4b2b44b45b94aff8ed2d1e17738 -r b00822d6733f9a4fa93dac20a67d63e56fcc51be test/tool_shed/functional/test_1000_install_filtering_repository.py
--- a/test/tool_shed/functional/test_1000_install_filtering_repository.py
+++ /dev/null
@@ -1,31 +0,0 @@
-from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
-from tool_shed.base.test_db_util import get_repository_by_name_and_owner, get_galaxy_user, get_galaxy_private_role, get_category_by_name
-
-class BasicToolShedFeatures( ShedTwillTestCase ):
- '''Test installing a basic repository.'''
- def test_0000_initiate_users( self ):
- """Create necessary user accounts."""
- self.galaxy_logout()
- self.galaxy_login( email=common.test_user_1_email, username=common.test_user_1_name )
- test_user_1 = get_galaxy_user( common.test_user_1_email )
- assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % test_user_1_email
- test_user_1_private_role = get_galaxy_private_role( test_user_1 )
- self.galaxy_logout()
- self.galaxy_login( email=common.admin_email, username=common.admin_username )
- admin_user = get_galaxy_user( common.admin_email )
- assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
- admin_user_private_role = get_galaxy_private_role( admin_user )
- def test_0005_browse_tool_sheds( self ):
- """Browse the available tool sheds in this Galaxy instance."""
- self.visit_galaxy_url( '/admin_toolshed/browse_tool_sheds' )
- self.check_page_for_string( 'Embedded tool shed for functional tests' )
- self.browse_tool_shed( url=self.url, strings_displayed=[ 'Test 0000 Basic Repository Features 1', 'Test 0000 Basic Repository Features 2' ] )
- def test_0010_browse_test_0000_category( self ):
- '''Browse the category created in test 0000. It should contain the filtering_0000 repository also created in that test.'''
- category = get_category_by_name( 'Test 0000 Basic Repository Features 1' )
- self.browse_category( category, strings_displayed=[ 'filtering_0000' ] )
- def test_0015_preview_filtering_repository( self ):
- '''Load the preview page for the filtering_0000 repository in the tool shed.'''
- self.preview_repository_in_tool_shed( 'filtering_0000', common.test_user_1_name, strings_displayed=[ 'filtering_0000', 'Valid tools' ] )
- def test_0020_install_filtering_repository( self ):
- self.install_repository( 'filtering_0000', common.test_user_1_name )
diff -r 34f61e53a563e4b2b44b45b94aff8ed2d1e17738 -r b00822d6733f9a4fa93dac20a67d63e56fcc51be test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
--- /dev/null
+++ b/test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
@@ -0,0 +1,27 @@
+from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
+import tool_shed.base.test_db_util as test_db_util
+
+class ToolWithToolDependencies( ShedTwillTestCase ):
+ '''Test installing a repository with tool dependencies.'''
+ def test_0000_initiate_users( self ):
+ """Create necessary user accounts."""
+ self.galaxy_logout()
+ self.galaxy_login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_galaxy_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
+ admin_user_private_role = test_db_util.get_galaxy_private_role( admin_user )
+ def test_0005_browse_tool_shed( self ):
+ """Browse the available tool sheds in this Galaxy instance and preview the freebayes tool."""
+ self.browse_tool_shed( url=self.url, strings_displayed=[ 'Test 0010 Repository With Tool Dependencies' ] )
+ category = test_db_util.get_category_by_name( 'Test 0010 Repository With Tool Dependencies' )
+ self.browse_category( category, strings_displayed=[ 'freebayes_0010' ] )
+ self.preview_repository_in_tool_shed( 'freebayes_0010', common.test_user_1_name, strings_displayed=[ 'freebayes_0010', 'Valid tools' ] )
+ def test_0015_install_freebayes_repository( self ):
+ '''Install the freebayes repository without installing tool dependencies.'''
+ self.install_repository( 'freebayes_0010', common.test_user_1_name, install_tool_dependencies=False )
+ installed_repository = test_db_util.get_installed_repository_by_name_owner( 'freebayes_0010', common.test_user_1_name )
+ self.verify_installed_repository_on_browse_page( installed_repository )
+ self.display_installed_repository_manage_page( installed_repository,
+ strings_displayed=[ 'Installed tool shed repository', 'Tools', 'FreeBayes' ] )
+ self.check_installed_repository_tool_dependencies( installed_repository, dependencies_installed=False )
+ self.verify_tool_metadata_for_installed_repository( installed_repository )
diff -r 34f61e53a563e4b2b44b45b94aff8ed2d1e17738 -r b00822d6733f9a4fa93dac20a67d63e56fcc51be test/tool_shed/functional/test_1020_install_repository_with_repository_dependencies.py
--- /dev/null
+++ b/test/tool_shed/functional/test_1020_install_repository_with_repository_dependencies.py
@@ -0,0 +1,27 @@
+from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
+import tool_shed.base.test_db_util as test_db_util
+
+class ToolWithRepositoryDependencies( ShedTwillTestCase ):
+ '''Test installing a repository with repository dependencies.'''
+ def test_0000_initiate_users( self ):
+ """Create necessary user accounts."""
+ self.galaxy_logout()
+ self.galaxy_login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_galaxy_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
+ admin_user_private_role = test_db_util.get_galaxy_private_role( admin_user )
+ def test_0005_browse_tool_shed( self ):
+ """Browse the available tool sheds in this Galaxy instance and preview the emboss tool."""
+ self.browse_tool_shed( url=self.url, strings_displayed=[ 'Test 0020 Basic Repository Dependencies' ] )
+ category = test_db_util.get_category_by_name( 'Test 0020 Basic Repository Dependencies' )
+ self.browse_category( category, strings_displayed=[ 'emboss_0020' ] )
+ self.preview_repository_in_tool_shed( 'emboss_0020', common.test_user_1_name, strings_displayed=[ 'emboss_0020', 'Valid tools' ] )
+ def test_0015_install_emboss_repository( self ):
+ '''Install the emboss repository without installing tool dependencies.'''
+ self.install_repository( 'emboss_0020', common.test_user_1_name, install_tool_dependencies=False )
+ installed_repository = test_db_util.get_installed_repository_by_name_owner( 'emboss_0020', common.test_user_1_name )
+ self.verify_installed_repository_on_browse_page( installed_repository )
+ self.display_installed_repository_manage_page( installed_repository,
+ strings_displayed=[ 'Installed tool shed repository', 'Tools', 'antigenic' ] )
+ self.check_installed_repository_tool_dependencies( installed_repository, dependencies_installed=False )
+ self.verify_tool_metadata_for_installed_repository( installed_repository )
diff -r 34f61e53a563e4b2b44b45b94aff8ed2d1e17738 -r b00822d6733f9a4fa93dac20a67d63e56fcc51be test/tool_shed/functional/test_1030_install_repository_with_dependency_revisions.py
--- /dev/null
+++ b/test/tool_shed/functional/test_1030_install_repository_with_dependency_revisions.py
@@ -0,0 +1,29 @@
+from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
+import tool_shed.base.test_db_util as test_db_util
+
+class RepositoryWithDependencyRevisions( ShedTwillTestCase ):
+ '''Test installing a repository with dependency revisions.'''
+ def test_0000_initiate_users( self ):
+ """Create necessary user accounts."""
+ self.galaxy_logout()
+ self.galaxy_login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_galaxy_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
+ admin_user_private_role = test_db_util.get_galaxy_private_role( admin_user )
+ def test_0005_browse_tool_shed( self ):
+ """Browse the available tool sheds in this Galaxy instance and preview the emboss tool."""
+ self.browse_tool_shed( url=self.url, strings_displayed=[ 'Test 0030 Repository Dependency Revisions' ] )
+ category = test_db_util.get_category_by_name( 'Test 0030 Repository Dependency Revisions' )
+ self.browse_category( category, strings_displayed=[ 'emboss_0030' ] )
+ self.preview_repository_in_tool_shed( 'emboss_0030', common.test_user_1_name, strings_displayed=[ 'emboss_0030', 'Valid tools' ] )
+ def test_0015_install_emboss_repository( self ):
+ '''Install the emboss repository without installing tool dependencies.'''
+ repository = test_db_util.get_repository_by_name_and_owner( 'emboss_0030', common.test_user_1_name )
+ revisions = self.get_repository_metadata_revisions( repository )
+ self.install_repository( 'emboss_0030', common.test_user_1_name, changeset_revision=revisions[1], install_tool_dependencies=False )
+ installed_repository = test_db_util.get_installed_repository_by_name_owner( 'emboss_0030', common.test_user_1_name )
+ self.verify_installed_repository_on_browse_page( installed_repository )
+ self.display_installed_repository_manage_page( installed_repository,
+ strings_displayed=[ 'Installed tool shed repository', 'Tools', 'antigenic' ] )
+ self.check_installed_repository_tool_dependencies( installed_repository, dependencies_installed=False )
+ self.verify_tool_metadata_for_installed_repository( installed_repository )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0