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
commit/galaxy-central: clements: Added boilerplate for Sphinx doc home page.
by Bitbucket 08 Dec '12
by Bitbucket 08 Dec '12
08 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/0042b30216fc/
changeset: 0042b30216fc
user: clements
date: 2012-11-06 20:14:22
summary: Added boilerplate for Sphinx doc home page.
affected #: 1 file
diff -r c8f0ea550d51b2c203f5f60568817164c62220fd -r 0042b30216fc5dc4f92b314c93a3aa9a0d810d77 doc/source/index.rst
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -1,12 +1,41 @@
Galaxy Code Documentation
*************************
-Galaxy is an open, web-based platform for accessible, reproducible, and
+Galaxy_ is an open, web-based platform for accessible, reproducible, and
transparent computational biomedical research.
-- Accessible: Users without programming experience can easily specify parameters and run tools and workflows.
-- Reproducible: Galaxy captures information so that any user can repeat and understand a complete computational analysis.
-- Transparent: Users share and publish analyses via the web and create Pages, interactive, web-based documents that describe a complete analysis.
+- *Accessible:* Users without programming experience can easily specify parameters and run tools and workflows.
+- *Reproducible:* Galaxy captures information so that any user can repeat and understand a complete computational analysis.
+- *Transparent:* Users share and publish analyses via the web and create Pages, interactive, web-based documents that describe a complete analysis.
+
+Two copies of the Galaxy code doumentation are published by the Galaxy Project
+
+- Galaxy-Dist_: This describes the code in the `most recent official release`_ of Galaxy.
+- Galaxy-Central_: Describes the `current code in the development branch`_ of Galaxy. This is the latest checkin, bleeding edge version of the code. The documentation should never be more than an hour behind the code.
+
+Both copies are hosted at ReadTheDocs_, a publicly supported web site for hosting project documentation.
+
+If you have your own copy of the Galaxy source code, you can also generate your own version of this documentation:
+
+::
+
+ $ cd doc
+ $ make html
+
+The generated documentation will be in ``doc/build/html/`` and can be viewed with a web browser. Note that you will need to install Sphinx and a fair number of module dependencies before this will produce output.
+
+.. _Galaxy: http://galaxyproject.org/
+.. _Galaxy-Dist: https://galaxy-dist.readthedocs.org/
+.. _most recent official release: https://bitbucket.org/galaxy/galaxy-dist
+.. _Galaxy-Central: https://galaxy-central.readthedocs.org/
+.. _current code in the development branch: https://bitbucket.org/galaxy/galaxy-central
+.. _ReadTheDocs: https://readthedocs.org/
+
+
+For more on the Galaxy Project, please visit the `project home page`_.
+
+.. _project home page: http://galaxyproject.org/
+
Contents
========
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/8cb49d27d1a4/
changeset: 8cb49d27d1a4
user: lance_parsons
date: 2012-12-07 23:22:48
summary: Fix for finding test-data for installed tools
See bug: https://trello.com/c/Z0vhJEq6
affected #: 1 file
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 8cb49d27d1a4c681eb774ac020d524258709ce20 scripts/functional_tests.py
--- a/scripts/functional_tests.py
+++ b/scripts/functional_tests.py
@@ -57,8 +57,10 @@
last_galaxy_test_file_dir = None
last_tested_repository_name = None
last_tested_changeset_revision = None
+ tool_path = None
tree = util.parse_xml( config )
root = tree.getroot()
+ tool_path = root.get('tool_path')
for elem in root:
if elem.tag == 'tool':
galaxy_test_file_dir, \
@@ -66,7 +68,8 @@
last_tested_changeset_revision = get_installed_repository_info( elem,
last_galaxy_test_file_dir,
last_tested_repository_name,
- last_tested_changeset_revision )
+ last_tested_changeset_revision,
+ tool_path )
if galaxy_test_file_dir:
if galaxy_test_file_dir != last_galaxy_test_file_dir:
if not os.path.isabs( galaxy_test_file_dir ):
@@ -82,7 +85,8 @@
last_tested_changeset_revision = get_installed_repository_info( section_elem,
last_galaxy_test_file_dir,
last_tested_repository_name,
- last_tested_changeset_revision )
+ last_tested_changeset_revision,
+ tool_path )
if galaxy_test_file_dir:
if galaxy_test_file_dir != last_galaxy_test_file_dir:
if not os.path.isabs( galaxy_test_file_dir ):
@@ -92,7 +96,7 @@
last_galaxy_test_file_dir = galaxy_test_file_dir
return shed_tools_dict
-def get_installed_repository_info( elem, last_galaxy_test_file_dir, last_tested_repository_name, last_tested_changeset_revision ):
+def get_installed_repository_info( elem, last_galaxy_test_file_dir, last_tested_repository_name, last_tested_changeset_revision, tool_path ):
"""
Return the GALAXY_TEST_FILE_DIR, the containing repository name and the change set revision for the tool elem.
This only happens when testing tools installed from the tool shed.
@@ -107,7 +111,7 @@
if repository_name != last_tested_repository_name or changeset_revision != last_tested_changeset_revision:
# Locate the test-data directory.
installed_tool_path = os.path.join( installed_tool_path_items[ 0 ], 'repos', repository_owner, repository_name, changeset_revision )
- for root, dirs, files in os.walk( installed_tool_path ):
+ for root, dirs, files in os.walk( os.path.join(tool_path, installed_tool_path )):
if 'test-data' in dirs:
return os.path.join( root, 'test-data' ), repository_name, changeset_revision
return None, repository_name, changeset_revision
https://bitbucket.org/galaxy/galaxy-central/changeset/c8f0ea550d51/
changeset: c8f0ea550d51
user: greg
date: 2012-12-08 01:09:00
summary: Merged in lance_parsons/galaxy-central_installed-tools-functional-tests-fix (pull request #95)
affected #: 1 file
diff -r 6f3266a589e397cbdbe8efe4f4d26b7dcdc8924c -r c8f0ea550d51b2c203f5f60568817164c62220fd scripts/functional_tests.py
--- a/scripts/functional_tests.py
+++ b/scripts/functional_tests.py
@@ -57,8 +57,10 @@
last_galaxy_test_file_dir = None
last_tested_repository_name = None
last_tested_changeset_revision = None
+ tool_path = None
tree = util.parse_xml( config )
root = tree.getroot()
+ tool_path = root.get('tool_path')
for elem in root:
if elem.tag == 'tool':
galaxy_test_file_dir, \
@@ -66,7 +68,8 @@
last_tested_changeset_revision = get_installed_repository_info( elem,
last_galaxy_test_file_dir,
last_tested_repository_name,
- last_tested_changeset_revision )
+ last_tested_changeset_revision,
+ tool_path )
if galaxy_test_file_dir:
if galaxy_test_file_dir != last_galaxy_test_file_dir:
if not os.path.isabs( galaxy_test_file_dir ):
@@ -82,7 +85,8 @@
last_tested_changeset_revision = get_installed_repository_info( section_elem,
last_galaxy_test_file_dir,
last_tested_repository_name,
- last_tested_changeset_revision )
+ last_tested_changeset_revision,
+ tool_path )
if galaxy_test_file_dir:
if galaxy_test_file_dir != last_galaxy_test_file_dir:
if not os.path.isabs( galaxy_test_file_dir ):
@@ -92,7 +96,7 @@
last_galaxy_test_file_dir = galaxy_test_file_dir
return shed_tools_dict
-def get_installed_repository_info( elem, last_galaxy_test_file_dir, last_tested_repository_name, last_tested_changeset_revision ):
+def get_installed_repository_info( elem, last_galaxy_test_file_dir, last_tested_repository_name, last_tested_changeset_revision, tool_path ):
"""
Return the GALAXY_TEST_FILE_DIR, the containing repository name and the change set revision for the tool elem.
This only happens when testing tools installed from the tool shed.
@@ -107,7 +111,7 @@
if repository_name != last_tested_repository_name or changeset_revision != last_tested_changeset_revision:
# Locate the test-data directory.
installed_tool_path = os.path.join( installed_tool_path_items[ 0 ], 'repos', repository_owner, repository_name, changeset_revision )
- for root, dirs, files in os.walk( installed_tool_path ):
+ for root, dirs, files in os.walk( os.path.join(tool_path, installed_tool_path )):
if 'test-data' in dirs:
return os.path.join( root, 'test-data' ), repository_name, changeset_revision
return None, repository_name, changeset_revision
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: clements: Added numpy to mock modules list. Readthedocs of galaxy-central is broken, and it's complaining about numpy. So, try adding it to mock modules list and see if that helps.
by Bitbucket 07 Dec '12
by Bitbucket 07 Dec '12
07 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/6f3266a589e3/
changeset: 6f3266a589e3
user: clements
date: 2012-11-06 18:31:28
summary: Added numpy to mock modules list. Readthedocs of galaxy-central is broken, and it's complaining about numpy. So, try adding it to mock modules list and see if that helps.
affected #: 1 file
diff -r 6d86fa9ca5977060372704346a1e9a2b6308a292 -r 6f3266a589e397cbdbe8efe4f4d26b7dcdc8924c doc/source/conf.py
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -274,6 +274,6 @@
return Mock()
# adding pbs_python, DRMAA_python, markupsafe, and drmaa here had no effect.
-MOCK_MODULES = ['tables', 'decorator']
+MOCK_MODULES = ['tables', 'decorator', 'numpy']
for mod_name in MOCK_MODULES:
sys.modules[mod_name] = Mock()
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Handle somce cases of circular dependencies and other corner case siturations with repository dependency definitions.
by Bitbucket 07 Dec '12
by Bitbucket 07 Dec '12
07 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/6d86fa9ca597/
changeset: 6d86fa9ca597
user: greg
date: 2012-12-07 22:47:24
summary: Handle somce cases of circular dependencies and other corner case siturations with repository dependency definitions.
affected #: 3 files
diff -r facdd387b85e814df7428ca8cbb71828d0ec48a2 -r 6d86fa9ca5977060372704346a1e9a2b6308a292 lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -2,12 +2,12 @@
from galaxy import util
from galaxy.tools import parameters
from galaxy.util import inflector
-from galaxy.util.json import *
+from galaxy.util import json
from galaxy.web import url_for
from galaxy.web.form_builder import SelectField
-from galaxy.webapps.community.util.container_util import *
-from galaxy.datatypes.checkers import *
-from galaxy.model.orm import *
+from galaxy.webapps.community.util import container_util
+from galaxy.datatypes import checkers
+from galaxy.model.orm import and_
from galaxy.tools.parameters import dynamic_options
from galaxy import eggs
@@ -124,45 +124,49 @@
# Datatypes container.
if metadata and 'datatypes' in metadata:
datatypes = metadata[ 'datatypes' ]
- folder_id, datatypes_root_folder = build_datatypes_folder( folder_id, datatypes )
+ folder_id, datatypes_root_folder = container_util.build_datatypes_folder( folder_id, datatypes )
containers_dict[ 'datatypes' ] = datatypes_root_folder
# Invalid tools container.
if metadata and 'invalid_tools' in metadata:
invalid_tool_configs = metadata[ 'invalid_tools' ]
- folder_id, invalid_tools_root_folder = build_invalid_tools_folder( folder_id,
- invalid_tool_configs,
- changeset_revision,
- repository=repository,
- label='Invalid tools' )
+ folder_id, invalid_tools_root_folder = container_util.build_invalid_tools_folder( folder_id,
+ invalid_tool_configs,
+ changeset_revision,
+ repository=repository,
+ label='Invalid tools' )
containers_dict[ 'invalid_tools' ] = invalid_tools_root_folder
# Readme files container.
readme_files_dict = build_readme_files_dict( repository_metadata )
- folder_id, readme_files_root_folder = build_readme_files_folder( folder_id, readme_files_dict )
+ folder_id, readme_files_root_folder = container_util.build_readme_files_folder( folder_id, readme_files_dict )
containers_dict[ 'readme_files' ] = readme_files_root_folder
# Repository dependencies container.
toolshed_base_url = str( url_for( '/', qualified=True ) ).rstrip( '/' )
- folder_id, repository_dependencies_root_folder = build_repository_dependencies_folder( toolshed_base_url=toolshed_base_url,
- repository_name=repository.name,
- repository_owner=repository.user.username,
- changeset_revision=changeset_revision,
- folder_id=folder_id,
- repository_dependencies=repository_dependencies )
+ folder_id, repository_dependencies_root_folder = container_util.build_repository_dependencies_folder( toolshed_base_url=toolshed_base_url,
+ repository_name=repository.name,
+ repository_owner=repository.user.username,
+ changeset_revision=changeset_revision,
+ folder_id=folder_id,
+ repository_dependencies=repository_dependencies )
if repository_dependencies_root_folder:
containers_dict[ 'repository_dependencies' ] = repository_dependencies_root_folder
# Tool dependencies container.
if metadata and 'tool_dependencies' in metadata:
tool_dependencies = metadata[ 'tool_dependencies' ]
- folder_id, tool_dependencies_root_folder = build_tool_dependencies_folder( folder_id, tool_dependencies, for_galaxy=False )
+ folder_id, tool_dependencies_root_folder = container_util.build_tool_dependencies_folder( folder_id, tool_dependencies, for_galaxy=False )
containers_dict[ 'tool_dependencies' ] = tool_dependencies_root_folder
# Valid tools container.
if metadata and 'tools' in metadata:
valid_tools = metadata[ 'tools' ]
- folder_id, valid_tools_root_folder = build_tools_folder( folder_id, valid_tools, repository, changeset_revision, label='Valid tools' )
+ folder_id, valid_tools_root_folder = container_util.build_tools_folder( folder_id,
+ valid_tools,
+ repository,
+ changeset_revision,
+ label='Valid tools' )
containers_dict[ 'valid_tools' ] = valid_tools_root_folder
# Workflows container.
if metadata and 'workflows' in metadata:
workflows = metadata[ 'workflows' ]
- folder_id, workflows_root_folder = build_workflows_folder( folder_id, workflows, repository_metadata, label='Workflows' )
+ folder_id, workflows_root_folder = container_util.build_workflows_folder( folder_id, workflows, repository_metadata, label='Workflows' )
containers_dict[ 'workflows' ] = workflows_root_folder
except Exception, e:
log.debug( "Exception in build_repository_containers_for_tool_shed: %s" % str( e ) )
@@ -190,6 +194,29 @@
option_value = trans.security.encode_id( repository.id )
repositories_select_field.add_option( option_label, option_value )
return repositories_select_field
+def can_add_entry_to_all_repository_dependencies( current_repository_key, repository_dependency, all_repository_dependencies ):
+ """
+ Handle circular repository dependencies that could result in an infinite loop by determining if it is safe to add an entry to the
+ repository dependencies container.
+ """
+ # First check for an exact match - if this is true, the changeset revision was not updated.
+ repository_dependency_as_key = container_util.generate_repository_dependencies_key_for_repository( repository_dependency[ 0 ],
+ repository_dependency[ 1 ],
+ repository_dependency[ 2 ],
+ repository_dependency[ 3] )
+ current_repository_key_as_repository_dependency = current_repository_key.split( container_util.STRSEP )
+ if repository_dependency_as_key in all_repository_dependencies:
+ val = all_repository_dependencies[ repository_dependency_as_key ]
+ if current_repository_key_as_repository_dependency in val:
+ return False
+ # Now handle the case where an update to the changeset revision was done, so everything will match except the changeset_revision.
+ repository_dependency_as_partial_key = container_util.STRSEP.join( [ repository_dependency[ 0 ], repository_dependency[ 1 ], repository_dependency[ 2 ] ] )
+ for key in all_repository_dependencies:
+ if key.startswith( repository_dependency_as_partial_key ):
+ val = all_repository_dependencies[ key ]
+ if current_repository_key_as_repository_dependency in val:
+ return False
+ return True
def can_generate_tool_dependency_metadata( root, metadata_dict ):
"""
Make sure the combination of name, version and type (the type will be the value of elem.tag) of each root element tag in the tool_dependencies.xml
@@ -736,8 +763,8 @@
elif name not in NOT_TOOL_CONFIGS and name.endswith( '.xml' ):
full_path = str( os.path.abspath( os.path.join( root, name ) ) )
if os.path.getsize( full_path ) > 0:
- if not ( check_binary( full_path ) or check_image( full_path ) or check_gzip( full_path )[ 0 ]
- or check_bz2( full_path )[ 0 ] or check_zip( full_path ) ):
+ if not ( checkers.check_binary( full_path ) or checkers.check_image( full_path ) or checkers.check_gzip( full_path )[ 0 ]
+ or checkers.check_bz2( full_path )[ 0 ] or checkers.check_zip( full_path ) ):
try:
# Make sure we're looking at a tool config and not a display application config or something else.
element_tree = util.parse_xml( full_path )
@@ -779,7 +806,7 @@
fp = open( relative_path, 'rb' )
workflow_text = fp.read()
fp.close()
- exported_workflow_dict = from_json_string( workflow_text )
+ exported_workflow_dict = json.from_json_string( workflow_text )
if 'a_galaxy_workflow' in exported_workflow_dict and exported_workflow_dict[ 'a_galaxy_workflow' ] == 'true':
metadata_dict = generate_workflow_metadata( relative_path, exported_workflow_dict, metadata_dict )
if readme_files:
@@ -1189,106 +1216,112 @@
repository_dependencies_dict = metadata[ 'repository_dependencies' ]
# The repository_dependencies entry in the metadata is a dictionary that may have a value for a 'description' key. We want to
# store the value of this key only once, the first time through this recursive method.
- repository_dependencies_root_key = generate_repository_dependencies_key_for_repository( toolshed_base_url=toolshed_base_url,
- repository_name=repository.name,
- repository_owner=repository.user.username,
- changeset_revision=repository_metadata.changeset_revision )
+ current_repository_key = container_util.generate_repository_dependencies_key_for_repository( toolshed_base_url=toolshed_base_url,
+ repository_name=repository.name,
+ repository_owner=repository.user.username,
+ changeset_revision=repository_metadata.changeset_revision )
if not all_repository_dependencies:
- # Initialize the all_repository_dependencies dictionary.
- all_repository_dependencies[ 'root_key' ] = repository_dependencies_root_key
- all_repository_dependencies[ repository_dependencies_root_key ] = []
+ # Initialize the all_repository_dependencies dictionary. It's safe to assume that current_repository_key in this case will have a value.
+ all_repository_dependencies[ 'root_key' ] = current_repository_key
+ all_repository_dependencies[ current_repository_key ] = []
if 'description' not in all_repository_dependencies:
description = repository_dependencies_dict.get( 'description', None )
all_repository_dependencies[ 'description' ] = description
# The next key of interest in repository_dependencies_dict is 'repository_dependencies', which is a list of tuples.
repository_dependencies_tups = repository_dependencies_dict[ 'repository_dependencies' ]
+ if repository_dependencies_tups and current_repository_key:
+ # Remove all repository dependencies that point to a revision within its own repository.
+ repository_dependencies_tups = remove_ropository_dependency_reference_to_self( repository_dependencies_tups, current_repository_key )
for repository_dependency in repository_dependencies_tups:
- # Skip repository dependencies that point to the root repository.
- check_key = generate_repository_dependencies_key_for_repository( toolshed_base_url=repository_dependency[ 0 ],
- repository_name=repository_dependency[ 1 ],
- repository_owner=repository_dependency[ 2 ],
- changeset_revision=repository_dependency[ 3 ] )
- if check_key == repository_dependencies_root_key:
- handled.append( repository_dependency )
- elif repository_dependency not in handled and repository_dependency not in repository_dependencies:
+ if repository_dependency not in handled and repository_dependency not in repository_dependencies:
+ # The following if statement handles repositories dependencies that are circular in nature.
+ if current_repository_key:
+ if current_repository_key in all_repository_dependencies:
+ # Add all repository dependencies for the current repository into it's entry in all_repository_dependencies.
+ all_repository_dependencies_val = all_repository_dependencies[ current_repository_key ]
+ if repository_dependency not in all_repository_dependencies_val:
+ all_repository_dependencies_val.append( repository_dependency )
+ all_repository_dependencies[ current_repository_key ] = all_repository_dependencies_val
+ elif can_add_entry_to_all_repository_dependencies( current_repository_key, repository_dependency, all_repository_dependencies ):
+ # We don't have a circular dependency that could result in an infinite loop.
+ all_repository_dependencies[ current_repository_key ] = [ repository_dependency ]
repository_dependencies.append( repository_dependency )
else:
- repository_dependencies_root_key = None
- if repository_dependencies:
- repository_dependency = repository_dependencies.pop( 0 )
- # Cast unicode to string.
- repository_dependency = [ str( item ) for item in repository_dependency ]
- tool_shed, name, owner, changeset_revision = repository_dependency
- if repository_dependencies_root_key:
- if repository_dependencies_root_key in all_repository_dependencies:
- # See if this repository_dependency is contained in the list associated with the repository_dependencies_root_key.
- all_repository_dependencies_val = all_repository_dependencies[ repository_dependencies_root_key ]
- if repository_dependency not in all_repository_dependencies_val:
- all_repository_dependencies_val.append( repository_dependency )
- all_repository_dependencies[ repository_dependencies_root_key ] = all_repository_dependencies_val
- handled.append( repository_dependency )
- else:
- # Insert this repository_dependency.
- all_repository_dependencies[ repository_dependencies_root_key ] = [ repository_dependency ]
+ # The current repository does not have repository dependencies defined for it.
+ current_repository_key = None
+ # The following if statement handles repositories dependencies that are circular in nature.
+ if current_repository_key and current_repository_key in all_repository_dependencies:
+ repository_dependencies_tups = [ rd for rd in all_repository_dependencies[ current_repository_key ] ]
+ if repository_dependencies_tups:
+ repository_dependency = repository_dependencies_tups.pop( 0 )
+ if repository_dependency not in handled:
handled.append( repository_dependency )
- if tool_shed_is_this_tool_shed( tool_shed ):
- # The repository is in the current tool shed.
- required_repository = get_repository_by_name_and_owner( trans, name, owner )
- required_repository_metadata = get_repository_metadata_by_repository_id_changset_revision( trans,
- trans.security.encode_id( required_repository.id ),
- changeset_revision )
- if required_repository_metadata:
- required_repo_dir = required_repository.repo_path( trans.app )
- required_repo = hg.repository( get_configured_ui(), required_repo_dir )
- else:
- # The repository changeset_revision is no longer installable, so see if there's been an update.
- required_repo_dir = required_repository.repo_path( trans.app )
- required_repo = hg.repository( get_configured_ui(), required_repo_dir )
- required_changeset_revision = get_next_downloadable_changeset_revision( required_repository, required_repo, changeset_revision )
+ if repository_dependency in repository_dependencies:
+ repository_dependencies.remove( repository_dependency )
+ toolshed, name, owner, changeset_revision = repository_dependency
+ if tool_shed_is_this_tool_shed( toolshed ):
+ required_repository = get_repository_by_name_and_owner( trans, name, owner )
required_repository_metadata = get_repository_metadata_by_repository_id_changset_revision( trans,
trans.security.encode_id( required_repository.id ),
- required_changeset_revision )
+ changeset_revision )
if required_repository_metadata:
- # The changeset_revision defined in a repository_dependencies.xml file is outdated, so we need to fix appropriate
- # entries in our all_repository_dependencies dictionary.
- updated_repository_dependency = [ tool_shed, name, owner, required_changeset_revision ]
- for k, v in all_repository_dependencies.items():
- if k in [ 'root_key', 'description' ]:
- continue
- for i, current_repository_dependency in enumerate( v ):
- current_tool_shed, current_name, current_owner, current_changeset_revision = current_repository_dependency
- if tool_shed == current_tool_shed and name == current_name and owner == current_owner and changeset_revision == current_changeset_revision:
- if updated_repository_dependency in v:
- # We've already stored the updated repository_dependency, so remove the outdated one.
- v = v.remove( repository_dependency )
- else:
- # Store the updated repository_dependency.
- v[ i ] = updated_repository_dependency
- all_repository_dependencies[ k ] = v
- if required_repository_metadata:
- # The required_repository_metadata changeset_revision is installable.
- required_metadata = required_repository_metadata.metadata
- if required_metadata:
- return get_repository_dependencies_for_changeset_revision( trans=trans,
- repo=required_repo,
- repository=required_repository,
- repository_metadata=required_repository_metadata,
- toolshed_base_url=tool_shed,
- repository_dependencies=repository_dependencies,
- all_repository_dependencies=all_repository_dependencies,
- handled=handled )
- else:
- # The repository is in a different tool shed, so build an url and send a request.
- raise Exception( "Repository dependencies that refer to repositories in other tool sheds is not yet supported." )
+ required_repo_dir = required_repository.repo_path( trans.app )
+ required_repo = hg.repository( get_configured_ui(), required_repo_dir )
+ else:
+ # The repository changeset_revision is no longer installable, so see if there's been an update.
+ required_repo_dir = required_repository.repo_path( trans.app )
+ required_repo = hg.repository( get_configured_ui(), required_repo_dir )
+ required_changeset_revision = get_next_downloadable_changeset_revision( required_repository, required_repo, changeset_revision )
+ required_repository_metadata = get_repository_metadata_by_repository_id_changset_revision( trans,
+ trans.security.encode_id( required_repository.id ),
+ required_changeset_revision )
+ if required_repository_metadata:
+ # The changeset_revision defined in a repository_dependencies.xml file is outdated, so we need to fix appropriate
+ # entries in our all_repository_dependencies dictionary.
+ updated_repository_dependency = [ toolshed, name, owner, required_changeset_revision ]
+ for k, v in all_repository_dependencies.items():
+ if k in [ 'root_key', 'description' ]:
+ continue
+ for i, current_repository_dependency in enumerate( v ):
+ cts, cn, co, ccr = current_repository_dependency
+ if toolshed == cts and name == cn and owner == co and changeset_revision == ccr:
+ if updated_repository_dependency in v:
+ # We've already stored the updated repository_dependency, so remove the outdated one.
+ v = v.remove( repository_dependency )
+ all_repository_dependencies[ k ] = v
+ else:
+ # Store the updated repository_dependency.
+ v[ i ] = updated_repository_dependency
+ all_repository_dependencies[ k ] = v
+ if required_repository_metadata:
+ # The required_repository_metadata changeset_revision is installable.
+ required_metadata = required_repository_metadata.metadata
+ if required_metadata:
+ for repository_dependency in repository_dependencies_tups:
+ if repository_dependency not in repository_dependencies:
+ repository_dependencies.append( repository_dependency )
+ return get_repository_dependencies_for_changeset_revision( trans=trans,
+ repo=required_repo,
+ repository=required_repository,
+ repository_metadata=required_repository_metadata,
+ toolshed_base_url=toolshed,
+ repository_dependencies=repository_dependencies,
+ all_repository_dependencies=all_repository_dependencies,
+ handled=handled )
+ else:
+ # The repository is in a different tool shed, so build an url and send a request.
+ error_message = "Repository dependencies are currently supported only within the same tool shed. Ignoring repository dependency definition "
+ error_message += "for tool shed %s, name %s, owner %s, changeset revision %s" % ( toolshed, name, owner, changeset_revision )
+ log.debug( error_message )
return all_repository_dependencies
def get_repository_file_contents( file_path ):
- if is_gzip( file_path ):
+ if checkers.is_gzip( file_path ):
safe_str = to_safe_string( '\ngzip compressed file\n' )
- elif is_bz2( file_path ):
+ elif checkers.is_bz2( file_path ):
safe_str = to_safe_string( '\nbz2 compressed file\n' )
- elif check_zip( file_path ):
+ elif checkers.check_zip( file_path ):
safe_str = to_safe_string( '\nzip compressed file\n' )
- elif check_binary( file_path ):
+ elif checkers.check_binary( file_path ):
safe_str = to_safe_string( '\nBinary file\n' )
else:
safe_str = ''
@@ -1526,6 +1559,18 @@
shutil.rmtree( dir )
except:
pass
+def remove_ropository_dependency_reference_to_self( repository_dependencies, repository_key ):
+ """Remove all repository dependencies that point to a revision within its own repository."""
+ clean_repository_dependencies = []
+ repository_tup = repository_key.split( container_util.STRSEP )
+ rd_toolshed, rd_name, rd_owner, rd_changeset_revision = repository_tup
+ for repository_dependency in repository_dependencies:
+ toolshed, name, owner, changeset_revision = repository_dependency
+ if rd_toolshed == toolshed and rd_name == name and rd_owner == owner:
+ log.debug( "Removing repository dependency for repository %s owned by %s since it refers to a revision within itself." % ( name, owner ) )
+ else:
+ clean_repository_dependencies.append( repository_dependency )
+ return clean_repository_dependencies
def remove_tool_dependency_installation_directory( dependency_install_dir ):
if os.path.exists( dependency_install_dir ):
try:
diff -r facdd387b85e814df7428ca8cbb71828d0ec48a2 -r 6d86fa9ca5977060372704346a1e9a2b6308a292 lib/galaxy/webapps/community/controllers/upload.py
--- a/lib/galaxy/webapps/community/controllers/upload.py
+++ b/lib/galaxy/webapps/community/controllers/upload.py
@@ -188,7 +188,7 @@
else:
metadata_dict = {}
if 'tool_dependencies' not in metadata_dict:
- message += 'Name, version and type from a tool requirement tag does not match the information in the "tool_dependencies.xml". '
+ message += 'Name, version and type from a tool requirement tag does not match the information in the "tool_dependencies.xml file". '
status = 'warning'
log.debug( 'Error in tool dependencies for repository %s: %s.' % ( repository.id, repository.name ) )
# Reset the tool_data_tables by loading the empty tool_data_table_conf.xml file.
diff -r facdd387b85e814df7428ca8cbb71828d0ec48a2 -r 6d86fa9ca5977060372704346a1e9a2b6308a292 lib/galaxy/webapps/community/util/container_util.py
--- a/lib/galaxy/webapps/community/util/container_util.py
+++ b/lib/galaxy/webapps/community/util/container_util.py
@@ -212,7 +212,7 @@
repository_dependencies_folder.description = repository_dependencies.get( 'description', None )
repository_dependencies_root_folder.folders.append( repository_dependencies_folder )
del repository_dependencies[ 'description' ]
- # The remaining keys in repository_dependencies should all be folders.
+ # The current keys in repository_dependencies should all be folders.
folder_keys = repository_dependencies.keys()
# If repository_dependencies_folder_key is an entry in repository_dependencies, process it first.
if repository_dependencies_folder_key in repository_dependencies:
@@ -404,7 +404,7 @@
STRSEP,
str( changeset_revision ) )
def get_folder( folder, key ):
- if folder and folder.key == key:
+ if folder.key == key:
return folder
for sub_folder in folder.folders:
return get_folder( sub_folder, key )
@@ -421,25 +421,30 @@
folder_keys, folder_id, repository_dependency_id, repository_name, repository_owner, changeset_revision,
key, val ):
# Only create a new folder object if necessary.
- folder = get_folder( repository_dependencies_root_folder, key )
+ folder = get_folder( repository_dependencies_folder, key )
if not folder:
folder_id += 1
label = generate_repository_dependencies_folder_label_from_key( repository_name, repository_owner, changeset_revision, key )
folder = Folder( id=folder_id, key=key, label=label, parent=repository_dependencies_folder )
for repository_dependency_tup in val:
toolshed, name, owner, changeset_revision = repository_dependency_tup
- if is_root_repository( repository_dependencies_folder_key, toolshed, name, owner ):
- # Do not include repository dependencies that point to a revision within the same repository.
- continue
if is_or_should_be_folder( folder_keys, toolshed, name, owner, changeset_revision ):
check_folder_key = generate_repository_dependencies_key_for_repository( toolshed, name, owner, changeset_revision )
- if get_folder( repository_dependencies_root_folder, check_folder_key ):
- continue
+ check_folder = get_folder( repository_dependencies_folder, check_folder_key )
+ if check_folder:
+ repository_dependency_id += 1
+ repository_dependency = RepositoryDependency( id=repository_dependency_id,
+ toolshed=toolshed,
+ repository_name=name,
+ repository_owner=owner,
+ changeset_revision=changeset_revision )
+ if not check_folder.contains_repository_dependency( repository_dependency ):
+ check_folder.repository_dependencies.append( repository_dependency )
else:
# Create a new folder, which may be populated later.
folder_id += 1
label = generate_repository_dependencies_folder_label_from_key( name, owner, changeset_revision, key )
- sub_folder = Folder( id=folder_id, key=check_folder_key, label=label, parent=repository_dependencies_folder )
+ sub_folder = Folder( id=folder_id, key=check_folder_key, label=label, parent=folder )
folder.folders.append( sub_folder )
else:
repository_dependency_id += 1
@@ -458,11 +463,6 @@
def is_or_should_be_folder( folder_keys, toolshed, repository_name, repository_owner, changeset_revision ):
key = '%s%s%s%s%s%s%s' % ( toolshed, STRSEP, repository_name, STRSEP, repository_owner, STRSEP, changeset_revision )
return key in folder_keys
-def is_root_repository( repository_dependencies_folder_key, toolshed, repository_name, repository_owner ):
- # Return True if a repository dependency points to a revision within it's own repository.
- repository_dependencies_folder_tup = repository_dependencies_folder_key.split( STRSEP )
- rdf_toolshed, rdf_repository_name, rdf_repository_owner, rdf_changeset_revision = repository_dependencies_folder_tup
- return rdf_toolshed == toolshed and rdf_repository_name == repository_name and rdf_repository_owner == repository_owner
def key_is_current_repositorys_key( repository_name, repository_owner, changeset_revision, key ):
toolshed_base_url, key_name, key_owner, key_changeset_revision = get_components_from_key( key )
return repository_name == key_name and repository_owner == key_owner and changeset_revision == key_changeset_revision
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/659392eae2a8/
changeset: 659392eae2a8
user: inithello
date: 2012-12-07 22:38:26
summary: Revert tool migration.
affected #: 35 files
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 lib/galaxy/tool_shed/migrate/versions/0008_tools.py
--- a/lib/galaxy/tool_shed/migrate/versions/0008_tools.py
+++ /dev/null
@@ -1,21 +0,0 @@
-"""
-The following tools have been eliminated from the distribution:
-Add column to an existing dataset, Change Case of selected columns,
-Condense consecutive characters, Convert delimiters to TAB,
-Cut columns from a table, Merge Columns together, Remove beginning of a file,
-Select first lines from a dataset, Select last lines from a dataset,
-and Trim leading or trailing characters. The tools are now available in the
-repositories named add_value, change_case, condense_characters,
-convert_characters, cut_columns, merge_cols, remove_beginning,
-show_beginning, show_tail, and trimmer from the main Galaxy tool shed at
-http://toolshed.g2.bx.psu.edu, and will be installed into your
-local Galaxy instance at the location discussed above by running
-the following command.
-"""
-
-import sys
-
-def upgrade():
- print __doc__
-def downgrade():
- pass
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 scripts/migrate_tools/0008_tools.sh
--- a/scripts/migrate_tools/0008_tools.sh
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/sh
-
-cd `dirname $0`/../..
-python ./scripts/migrate_tools/migrate_tools.py 0008_tools.xml $@
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 scripts/migrate_tools/0008_tools.xml
--- a/scripts/migrate_tools/0008_tools.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0"?>
-<toolshed name="toolshed.g2.bx.psu.edu">
- <repository name="add_value" description="Add a value as a new column." changeset_revision="181dd378275c">
- <tool id="addValue" version="1.0.0" file="fixedValueColumn.xml" />
- </repository>
- <repository name="change_case" description="Change the case of a column." changeset_revision="e6f966602870">
- <tool id="ChangeCase" version="1.0.0" file="changeCase.xml" />
- </repository>
- <repository name="condense_characters" description="Condense repeated characters." changeset_revision="2c08781560de">
- <tool id="Condense characters1" version="1.0.0" file="condense_characters.xml" />
- </repository>
- <repository name="convert_characters" description="Convert delimiters to TAB." changeset_revision="64d46676a13e">
- <tool id="Convert characters1" version="1.0.0" file="convert_characters.xml" />
- </repository>
- <repository name="cut_columns" description="Remove or rearrange columns." changeset_revision="34c29e183ef7">
- <tool id="Cut1" version="1.0.1" file="cutWrapper.xml" />
- </repository>
- <repository name="merge_cols" description="Merge columns together." changeset_revision="28ca7552e884">
- <tool id="mergeCols1" version="1.0.1" file="mergeCols.xml" />
- </repository>
- <repository name="remove_beginning" description="Remove lines from the beginning of a file." changeset_revision="d9b82504a321">
- <tool id="Remove beginning1" version="1.0.0" file="remove_beginning.xml" />
- </repository>
- <repository name="show_beginning" description="Select lines from the beginning of a file." changeset_revision="ecca14446e6a">
- <tool id="Show beginning1" version="1.0.0" file="headWrapper.xml" />
- </repository>
- <repository name="show_tail" description="Select lines from the end of a file." changeset_revision="8bb4d908a523">
- <tool id="Show tail1" version="1.0.0" file="tailWrapper.xml" />
- </repository>
- <repository name="trimmer" description="Trim trailing characters from each line or column." changeset_revision="f862a6e4d096">
- <tool id="trimmer" version="0.0.1" file="trimmer.xml" />
- </repository>
-</toolshed>
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 test-data/a.txt
--- /dev/null
+++ b/test-data/a.txt
@@ -0,0 +1,15 @@
+ CHR SNP BP A1 TEST NMISS BETA STAT P
+ 1 rs1181876 3671541 T DOMDEV 958 -1.415 -3.326 0.0009161
+ 1 rs10492923 5092886 C ADD 1007 5.105 4.368 1.382e-05
+ 1 rs10492923 5092886 C DOMDEV 1007 -5.612 -4.249 2.35e-05
+ 1 rs10492923 5092886 C GENO_2DF 1007 NA 19.9 4.775e-05
+ 1 rs1801133 11778965 T ADD 1022 1.23 3.97 7.682e-05
+ 1 rs1801133 11778965 T GENO_2DF 1022 NA 16.07 0.0003233
+ 1 rs1361912 12663121 A ADD 1021 12.69 4.093 4.596e-05
+ 1 rs1361912 12663121 A DOMDEV 1021 -12.37 -3.945 8.533e-05
+ 1 rs1361912 12663121 A GENO_2DF 1021 NA 17.05 0.0001982
+ 1 rs1009806 19373138 G ADD 1021 -1.334 -3.756 0.0001826
+ 1 rs1009806 19373138 G GENO_2DF 1021 NA 19.36 6.244e-05
+ 1 rs873654 29550948 A DOMDEV 1012 1.526 3.6 0.0003339
+ 1 rs10489527 36800027 C ADD 1016 12.67 4.114 4.211e-05
+ 1 rs10489527 36800027 C DOMDEV 1016 -13.05 -4.02 6.249e-05
\ No newline at end of file
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 test-data/changeCase_out1.tabular
--- /dev/null
+++ b/test-data/changeCase_out1.tabular
@@ -0,0 +1,10 @@
+CHR1 4225 19670
+CHR10 6 8
+CHR1 24417 24420
+CHR6_HLA_HAP2 0 150
+CHR2 1 5
+CHR10 2 10
+CHR1 30 55
+CHRY 1 20
+CHR1 1225979 42287290
+CHR10 7 8
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 test-data/changeCase_out2.tabular
--- /dev/null
+++ b/test-data/changeCase_out2.tabular
@@ -0,0 +1,65 @@
+CHR1 147962192 147962580 CCDS989.1_cds_0_0_chr1_147962193_r 0 -
+CHR1 147984545 147984630 CCDS990.1_cds_0_0_chr1_147984546_f 0 +
+CHR1 148078400 148078582 CCDS993.1_cds_0_0_chr1_148078401_r 0 -
+CHR1 148185136 148185276 CCDS996.1_cds_0_0_chr1_148185137_f 0 +
+CHR10 55251623 55253124 CCDS7248.1_cds_0_0_chr10_55251624_r 0 -
+CHR11 116124407 116124501 CCDS8374.1_cds_0_0_chr11_116124408_r 0 -
+CHR11 116206508 116206563 CCDS8377.1_cds_0_0_chr11_116206509_f 0 +
+CHR11 116211733 116212337 CCDS8378.1_cds_0_0_chr11_116211734_r 0 -
+CHR11 1812377 1812407 CCDS7726.1_cds_0_0_chr11_1812378_f 0 +
+CHR12 38440094 38440321 CCDS8736.1_cds_0_0_chr12_38440095_r 0 -
+CHR13 112381694 112381953 CCDS9526.1_cds_0_0_chr13_112381695_f 0 +
+CHR14 98710240 98712285 CCDS9949.1_cds_0_0_chr14_98710241_r 0 -
+CHR15 41486872 41487060 CCDS10096.1_cds_0_0_chr15_41486873_r 0 -
+CHR15 41673708 41673857 CCDS10097.1_cds_0_0_chr15_41673709_f 0 +
+CHR15 41679161 41679250 CCDS10098.1_cds_0_0_chr15_41679162_r 0 -
+CHR15 41826029 41826196 CCDS10101.1_cds_0_0_chr15_41826030_f 0 +
+CHR16 142908 143003 CCDS10397.1_cds_0_0_chr16_142909_f 0 +
+CHR16 179963 180135 CCDS10401.1_cds_0_0_chr16_179964_r 0 -
+CHR16 244413 244681 CCDS10402.1_cds_0_0_chr16_244414_f 0 +
+CHR16 259268 259383 CCDS10403.1_cds_0_0_chr16_259269_r 0 -
+CHR18 23786114 23786321 CCDS11891.1_cds_0_0_chr18_23786115_r 0 -
+CHR18 59406881 59407046 CCDS11985.1_cds_0_0_chr18_59406882_f 0 +
+CHR18 59455932 59456337 CCDS11986.1_cds_0_0_chr18_59455933_r 0 -
+CHR18 59600586 59600754 CCDS11988.1_cds_0_0_chr18_59600587_f 0 +
+CHR19 59068595 59069564 CCDS12866.1_cds_0_0_chr19_59068596_f 0 +
+CHR19 59236026 59236146 CCDS12872.1_cds_0_0_chr19_59236027_r 0 -
+CHR19 59297998 59298008 CCDS12877.1_cds_0_0_chr19_59297999_f 0 +
+CHR19 59302168 59302288 CCDS12878.1_cds_0_0_chr19_59302169_r 0 -
+CHR2 118288583 118288668 CCDS2120.1_cds_0_0_chr2_118288584_f 0 +
+CHR2 118394148 118394202 CCDS2121.1_cds_0_0_chr2_118394149_r 0 -
+CHR2 220190202 220190242 CCDS2441.1_cds_0_0_chr2_220190203_f 0 +
+CHR2 220229609 220230869 CCDS2443.1_cds_0_0_chr2_220229610_r 0 -
+CHR20 33330413 33330423 CCDS13249.1_cds_0_0_chr20_33330414_r 0 -
+CHR20 33513606 33513792 CCDS13255.1_cds_0_0_chr20_33513607_f 0 +
+CHR20 33579500 33579527 CCDS13256.1_cds_0_0_chr20_33579501_r 0 -
+CHR20 33593260 33593348 CCDS13257.1_cds_0_0_chr20_33593261_f 0 +
+CHR21 32707032 32707192 CCDS13614.1_cds_0_0_chr21_32707033_f 0 +
+CHR21 32869641 32870022 CCDS13615.1_cds_0_0_chr21_32869642_r 0 -
+CHR21 33321040 33322012 CCDS13620.1_cds_0_0_chr21_33321041_f 0 +
+CHR21 33744994 33745040 CCDS13625.1_cds_0_0_chr21_33744995_r 0 -
+CHR22 30120223 30120265 CCDS13897.1_cds_0_0_chr22_30120224_f 0 +
+CHR22 30160419 30160661 CCDS13898.1_cds_0_0_chr22_30160420_r 0 -
+CHR22 30665273 30665360 CCDS13901.1_cds_0_0_chr22_30665274_f 0 +
+CHR22 30939054 30939266 CCDS13903.1_cds_0_0_chr22_30939055_r 0 -
+CHR5 131424298 131424460 CCDS4149.1_cds_0_0_chr5_131424299_f 0 +
+CHR5 131556601 131556672 CCDS4151.1_cds_0_0_chr5_131556602_r 0 -
+CHR5 131621326 131621419 CCDS4152.1_cds_0_0_chr5_131621327_f 0 +
+CHR5 131847541 131847666 CCDS4155.1_cds_0_0_chr5_131847542_r 0 -
+CHR6 108299600 108299744 CCDS5061.1_cds_0_0_chr6_108299601_r 0 -
+CHR6 108594662 108594687 CCDS5063.1_cds_0_0_chr6_108594663_f 0 +
+CHR6 108640045 108640151 CCDS5064.1_cds_0_0_chr6_108640046_r 0 -
+CHR6 108722976 108723115 CCDS5067.1_cds_0_0_chr6_108722977_f 0 +
+CHR7 113660517 113660685 CCDS5760.1_cds_0_0_chr7_113660518_f 0 +
+CHR7 116512159 116512389 CCDS5771.1_cds_0_0_chr7_116512160_r 0 -
+CHR7 116714099 116714152 CCDS5773.1_cds_0_0_chr7_116714100_f 0 +
+CHR7 116945541 116945787 CCDS5774.1_cds_0_0_chr7_116945542_r 0 -
+CHR8 118881131 118881317 CCDS6324.1_cds_0_0_chr8_118881132_r 0 -
+CHR9 128764156 128764189 CCDS6914.1_cds_0_0_chr9_128764157_f 0 +
+CHR9 128787519 128789136 CCDS6915.1_cds_0_0_chr9_128787520_r 0 -
+CHR9 128882427 128882523 CCDS6917.1_cds_0_0_chr9_128882428_f 0 +
+CHR9 128937229 128937445 CCDS6919.1_cds_0_0_chr9_128937230_r 0 -
+CHRX 122745047 122745924 CCDS14606.1_cds_0_0_chrX_122745048_f 0 +
+CHRX 152648964 152649196 CCDS14733.1_cds_0_0_chrX_152648965_r 0 -
+CHRX 152691446 152691471 CCDS14735.1_cds_0_0_chrX_152691447_f 0 +
+CHRX 152694029 152694263 CCDS14736.1_cds_0_0_chrX_152694030_r 0 -
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 test-data/eq-addvalue.dat
--- /dev/null
+++ b/test-data/eq-addvalue.dat
@@ -0,0 +1,65 @@
+chr1 147962192 147962580 CCDS989.1_cds_0_0_chr1_147962193_r 0 - 1
+chr1 147984545 147984630 CCDS990.1_cds_0_0_chr1_147984546_f 0 + 1
+chr1 148078400 148078582 CCDS993.1_cds_0_0_chr1_148078401_r 0 - 1
+chr1 148185136 148185276 CCDS996.1_cds_0_0_chr1_148185137_f 0 + 1
+chr10 55251623 55253124 CCDS7248.1_cds_0_0_chr10_55251624_r 0 - 1
+chr11 116124407 116124501 CCDS8374.1_cds_0_0_chr11_116124408_r 0 - 1
+chr11 116206508 116206563 CCDS8377.1_cds_0_0_chr11_116206509_f 0 + 1
+chr11 116211733 116212337 CCDS8378.1_cds_0_0_chr11_116211734_r 0 - 1
+chr11 1812377 1812407 CCDS7726.1_cds_0_0_chr11_1812378_f 0 + 1
+chr12 38440094 38440321 CCDS8736.1_cds_0_0_chr12_38440095_r 0 - 1
+chr13 112381694 112381953 CCDS9526.1_cds_0_0_chr13_112381695_f 0 + 1
+chr14 98710240 98712285 CCDS9949.1_cds_0_0_chr14_98710241_r 0 - 1
+chr15 41486872 41487060 CCDS10096.1_cds_0_0_chr15_41486873_r 0 - 1
+chr15 41673708 41673857 CCDS10097.1_cds_0_0_chr15_41673709_f 0 + 1
+chr15 41679161 41679250 CCDS10098.1_cds_0_0_chr15_41679162_r 0 - 1
+chr15 41826029 41826196 CCDS10101.1_cds_0_0_chr15_41826030_f 0 + 1
+chr16 142908 143003 CCDS10397.1_cds_0_0_chr16_142909_f 0 + 1
+chr16 179963 180135 CCDS10401.1_cds_0_0_chr16_179964_r 0 - 1
+chr16 244413 244681 CCDS10402.1_cds_0_0_chr16_244414_f 0 + 1
+chr16 259268 259383 CCDS10403.1_cds_0_0_chr16_259269_r 0 - 1
+chr18 23786114 23786321 CCDS11891.1_cds_0_0_chr18_23786115_r 0 - 1
+chr18 59406881 59407046 CCDS11985.1_cds_0_0_chr18_59406882_f 0 + 1
+chr18 59455932 59456337 CCDS11986.1_cds_0_0_chr18_59455933_r 0 - 1
+chr18 59600586 59600754 CCDS11988.1_cds_0_0_chr18_59600587_f 0 + 1
+chr19 59068595 59069564 CCDS12866.1_cds_0_0_chr19_59068596_f 0 + 1
+chr19 59236026 59236146 CCDS12872.1_cds_0_0_chr19_59236027_r 0 - 1
+chr19 59297998 59298008 CCDS12877.1_cds_0_0_chr19_59297999_f 0 + 1
+chr19 59302168 59302288 CCDS12878.1_cds_0_0_chr19_59302169_r 0 - 1
+chr2 118288583 118288668 CCDS2120.1_cds_0_0_chr2_118288584_f 0 + 1
+chr2 118394148 118394202 CCDS2121.1_cds_0_0_chr2_118394149_r 0 - 1
+chr2 220190202 220190242 CCDS2441.1_cds_0_0_chr2_220190203_f 0 + 1
+chr2 220229609 220230869 CCDS2443.1_cds_0_0_chr2_220229610_r 0 - 1
+chr20 33330413 33330423 CCDS13249.1_cds_0_0_chr20_33330414_r 0 - 1
+chr20 33513606 33513792 CCDS13255.1_cds_0_0_chr20_33513607_f 0 + 1
+chr20 33579500 33579527 CCDS13256.1_cds_0_0_chr20_33579501_r 0 - 1
+chr20 33593260 33593348 CCDS13257.1_cds_0_0_chr20_33593261_f 0 + 1
+chr21 32707032 32707192 CCDS13614.1_cds_0_0_chr21_32707033_f 0 + 1
+chr21 32869641 32870022 CCDS13615.1_cds_0_0_chr21_32869642_r 0 - 1
+chr21 33321040 33322012 CCDS13620.1_cds_0_0_chr21_33321041_f 0 + 1
+chr21 33744994 33745040 CCDS13625.1_cds_0_0_chr21_33744995_r 0 - 1
+chr22 30120223 30120265 CCDS13897.1_cds_0_0_chr22_30120224_f 0 + 1
+chr22 30160419 30160661 CCDS13898.1_cds_0_0_chr22_30160420_r 0 - 1
+chr22 30665273 30665360 CCDS13901.1_cds_0_0_chr22_30665274_f 0 + 1
+chr22 30939054 30939266 CCDS13903.1_cds_0_0_chr22_30939055_r 0 - 1
+chr5 131424298 131424460 CCDS4149.1_cds_0_0_chr5_131424299_f 0 + 1
+chr5 131556601 131556672 CCDS4151.1_cds_0_0_chr5_131556602_r 0 - 1
+chr5 131621326 131621419 CCDS4152.1_cds_0_0_chr5_131621327_f 0 + 1
+chr5 131847541 131847666 CCDS4155.1_cds_0_0_chr5_131847542_r 0 - 1
+chr6 108299600 108299744 CCDS5061.1_cds_0_0_chr6_108299601_r 0 - 1
+chr6 108594662 108594687 CCDS5063.1_cds_0_0_chr6_108594663_f 0 + 1
+chr6 108640045 108640151 CCDS5064.1_cds_0_0_chr6_108640046_r 0 - 1
+chr6 108722976 108723115 CCDS5067.1_cds_0_0_chr6_108722977_f 0 + 1
+chr7 113660517 113660685 CCDS5760.1_cds_0_0_chr7_113660518_f 0 + 1
+chr7 116512159 116512389 CCDS5771.1_cds_0_0_chr7_116512160_r 0 - 1
+chr7 116714099 116714152 CCDS5773.1_cds_0_0_chr7_116714100_f 0 + 1
+chr7 116945541 116945787 CCDS5774.1_cds_0_0_chr7_116945542_r 0 - 1
+chr8 118881131 118881317 CCDS6324.1_cds_0_0_chr8_118881132_r 0 - 1
+chr9 128764156 128764189 CCDS6914.1_cds_0_0_chr9_128764157_f 0 + 1
+chr9 128787519 128789136 CCDS6915.1_cds_0_0_chr9_128787520_r 0 - 1
+chr9 128882427 128882523 CCDS6917.1_cds_0_0_chr9_128882428_f 0 + 1
+chr9 128937229 128937445 CCDS6919.1_cds_0_0_chr9_128937230_r 0 - 1
+chrX 122745047 122745924 CCDS14606.1_cds_0_0_chrX_122745048_f 0 + 1
+chrX 152648964 152649196 CCDS14733.1_cds_0_0_chrX_152648965_r 0 - 1
+chrX 152691446 152691471 CCDS14735.1_cds_0_0_chrX_152691447_f 0 + 1
+chrX 152694029 152694263 CCDS14736.1_cds_0_0_chrX_152694030_r 0 - 1
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 test-data/eq-condense.dat
--- /dev/null
+++ b/test-data/eq-condense.dat
@@ -0,0 +1,65 @@
+chr1 147962192 147962580 CCDS989.1_cds_0_0_chr1_147962193_r 0 -
+chr1 147984545 147984630 CCDS990.1_cds_0_0_chr1_147984546_f 0 +
+chr1 148078400 148078582 CCDS993.1_cds_0_0_chr1_148078401_r 0 -
+chr1 148185136 148185276 CCDS996.1_cds_0_0_chr1_148185137_f 0 +
+chr10 55251623 55253124 CCDS7248.1_cds_0_0_chr10_55251624_r 0 -
+chr11 116124407 116124501 CCDS8374.1_cds_0_0_chr11_116124408_r 0 -
+chr11 116206508 116206563 CCDS8377.1_cds_0_0_chr11_116206509_f 0 +
+chr11 116211733 116212337 CCDS8378.1_cds_0_0_chr11_116211734_r 0 -
+chr11 1812377 1812407 CCDS7726.1_cds_0_0_chr11_1812378_f 0 +
+chr12 38440094 38440321 CCDS8736.1_cds_0_0_chr12_38440095_r 0 -
+chr13 112381694 112381953 CCDS9526.1_cds_0_0_chr13_112381695_f 0 +
+chr14 98710240 98712285 CCDS9949.1_cds_0_0_chr14_98710241_r 0 -
+chr15 41486872 41487060 CCDS10096.1_cds_0_0_chr15_41486873_r 0 -
+chr15 41673708 41673857 CCDS10097.1_cds_0_0_chr15_41673709_f 0 +
+chr15 41679161 41679250 CCDS10098.1_cds_0_0_chr15_41679162_r 0 -
+chr15 41826029 41826196 CCDS10101.1_cds_0_0_chr15_41826030_f 0 +
+chr16 142908 143003 CCDS10397.1_cds_0_0_chr16_142909_f 0 +
+chr16 179963 180135 CCDS10401.1_cds_0_0_chr16_179964_r 0 -
+chr16 244413 244681 CCDS10402.1_cds_0_0_chr16_244414_f 0 +
+chr16 259268 259383 CCDS10403.1_cds_0_0_chr16_259269_r 0 -
+chr18 23786114 23786321 CCDS11891.1_cds_0_0_chr18_23786115_r 0 -
+chr18 59406881 59407046 CCDS11985.1_cds_0_0_chr18_59406882_f 0 +
+chr18 59455932 59456337 CCDS11986.1_cds_0_0_chr18_59455933_r 0 -
+chr18 59600586 59600754 CCDS11988.1_cds_0_0_chr18_59600587_f 0 +
+chr19 59068595 59069564 CCDS12866.1_cds_0_0_chr19_59068596_f 0 +
+chr19 59236026 59236146 CCDS12872.1_cds_0_0_chr19_59236027_r 0 -
+chr19 59297998 59298008 CCDS12877.1_cds_0_0_chr19_59297999_f 0 +
+chr19 59302168 59302288 CCDS12878.1_cds_0_0_chr19_59302169_r 0 -
+chr2 118288583 118288668 CCDS2120.1_cds_0_0_chr2_118288584_f 0 +
+chr2 118394148 118394202 CCDS2121.1_cds_0_0_chr2_118394149_r 0 -
+chr2 220190202 220190242 CCDS2441.1_cds_0_0_chr2_220190203_f 0 +
+chr2 220229609 220230869 CCDS2443.1_cds_0_0_chr2_220229610_r 0 -
+chr20 33330413 33330423 CCDS13249.1_cds_0_0_chr20_33330414_r 0 -
+chr20 33513606 33513792 CCDS13255.1_cds_0_0_chr20_33513607_f 0 +
+chr20 33579500 33579527 CCDS13256.1_cds_0_0_chr20_33579501_r 0 -
+chr20 33593260 33593348 CCDS13257.1_cds_0_0_chr20_33593261_f 0 +
+chr21 32707032 32707192 CCDS13614.1_cds_0_0_chr21_32707033_f 0 +
+chr21 32869641 32870022 CCDS13615.1_cds_0_0_chr21_32869642_r 0 -
+chr21 33321040 33322012 CCDS13620.1_cds_0_0_chr21_33321041_f 0 +
+chr21 33744994 33745040 CCDS13625.1_cds_0_0_chr21_33744995_r 0 -
+chr22 30120223 30120265 CCDS13897.1_cds_0_0_chr22_30120224_f 0 +
+chr22 30160419 30160661 CCDS13898.1_cds_0_0_chr22_30160420_r 0 -
+chr22 30665273 30665360 CCDS13901.1_cds_0_0_chr22_30665274_f 0 +
+chr22 30939054 30939266 CCDS13903.1_cds_0_0_chr22_30939055_r 0 -
+chr5 131424298 131424460 CCDS4149.1_cds_0_0_chr5_131424299_f 0 +
+chr5 131556601 131556672 CCDS4151.1_cds_0_0_chr5_131556602_r 0 -
+chr5 131621326 131621419 CCDS4152.1_cds_0_0_chr5_131621327_f 0 +
+chr5 131847541 131847666 CCDS4155.1_cds_0_0_chr5_131847542_r 0 -
+chr6 108299600 108299744 CCDS5061.1_cds_0_0_chr6_108299601_r 0 -
+chr6 108594662 108594687 CCDS5063.1_cds_0_0_chr6_108594663_f 0 +
+chr6 108640045 108640151 CCDS5064.1_cds_0_0_chr6_108640046_r 0 -
+chr6 108722976 108723115 CCDS5067.1_cds_0_0_chr6_108722977_f 0 +
+chr7 113660517 113660685 CCDS5760.1_cds_0_0_chr7_113660518_f 0 +
+chr7 116512159 116512389 CCDS5771.1_cds_0_0_chr7_116512160_r 0 -
+chr7 116714099 116714152 CCDS5773.1_cds_0_0_chr7_116714100_f 0 +
+chr7 116945541 116945787 CCDS5774.1_cds_0_0_chr7_116945542_r 0 -
+chr8 118881131 118881317 CCDS6324.1_cds_0_0_chr8_118881132_r 0 -
+chr9 128764156 128764189 CCDS6914.1_cds_0_0_chr9_128764157_f 0 +
+chr9 128787519 128789136 CCDS6915.1_cds_0_0_chr9_128787520_r 0 -
+chr9 128882427 128882523 CCDS6917.1_cds_0_0_chr9_128882428_f 0 +
+chr9 128937229 128937445 CCDS6919.1_cds_0_0_chr9_128937230_r 0 -
+chrX 122745047 122745924 CCDS14606.1_cds_0_0_chrX_122745048_f 0 +
+chrX 152648964 152649196 CCDS14733.1_cds_0_0_chrX_152648965_r 0 -
+chrX 152691446 152691471 CCDS14735.1_cds_0_0_chrX_152691447_f 0 +
+chrX 152694029 152694263 CCDS14736.1_cds_0_0_chrX_152694030_r 0 -
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 test-data/eq-convert.dat
--- /dev/null
+++ b/test-data/eq-convert.dat
@@ -0,0 +1,65 @@
+chr1 147962192 147962580 CCDS989.1_cds_0_0_chr1_147962193_r 0 -
+chr1 147984545 147984630 CCDS990.1_cds_0_0_chr1_147984546_f 0 +
+chr1 148078400 148078582 CCDS993.1_cds_0_0_chr1_148078401_r 0 -
+chr1 148185136 148185276 CCDS996.1_cds_0_0_chr1_148185137_f 0 +
+chr10 55251623 55253124 CCDS7248.1_cds_0_0_chr10_55251624_r 0 -
+chr11 116124407 116124501 CCDS8374.1_cds_0_0_chr11_116124408_r 0 -
+chr11 116206508 116206563 CCDS8377.1_cds_0_0_chr11_116206509_f 0 +
+chr11 116211733 116212337 CCDS8378.1_cds_0_0_chr11_116211734_r 0 -
+chr11 1812377 1812407 CCDS7726.1_cds_0_0_chr11_1812378_f 0 +
+chr12 38440094 38440321 CCDS8736.1_cds_0_0_chr12_38440095_r 0 -
+chr13 112381694 112381953 CCDS9526.1_cds_0_0_chr13_112381695_f 0 +
+chr14 98710240 98712285 CCDS9949.1_cds_0_0_chr14_98710241_r 0 -
+chr15 41486872 41487060 CCDS10096.1_cds_0_0_chr15_41486873_r 0 -
+chr15 41673708 41673857 CCDS10097.1_cds_0_0_chr15_41673709_f 0 +
+chr15 41679161 41679250 CCDS10098.1_cds_0_0_chr15_41679162_r 0 -
+chr15 41826029 41826196 CCDS10101.1_cds_0_0_chr15_41826030_f 0 +
+chr16 142908 143003 CCDS10397.1_cds_0_0_chr16_142909_f 0 +
+chr16 179963 180135 CCDS10401.1_cds_0_0_chr16_179964_r 0 -
+chr16 244413 244681 CCDS10402.1_cds_0_0_chr16_244414_f 0 +
+chr16 259268 259383 CCDS10403.1_cds_0_0_chr16_259269_r 0 -
+chr18 23786114 23786321 CCDS11891.1_cds_0_0_chr18_23786115_r 0 -
+chr18 59406881 59407046 CCDS11985.1_cds_0_0_chr18_59406882_f 0 +
+chr18 59455932 59456337 CCDS11986.1_cds_0_0_chr18_59455933_r 0 -
+chr18 59600586 59600754 CCDS11988.1_cds_0_0_chr18_59600587_f 0 +
+chr19 59068595 59069564 CCDS12866.1_cds_0_0_chr19_59068596_f 0 +
+chr19 59236026 59236146 CCDS12872.1_cds_0_0_chr19_59236027_r 0 -
+chr19 59297998 59298008 CCDS12877.1_cds_0_0_chr19_59297999_f 0 +
+chr19 59302168 59302288 CCDS12878.1_cds_0_0_chr19_59302169_r 0 -
+chr2 118288583 118288668 CCDS2120.1_cds_0_0_chr2_118288584_f 0 +
+chr2 118394148 118394202 CCDS2121.1_cds_0_0_chr2_118394149_r 0 -
+chr2 220190202 220190242 CCDS2441.1_cds_0_0_chr2_220190203_f 0 +
+chr2 220229609 220230869 CCDS2443.1_cds_0_0_chr2_220229610_r 0 -
+chr20 33330413 33330423 CCDS13249.1_cds_0_0_chr20_33330414_r 0 -
+chr20 33513606 33513792 CCDS13255.1_cds_0_0_chr20_33513607_f 0 +
+chr20 33579500 33579527 CCDS13256.1_cds_0_0_chr20_33579501_r 0 -
+chr20 33593260 33593348 CCDS13257.1_cds_0_0_chr20_33593261_f 0 +
+chr21 32707032 32707192 CCDS13614.1_cds_0_0_chr21_32707033_f 0 +
+chr21 32869641 32870022 CCDS13615.1_cds_0_0_chr21_32869642_r 0 -
+chr21 33321040 33322012 CCDS13620.1_cds_0_0_chr21_33321041_f 0 +
+chr21 33744994 33745040 CCDS13625.1_cds_0_0_chr21_33744995_r 0 -
+chr22 30120223 30120265 CCDS13897.1_cds_0_0_chr22_30120224_f 0 +
+chr22 30160419 30160661 CCDS13898.1_cds_0_0_chr22_30160420_r 0 -
+chr22 30665273 30665360 CCDS13901.1_cds_0_0_chr22_30665274_f 0 +
+chr22 30939054 30939266 CCDS13903.1_cds_0_0_chr22_30939055_r 0 -
+chr5 131424298 131424460 CCDS4149.1_cds_0_0_chr5_131424299_f 0 +
+chr5 131556601 131556672 CCDS4151.1_cds_0_0_chr5_131556602_r 0 -
+chr5 131621326 131621419 CCDS4152.1_cds_0_0_chr5_131621327_f 0 +
+chr5 131847541 131847666 CCDS4155.1_cds_0_0_chr5_131847542_r 0 -
+chr6 108299600 108299744 CCDS5061.1_cds_0_0_chr6_108299601_r 0 -
+chr6 108594662 108594687 CCDS5063.1_cds_0_0_chr6_108594663_f 0 +
+chr6 108640045 108640151 CCDS5064.1_cds_0_0_chr6_108640046_r 0 -
+chr6 108722976 108723115 CCDS5067.1_cds_0_0_chr6_108722977_f 0 +
+chr7 113660517 113660685 CCDS5760.1_cds_0_0_chr7_113660518_f 0 +
+chr7 116512159 116512389 CCDS5771.1_cds_0_0_chr7_116512160_r 0 -
+chr7 116714099 116714152 CCDS5773.1_cds_0_0_chr7_116714100_f 0 +
+chr7 116945541 116945787 CCDS5774.1_cds_0_0_chr7_116945542_r 0 -
+chr8 118881131 118881317 CCDS6324.1_cds_0_0_chr8_118881132_r 0 -
+chr9 128764156 128764189 CCDS6914.1_cds_0_0_chr9_128764157_f 0 +
+chr9 128787519 128789136 CCDS6915.1_cds_0_0_chr9_128787520_r 0 -
+chr9 128882427 128882523 CCDS6917.1_cds_0_0_chr9_128882428_f 0 +
+chr9 128937229 128937445 CCDS6919.1_cds_0_0_chr9_128937230_r 0 -
+chrX 122745047 122745924 CCDS14606.1_cds_0_0_chrX_122745048_f 0 +
+chrX 152648964 152649196 CCDS14733.1_cds_0_0_chrX_152648965_r 0 -
+chrX 152691446 152691471 CCDS14735.1_cds_0_0_chrX_152691447_f 0 +
+chrX 152694029 152694263 CCDS14736.1_cds_0_0_chrX_152694030_r 0 -
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 test-data/eq-cut.dat
--- /dev/null
+++ b/test-data/eq-cut.dat
@@ -0,0 +1,65 @@
+chr1 CCDS989.1_cds_0_0_chr1_147962193_r 147962192 147962580
+chr1 CCDS990.1_cds_0_0_chr1_147984546_f 147984545 147984630
+chr1 CCDS993.1_cds_0_0_chr1_148078401_r 148078400 148078582
+chr1 CCDS996.1_cds_0_0_chr1_148185137_f 148185136 148185276
+chr10 CCDS7248.1_cds_0_0_chr10_55251624_r 55251623 55253124
+chr11 CCDS8374.1_cds_0_0_chr11_116124408_r 116124407 116124501
+chr11 CCDS8377.1_cds_0_0_chr11_116206509_f 116206508 116206563
+chr11 CCDS8378.1_cds_0_0_chr11_116211734_r 116211733 116212337
+chr11 CCDS7726.1_cds_0_0_chr11_1812378_f 1812377 1812407
+chr12 CCDS8736.1_cds_0_0_chr12_38440095_r 38440094 38440321
+chr13 CCDS9526.1_cds_0_0_chr13_112381695_f 112381694 112381953
+chr14 CCDS9949.1_cds_0_0_chr14_98710241_r 98710240 98712285
+chr15 CCDS10096.1_cds_0_0_chr15_41486873_r 41486872 41487060
+chr15 CCDS10097.1_cds_0_0_chr15_41673709_f 41673708 41673857
+chr15 CCDS10098.1_cds_0_0_chr15_41679162_r 41679161 41679250
+chr15 CCDS10101.1_cds_0_0_chr15_41826030_f 41826029 41826196
+chr16 CCDS10397.1_cds_0_0_chr16_142909_f 142908 143003
+chr16 CCDS10401.1_cds_0_0_chr16_179964_r 179963 180135
+chr16 CCDS10402.1_cds_0_0_chr16_244414_f 244413 244681
+chr16 CCDS10403.1_cds_0_0_chr16_259269_r 259268 259383
+chr18 CCDS11891.1_cds_0_0_chr18_23786115_r 23786114 23786321
+chr18 CCDS11985.1_cds_0_0_chr18_59406882_f 59406881 59407046
+chr18 CCDS11986.1_cds_0_0_chr18_59455933_r 59455932 59456337
+chr18 CCDS11988.1_cds_0_0_chr18_59600587_f 59600586 59600754
+chr19 CCDS12866.1_cds_0_0_chr19_59068596_f 59068595 59069564
+chr19 CCDS12872.1_cds_0_0_chr19_59236027_r 59236026 59236146
+chr19 CCDS12877.1_cds_0_0_chr19_59297999_f 59297998 59298008
+chr19 CCDS12878.1_cds_0_0_chr19_59302169_r 59302168 59302288
+chr2 CCDS2120.1_cds_0_0_chr2_118288584_f 118288583 118288668
+chr2 CCDS2121.1_cds_0_0_chr2_118394149_r 118394148 118394202
+chr2 CCDS2441.1_cds_0_0_chr2_220190203_f 220190202 220190242
+chr2 CCDS2443.1_cds_0_0_chr2_220229610_r 220229609 220230869
+chr20 CCDS13249.1_cds_0_0_chr20_33330414_r 33330413 33330423
+chr20 CCDS13255.1_cds_0_0_chr20_33513607_f 33513606 33513792
+chr20 CCDS13256.1_cds_0_0_chr20_33579501_r 33579500 33579527
+chr20 CCDS13257.1_cds_0_0_chr20_33593261_f 33593260 33593348
+chr21 CCDS13614.1_cds_0_0_chr21_32707033_f 32707032 32707192
+chr21 CCDS13615.1_cds_0_0_chr21_32869642_r 32869641 32870022
+chr21 CCDS13620.1_cds_0_0_chr21_33321041_f 33321040 33322012
+chr21 CCDS13625.1_cds_0_0_chr21_33744995_r 33744994 33745040
+chr22 CCDS13897.1_cds_0_0_chr22_30120224_f 30120223 30120265
+chr22 CCDS13898.1_cds_0_0_chr22_30160420_r 30160419 30160661
+chr22 CCDS13901.1_cds_0_0_chr22_30665274_f 30665273 30665360
+chr22 CCDS13903.1_cds_0_0_chr22_30939055_r 30939054 30939266
+chr5 CCDS4149.1_cds_0_0_chr5_131424299_f 131424298 131424460
+chr5 CCDS4151.1_cds_0_0_chr5_131556602_r 131556601 131556672
+chr5 CCDS4152.1_cds_0_0_chr5_131621327_f 131621326 131621419
+chr5 CCDS4155.1_cds_0_0_chr5_131847542_r 131847541 131847666
+chr6 CCDS5061.1_cds_0_0_chr6_108299601_r 108299600 108299744
+chr6 CCDS5063.1_cds_0_0_chr6_108594663_f 108594662 108594687
+chr6 CCDS5064.1_cds_0_0_chr6_108640046_r 108640045 108640151
+chr6 CCDS5067.1_cds_0_0_chr6_108722977_f 108722976 108723115
+chr7 CCDS5760.1_cds_0_0_chr7_113660518_f 113660517 113660685
+chr7 CCDS5771.1_cds_0_0_chr7_116512160_r 116512159 116512389
+chr7 CCDS5773.1_cds_0_0_chr7_116714100_f 116714099 116714152
+chr7 CCDS5774.1_cds_0_0_chr7_116945542_r 116945541 116945787
+chr8 CCDS6324.1_cds_0_0_chr8_118881132_r 118881131 118881317
+chr9 CCDS6914.1_cds_0_0_chr9_128764157_f 128764156 128764189
+chr9 CCDS6915.1_cds_0_0_chr9_128787520_r 128787519 128789136
+chr9 CCDS6917.1_cds_0_0_chr9_128882428_f 128882427 128882523
+chr9 CCDS6919.1_cds_0_0_chr9_128937230_r 128937229 128937445
+chrX CCDS14606.1_cds_0_0_chrX_122745048_f 122745047 122745924
+chrX CCDS14733.1_cds_0_0_chrX_152648965_r 152648964 152649196
+chrX CCDS14735.1_cds_0_0_chrX_152691447_f 152691446 152691471
+chrX CCDS14736.1_cds_0_0_chrX_152694030_r 152694029 152694263
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 test-data/mergeCols.dat
--- /dev/null
+++ b/test-data/mergeCols.dat
@@ -0,0 +1,65 @@
+chr1 147962192 147962580 CCDS989.1_cds_0_0_chr1_147962193_r 0 - CCDS989.1_cds_0_0_chr1_147962193_rchr1-
+chr1 147984545 147984630 CCDS990.1_cds_0_0_chr1_147984546_f 0 + CCDS990.1_cds_0_0_chr1_147984546_fchr1+
+chr1 148078400 148078582 CCDS993.1_cds_0_0_chr1_148078401_r 0 - CCDS993.1_cds_0_0_chr1_148078401_rchr1-
+chr1 148185136 148185276 CCDS996.1_cds_0_0_chr1_148185137_f 0 + CCDS996.1_cds_0_0_chr1_148185137_fchr1+
+chr10 55251623 55253124 CCDS7248.1_cds_0_0_chr10_55251624_r 0 - CCDS7248.1_cds_0_0_chr10_55251624_rchr10-
+chr11 116124407 116124501 CCDS8374.1_cds_0_0_chr11_116124408_r 0 - CCDS8374.1_cds_0_0_chr11_116124408_rchr11-
+chr11 116206508 116206563 CCDS8377.1_cds_0_0_chr11_116206509_f 0 + CCDS8377.1_cds_0_0_chr11_116206509_fchr11+
+chr11 116211733 116212337 CCDS8378.1_cds_0_0_chr11_116211734_r 0 - CCDS8378.1_cds_0_0_chr11_116211734_rchr11-
+chr11 1812377 1812407 CCDS7726.1_cds_0_0_chr11_1812378_f 0 + CCDS7726.1_cds_0_0_chr11_1812378_fchr11+
+chr12 38440094 38440321 CCDS8736.1_cds_0_0_chr12_38440095_r 0 - CCDS8736.1_cds_0_0_chr12_38440095_rchr12-
+chr13 112381694 112381953 CCDS9526.1_cds_0_0_chr13_112381695_f 0 + CCDS9526.1_cds_0_0_chr13_112381695_fchr13+
+chr14 98710240 98712285 CCDS9949.1_cds_0_0_chr14_98710241_r 0 - CCDS9949.1_cds_0_0_chr14_98710241_rchr14-
+chr15 41486872 41487060 CCDS10096.1_cds_0_0_chr15_41486873_r 0 - CCDS10096.1_cds_0_0_chr15_41486873_rchr15-
+chr15 41673708 41673857 CCDS10097.1_cds_0_0_chr15_41673709_f 0 + CCDS10097.1_cds_0_0_chr15_41673709_fchr15+
+chr15 41679161 41679250 CCDS10098.1_cds_0_0_chr15_41679162_r 0 - CCDS10098.1_cds_0_0_chr15_41679162_rchr15-
+chr15 41826029 41826196 CCDS10101.1_cds_0_0_chr15_41826030_f 0 + CCDS10101.1_cds_0_0_chr15_41826030_fchr15+
+chr16 142908 143003 CCDS10397.1_cds_0_0_chr16_142909_f 0 + CCDS10397.1_cds_0_0_chr16_142909_fchr16+
+chr16 179963 180135 CCDS10401.1_cds_0_0_chr16_179964_r 0 - CCDS10401.1_cds_0_0_chr16_179964_rchr16-
+chr16 244413 244681 CCDS10402.1_cds_0_0_chr16_244414_f 0 + CCDS10402.1_cds_0_0_chr16_244414_fchr16+
+chr16 259268 259383 CCDS10403.1_cds_0_0_chr16_259269_r 0 - CCDS10403.1_cds_0_0_chr16_259269_rchr16-
+chr18 23786114 23786321 CCDS11891.1_cds_0_0_chr18_23786115_r 0 - CCDS11891.1_cds_0_0_chr18_23786115_rchr18-
+chr18 59406881 59407046 CCDS11985.1_cds_0_0_chr18_59406882_f 0 + CCDS11985.1_cds_0_0_chr18_59406882_fchr18+
+chr18 59455932 59456337 CCDS11986.1_cds_0_0_chr18_59455933_r 0 - CCDS11986.1_cds_0_0_chr18_59455933_rchr18-
+chr18 59600586 59600754 CCDS11988.1_cds_0_0_chr18_59600587_f 0 + CCDS11988.1_cds_0_0_chr18_59600587_fchr18+
+chr19 59068595 59069564 CCDS12866.1_cds_0_0_chr19_59068596_f 0 + CCDS12866.1_cds_0_0_chr19_59068596_fchr19+
+chr19 59236026 59236146 CCDS12872.1_cds_0_0_chr19_59236027_r 0 - CCDS12872.1_cds_0_0_chr19_59236027_rchr19-
+chr19 59297998 59298008 CCDS12877.1_cds_0_0_chr19_59297999_f 0 + CCDS12877.1_cds_0_0_chr19_59297999_fchr19+
+chr19 59302168 59302288 CCDS12878.1_cds_0_0_chr19_59302169_r 0 - CCDS12878.1_cds_0_0_chr19_59302169_rchr19-
+chr2 118288583 118288668 CCDS2120.1_cds_0_0_chr2_118288584_f 0 + CCDS2120.1_cds_0_0_chr2_118288584_fchr2+
+chr2 118394148 118394202 CCDS2121.1_cds_0_0_chr2_118394149_r 0 - CCDS2121.1_cds_0_0_chr2_118394149_rchr2-
+chr2 220190202 220190242 CCDS2441.1_cds_0_0_chr2_220190203_f 0 + CCDS2441.1_cds_0_0_chr2_220190203_fchr2+
+chr2 220229609 220230869 CCDS2443.1_cds_0_0_chr2_220229610_r 0 - CCDS2443.1_cds_0_0_chr2_220229610_rchr2-
+chr20 33330413 33330423 CCDS13249.1_cds_0_0_chr20_33330414_r 0 - CCDS13249.1_cds_0_0_chr20_33330414_rchr20-
+chr20 33513606 33513792 CCDS13255.1_cds_0_0_chr20_33513607_f 0 + CCDS13255.1_cds_0_0_chr20_33513607_fchr20+
+chr20 33579500 33579527 CCDS13256.1_cds_0_0_chr20_33579501_r 0 - CCDS13256.1_cds_0_0_chr20_33579501_rchr20-
+chr20 33593260 33593348 CCDS13257.1_cds_0_0_chr20_33593261_f 0 + CCDS13257.1_cds_0_0_chr20_33593261_fchr20+
+chr21 32707032 32707192 CCDS13614.1_cds_0_0_chr21_32707033_f 0 + CCDS13614.1_cds_0_0_chr21_32707033_fchr21+
+chr21 32869641 32870022 CCDS13615.1_cds_0_0_chr21_32869642_r 0 - CCDS13615.1_cds_0_0_chr21_32869642_rchr21-
+chr21 33321040 33322012 CCDS13620.1_cds_0_0_chr21_33321041_f 0 + CCDS13620.1_cds_0_0_chr21_33321041_fchr21+
+chr21 33744994 33745040 CCDS13625.1_cds_0_0_chr21_33744995_r 0 - CCDS13625.1_cds_0_0_chr21_33744995_rchr21-
+chr22 30120223 30120265 CCDS13897.1_cds_0_0_chr22_30120224_f 0 + CCDS13897.1_cds_0_0_chr22_30120224_fchr22+
+chr22 30160419 30160661 CCDS13898.1_cds_0_0_chr22_30160420_r 0 - CCDS13898.1_cds_0_0_chr22_30160420_rchr22-
+chr22 30665273 30665360 CCDS13901.1_cds_0_0_chr22_30665274_f 0 + CCDS13901.1_cds_0_0_chr22_30665274_fchr22+
+chr22 30939054 30939266 CCDS13903.1_cds_0_0_chr22_30939055_r 0 - CCDS13903.1_cds_0_0_chr22_30939055_rchr22-
+chr5 131424298 131424460 CCDS4149.1_cds_0_0_chr5_131424299_f 0 + CCDS4149.1_cds_0_0_chr5_131424299_fchr5+
+chr5 131556601 131556672 CCDS4151.1_cds_0_0_chr5_131556602_r 0 - CCDS4151.1_cds_0_0_chr5_131556602_rchr5-
+chr5 131621326 131621419 CCDS4152.1_cds_0_0_chr5_131621327_f 0 + CCDS4152.1_cds_0_0_chr5_131621327_fchr5+
+chr5 131847541 131847666 CCDS4155.1_cds_0_0_chr5_131847542_r 0 - CCDS4155.1_cds_0_0_chr5_131847542_rchr5-
+chr6 108299600 108299744 CCDS5061.1_cds_0_0_chr6_108299601_r 0 - CCDS5061.1_cds_0_0_chr6_108299601_rchr6-
+chr6 108594662 108594687 CCDS5063.1_cds_0_0_chr6_108594663_f 0 + CCDS5063.1_cds_0_0_chr6_108594663_fchr6+
+chr6 108640045 108640151 CCDS5064.1_cds_0_0_chr6_108640046_r 0 - CCDS5064.1_cds_0_0_chr6_108640046_rchr6-
+chr6 108722976 108723115 CCDS5067.1_cds_0_0_chr6_108722977_f 0 + CCDS5067.1_cds_0_0_chr6_108722977_fchr6+
+chr7 113660517 113660685 CCDS5760.1_cds_0_0_chr7_113660518_f 0 + CCDS5760.1_cds_0_0_chr7_113660518_fchr7+
+chr7 116512159 116512389 CCDS5771.1_cds_0_0_chr7_116512160_r 0 - CCDS5771.1_cds_0_0_chr7_116512160_rchr7-
+chr7 116714099 116714152 CCDS5773.1_cds_0_0_chr7_116714100_f 0 + CCDS5773.1_cds_0_0_chr7_116714100_fchr7+
+chr7 116945541 116945787 CCDS5774.1_cds_0_0_chr7_116945542_r 0 - CCDS5774.1_cds_0_0_chr7_116945542_rchr7-
+chr8 118881131 118881317 CCDS6324.1_cds_0_0_chr8_118881132_r 0 - CCDS6324.1_cds_0_0_chr8_118881132_rchr8-
+chr9 128764156 128764189 CCDS6914.1_cds_0_0_chr9_128764157_f 0 + CCDS6914.1_cds_0_0_chr9_128764157_fchr9+
+chr9 128787519 128789136 CCDS6915.1_cds_0_0_chr9_128787520_r 0 - CCDS6915.1_cds_0_0_chr9_128787520_rchr9-
+chr9 128882427 128882523 CCDS6917.1_cds_0_0_chr9_128882428_f 0 + CCDS6917.1_cds_0_0_chr9_128882428_fchr9+
+chr9 128937229 128937445 CCDS6919.1_cds_0_0_chr9_128937230_r 0 - CCDS6919.1_cds_0_0_chr9_128937230_rchr9-
+chrX 122745047 122745924 CCDS14606.1_cds_0_0_chrX_122745048_f 0 + CCDS14606.1_cds_0_0_chrX_122745048_fchrX+
+chrX 152648964 152649196 CCDS14733.1_cds_0_0_chrX_152648965_r 0 - CCDS14733.1_cds_0_0_chrX_152648965_rchrX-
+chrX 152691446 152691471 CCDS14735.1_cds_0_0_chrX_152691447_f 0 + CCDS14735.1_cds_0_0_chrX_152691447_fchrX+
+chrX 152694029 152694263 CCDS14736.1_cds_0_0_chrX_152694030_r 0 - CCDS14736.1_cds_0_0_chrX_152694030_rchrX-
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 test-data/trimmer_a_f_c0_s1_e13_i62.dat
--- /dev/null
+++ b/test-data/trimmer_a_f_c0_s1_e13_i62.dat
@@ -0,0 +1,5 @@
+12345 abcdef
+67890 ghjkl g
+>assa lljlj ljlj
+sasas hghg hg
+@dgf gfgf gfg
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 test-data/trimmer_a_f_c2_s1_e2_i62.dat
--- /dev/null
+++ b/test-data/trimmer_a_f_c2_s1_e2_i62.dat
@@ -0,0 +1,5 @@
+12345 ab xyz
+67890 gh ghjt
+>assa lljlj ljlj
+sasas hg hghg
+@dgf gf gfgf
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 test-data/trimmer_tab_delimited.dat
--- /dev/null
+++ b/test-data/trimmer_tab_delimited.dat
@@ -0,0 +1,5 @@
+12345 abcdef xyz
+67890 ghjkl ghjt
+>assa lljlj ljlj
+sasas hghg hghg
+@dgf gfgf gfgf
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tool_conf.xml.sample
--- a/tool_conf.xml.sample
+++ b/tool_conf.xml.sample
@@ -44,12 +44,21 @@
<tool file="extract/liftOver_wrapper.xml" /></section><section name="Text Manipulation" id="textutil">
+ <tool file="filters/fixedValueColumn.xml" /><tool file="stats/column_maker.xml" /><tool file="filters/catWrapper.xml" /><tool file="filters/cutWrapper.xml" />
+ <tool file="filters/mergeCols.xml" />
+ <tool file="filters/convert_characters.xml" /><tool file="filters/CreateInterval.xml" />
+ <tool file="filters/cutWrapper.xml" />
+ <tool file="filters/changeCase.xml" /><tool file="filters/pasteWrapper.xml" />
+ <tool file="filters/remove_beginning.xml" /><tool file="filters/randomlines.xml" />
+ <tool file="filters/headWrapper.xml" />
+ <tool file="filters/tailWrapper.xml" />
+ <tool file="filters/trimmer.xml" /><tool file="filters/wc_gnu.xml" /><tool file="filters/secure_hash_message_digest.xml" /><tool file="stats/dna_filtering.xml" />
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/changeCase.pl
--- /dev/null
+++ b/tools/filters/changeCase.pl
@@ -0,0 +1,58 @@
+#! /usr/bin/perl -w
+
+use strict;
+use warnings;
+
+my $columns = {};
+my $del = "";
+my @in = ();
+my @out = ();
+my $command = "";
+my $field = 0;
+
+# a wrapper for changing the case of columns from within galaxy
+# isaChangeCase.pl [filename] [columns] [delim] [casing] [output]
+
+die "Check arguments: $0 [filename] [columns] [delim] [casing] [output]\n" unless @ARGV == 5;
+
+# process column input
+$ARGV[1] =~ s/\s+//g;
+foreach ( split /,/, $ARGV[1] ) {
+ if (m/^c\d{1,}$/i) {
+ s/c//ig;
+ $columns->{$_} = --$_;
+ }
+}
+
+die "No columns specified, columns are not preceeded with 'c', or commas are not used to separate column numbers: $ARGV[1]\n" if keys %$columns == 0;
+
+my $column_delimiters_href = {
+ 'TAB' => q{\t},
+ 'COMMA' => ",",
+ 'DASH' => "-",
+ 'UNDERSCORE' => "_",
+ 'PIPE' => q{\|},
+ 'DOT' => q{\.},
+ 'SPACE' => q{\s+}
+};
+
+$del = $column_delimiters_href->{$ARGV[2]};
+
+open (OUT, ">$ARGV[4]") or die "Cannot create $ARGV[4]:$!\n";
+open (IN, "<$ARGV[0]") or die "Cannot open $ARGV[0]:$!\n";
+while (<IN>) {
+ chop;
+ @in = split /$del/;
+ for ( my $i = 0; $i <= $#in; ++$i) {
+ if (exists $columns->{$i}) {
+ push(@out, $ARGV[3] eq 'up' ? uc($in[$i]) : lc($in[$i]));
+ } else {
+ push(@out, $in[$i]);
+ }
+ }
+ print OUT join("\t",@out), "\n";
+ @out = ();
+}
+close IN;
+
+close OUT;
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/changeCase.xml
--- /dev/null
+++ b/tools/filters/changeCase.xml
@@ -0,0 +1,77 @@
+<tool id="ChangeCase" name="Change Case">
+ <description> of selected columns</description>
+ <stdio>
+ <exit_code range="1:" err_level="fatal" />
+ </stdio>
+ <command interpreter="perl">changeCase.pl $input "$cols" $delimiter $casing $out_file1</command>
+ <inputs>
+ <param name="input" format="txt" type="data" label="From"/>
+ <param name="cols" size="10" type="text" value="c1,c2" label="Change case of columns"/>
+ <param name="delimiter" type="select" label="Delimited by">
+ <option value="TAB">Tab</option>
+ <option value="SPACE">Whitespace</option>
+ <option value="DOT">Dot</option>
+ <option value="COMMA">Comma</option>
+ <option value="DASH">Dash</option>
+ <option value="UNDERSCORE">Underscore</option>
+ <option value="PIPE">Pipe</option>
+ </param>
+ <param name="casing" type="select" label="To">
+ <option value="up">Upper case</option>
+ <option value="lo">Lower case</option>
+ </param>
+ </inputs>
+ <outputs>
+ <data format="tabular" name="out_file1" />
+ </outputs>
+ <tests>
+ <test>
+ <param name="input" value="1.txt" ftype="txt"/>
+ <param name="cols" value="c1"/>
+ <param name="delimiter" value="SPACE"/>
+ <param name="casing" value="up"/>
+ <output name="out_file1" file="changeCase_out1.tabular"/>
+ </test>
+ <test>
+ <param name="input" value="1.bed" ftype="bed"/>
+ <param name="cols" value="c1"/>
+ <param name="delimiter" value="TAB"/>
+ <param name="casing" value="up"/>
+ <output name="out_file1" file="changeCase_out2.tabular"/>
+ </test>
+ </tests>
+ <help>
+
+.. class:: warningmark
+
+**This tool breaks column assignments.** To re-establish column assignments run the tool and click on the pencil icon in the resulting history item.
+
+.. class:: warningmark
+
+The format of the resulting dataset from this tool is always tabular.
+
+-----
+
+**What it does**
+
+This tool selects specified columns from a dataset and converts the values of those columns to upper or lower case.
+
+- Columns are specified as **c1**, **c2**, and so on.
+- Columns can be specified in any order (e.g., **c2,c1,c6**)
+
+-----
+
+**Example**
+
+Changing columns 1 and 3 ( delimited by Comma ) to upper case in::
+
+ apple,is,good
+ windows,is,bad
+
+will result in::
+
+ APPLE is GOOD
+ WINDOWS is BAD
+
+ </help>
+</tool>
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/condense_characters.pl
--- /dev/null
+++ b/tools/filters/condense_characters.pl
@@ -0,0 +1,105 @@
+#! /usr/bin/perl -w
+
+use strict;
+use warnings;
+
+# condenses all consecutive characters of one type
+# convert_characters.pl [input] [character] [output]
+
+die "Check arguments" unless @ARGV == 3;
+
+my $inputfile = $ARGV[0];
+my $character = $ARGV[1];
+my $outputfile = $ARGV[2];
+
+
+my $convert_from;
+my $convert_to;
+
+
+if ($character eq "s")
+{
+ $convert_from = '\s';
+}
+elsif ($character eq "T")
+{
+ $convert_from = '\t';
+}
+elsif ($character eq "Sp")
+{
+ $convert_from = " ";
+}
+elsif ($character eq "Dt")
+{
+ $convert_from = '\.';
+}
+elsif ($character eq "C")
+{
+ $convert_from = ",";
+}
+elsif ($character eq "D")
+{
+ $convert_from = "-";
+}
+elsif ($character eq "U")
+{
+ $convert_from = "_";
+}
+elsif ($character eq "P")
+{
+ $convert_from = '\|';
+}
+else
+{
+ die "Invalid value specified for convert from\n";
+}
+
+
+if ($character eq "T")
+{
+ $convert_to = "\t";
+}
+elsif ($character eq "Sp")
+{
+ $convert_to = " ";
+}
+elsif ($character eq "Dt")
+{
+ $convert_to = "\.";
+}
+elsif ($character eq "C")
+{
+ $convert_to = ",";
+}
+elsif ($character eq "D")
+{
+ $convert_to = "-";
+}
+elsif ($character eq "U")
+{
+ $convert_to = "_";
+}
+elsif ($character eq "P")
+{
+ $convert_to = "|";
+}
+else
+{
+ die "Invalid value specified for Convert to\n";
+}
+
+my $fhIn;
+open ($fhIn, "< $inputfile") or die "Cannot open source file";
+
+my $fhOut;
+open ($fhOut, "> $outputfile");
+
+while (<$fhIn>)
+{
+ my $thisLine = $_;
+ chomp $thisLine;
+ $thisLine =~ s/${convert_from}+/$convert_to/g;
+ print $fhOut $thisLine,"\n";
+}
+close ($fhIn) or die "Cannot close source file";
+close ($fhOut) or die "Cannot close output file";
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/condense_characters.xml
--- /dev/null
+++ b/tools/filters/condense_characters.xml
@@ -0,0 +1,48 @@
+<tool id="Condense characters1" name="Condense">
+ <description>consecutive characters</description>
+ <command interpreter="perl">condense_characters.pl $input $character $out_file1</command>
+ <inputs>
+<!-- <display>condense all consecutive $character from $input</display> -->
+ <param name="character" type="select" label="Condense all consecutive">
+ <option value="T">Tabs</option>
+ <option value="Sp">Spaces</option>
+ <option value="Dt">Dots</option>
+ <option value="C">Commas</option>
+ <option value="D">Dashes</option>
+ <option value="U">Underscores</option>
+ <option value="P">Pipes</option>
+ </param>
+ <param format="txt" name="input" type="data" label="in this Query"/>
+ </inputs>
+ <outputs>
+ <data format="input" name="out_file1" metadata_source="input" />
+ </outputs>
+ <tests>
+ <test>
+ <param name="character" value="T"/>
+ <param name="input" value="1.bed"/>
+ <output name="out_file1" file="eq-condense.dat"/>
+ </test>
+ </tests>
+ <help>
+
+**What it does**
+
+This tool condenses all consecutive characters of a specified type.
+
+-----
+
+**Example**
+
+- Input file::
+
+ geneX,,,10,,,,,20
+ geneY,,5,,,,,12,15,9,
+
+- Condense all consecutive commas. The above file will be converted into::
+
+ geneX,10,20
+ geneY,5,12,15,9
+
+</help>
+</tool>
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/convert_characters.py
--- /dev/null
+++ b/tools/filters/convert_characters.py
@@ -0,0 +1,42 @@
+#!/usr/bin/env python
+#By, Guruprasad Ananda.
+
+from galaxy import eggs
+import sys, re
+
+def stop_err(msg):
+ sys.stderr.write(msg)
+ sys.exit()
+
+def main():
+ if len(sys.argv) != 4:
+ stop_err("usage: convert_characters infile from_char outfile")
+
+ try:
+ fin = open(sys.argv[1],'r')
+ except:
+ stop_err("Input file cannot be opened for reading.")
+
+ from_char = sys.argv[2]
+
+ try:
+ fout = open(sys.argv[3],'w')
+ except:
+ stop_err("Output file cannot be opened for writing.")
+
+ char_dict = {'T':'\t','s':'\s','Dt':'\.','C':',','D':'-','U':'_','P':'\|','Co':':'}
+ from_ch = char_dict[from_char] + '+' #making an RE to match 1 or more occurences.
+ skipped = 0
+
+ for line in fin:
+ line = line.strip()
+ try:
+ fout.write("%s\n" %(re.sub(from_ch,'\t',line)))
+ except:
+ skipped += 1
+
+ if skipped:
+ print "Skipped %d lines as invalid." %skipped
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/convert_characters.xml
--- /dev/null
+++ b/tools/filters/convert_characters.xml
@@ -0,0 +1,58 @@
+<tool id="Convert characters1" name="Convert">
+ <description>delimiters to TAB</description>
+ <command interpreter="python">convert_characters.py $input $convert_from $out_file1</command>
+ <inputs>
+ <param name="convert_from" type="select" label="Convert all">
+ <option value="s">Whitespaces</option>
+ <option value="T">Tabs</option>
+ <!--<option value="Sp">Spaces</option>-->
+ <option value="Dt">Dots</option>
+ <option value="C">Commas</option>
+ <option value="D">Dashes</option>
+ <option value="U">Underscores</option>
+ <option value="P">Pipes</option>
+ <option value="Co">Colons</option>
+ </param>
+ <param format="txt" name="input" type="data" label="in Query"/>
+ </inputs>
+ <outputs>
+ <data format="tabular" name="out_file1" />
+ </outputs>
+ <tests>
+ <test>
+ <param name="convert_from" value="s"/>
+ <param name="input" value="1.bed"/>
+ <output name="out_file1" file="eq-convert.dat"/>
+ </test>
+ <test>
+ <param name="convert_from" value="s"/>
+ <param name="input" value="a.txt"/>
+ <output name="out_file1" file="a.tab"/>
+ </test>
+ </tests>
+ <help>
+
+**What it does**
+
+Converts all delimiters of a specified type into TABs. Consecutive characters are condensed. For example, if columns are separated by 5 spaces they will converted into 1 tab.
+
+-----
+
+**Example**
+
+- Input file::
+
+ chrX||151283558|151283724|NM_000808_exon_8_0_chrX_151283559_r|0|-
+ chrX|151370273|151370486|NM_000808_exon_9_0_chrX_151370274_r|0|-
+ chrX|151559494|151559583|NM_018558_exon_1_0_chrX_151559495_f|0|+
+ chrX|151564643|151564711|NM_018558_exon_2_0_chrX_151564644_f||||0|+
+
+- Converting all pipe delimiters of the above file to TABs will get::
+
+ chrX 151283558 151283724 NM_000808_exon_8_0_chrX_151283559_r 0 -
+ chrX 151370273 151370486 NM_000808_exon_9_0_chrX_151370274_r 0 -
+ chrX 151559494 151559583 NM_018558_exon_1_0_chrX_151559495_f 0 +
+ chrX 151564643 151564711 NM_018558_exon_2_0_chrX_151564644_f 0 +
+
+</help>
+</tool>
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/cutWrapper.pl
--- /dev/null
+++ b/tools/filters/cutWrapper.pl
@@ -0,0 +1,77 @@
+#!/usr/bin/perl -w
+
+use strict;
+use warnings;
+
+my @columns = ();
+my $del = "";
+my @in = ();
+my @out = ();
+my $command = "";
+my $field = 0;
+
+# a wrapper for cut for use in galaxy
+# cutWrapper.pl [filename] [columns] [delim] [output]
+
+die "Check arguments\n" unless @ARGV == 4;
+
+$ARGV[1] =~ s/\s+//g;
+foreach ( split /,/, $ARGV[1] ) {
+ if (m/^c\d{1,}$/i) {
+ push (@columns, $_);
+ $columns[@columns-1] =~s/c//ig;
+ }
+}
+
+die "No columns specified, columns are not preceded with 'c', or commas are not used to separate column numbers: $ARGV[1]\n" if @columns == 0;
+
+my $column_delimiters_href = {
+ 'T' => q{\t},
+ 'C' => ",",
+ 'D' => "-",
+ 'U' => "_",
+ 'P' => q{\|},
+ 'Dt' => q{\.},
+ 'Sp' => q{\s+}
+};
+
+$del = $column_delimiters_href->{$ARGV[2]};
+
+open (OUT, ">$ARGV[3]") or die "Cannot create $ARGV[2]:$!\n";
+open (IN, "<$ARGV[0]") or die "Cannot open $ARGV[0]:$!\n";
+
+while (my $line=<IN>) {
+ if ($line =~ /^#/) {
+ #Ignore comment lines
+ } else {
+ chop($line);
+ @in = split(/$del/, $line);
+ foreach $field (@columns) {
+ if (defined($in[$field-1])) {
+ push(@out, $in[$field-1]);
+ } else {
+ push(@out, ".");
+ }
+ }
+ print OUT join("\t",@out), "\n";
+ @out = ();
+ }
+}
+
+#while (<IN>) {
+# chop;
+# @in = split /$del/;
+# foreach $field (@columns) {
+# if (defined($in[$field-1])) {
+# push(@out, $in[$field-1]);
+# } else {
+# push(@out, ".");
+# }
+# }
+# print OUT join("\t",@out), "\n";
+# @out = ();
+#}
+close IN;
+
+close OUT;
+
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/cutWrapper.xml
--- /dev/null
+++ b/tools/filters/cutWrapper.xml
@@ -0,0 +1,202 @@
+<tool id="Cut1" name="Cut" version="1.0.1">
+ <description>columns from a table</description>
+ <command interpreter="perl">cutWrapper.pl $input "$columnList" $delimiter $out_file1</command>
+ <inputs>
+ <param name="columnList" size="10" type="text" value="c1,c2" label="Cut columns"/>
+ <param name="delimiter" type="select" label="Delimited by">
+ <option value="T">Tab</option>
+ <option value="Sp">Whitespace</option>
+ <option value="Dt">Dot</option>
+ <option value="C">Comma</option>
+ <option value="D">Dash</option>
+ <option value="U">Underscore</option>
+ <option value="P">Pipe</option>
+ </param>
+ <param format="txt" name="input" type="data" label="From"/>
+ </inputs>
+ <outputs>
+ <data format="tabular" name="out_file1" >
+ <actions>
+ <conditional name="delimiter">
+ <when value="T">
+ <conditional name="input">
+ <when datatype_isinstance="interval">
+ <action type="format" default="tabular">
+ <option type="from_param" name="columnList" column="0" offset="0"><!-- chromCol is 1-->
+
+ <filter type="insert_column" column="0" value="interval"/>
+
+ <filter type="insert_column" ref="columnList" /><!-- startCol -->
+
+ <filter type="insert_column" ref="columnList" /><!-- endCol -->
+
+ <filter type="multiple_splitter" column="1" separator=","/>
+ <filter type="column_strip" column="1"/><!-- get rid of all external whitespace -->
+ <filter type="string_function" column="1" name="lower" />
+ <filter type="param_value" column="1" value="^c\d{1,}$" compare="re_search" keep="True"/>
+ <filter type="column_strip" column="1" strip="c"/><!-- get rid of c's -->
+ <filter type="boolean" column="1" cast="int" />
+
+ <filter type="multiple_splitter" column="2" separator=","/>
+ <filter type="column_strip" column="2"/><!-- get rid of all external whitespace -->
+ <filter type="string_function" column="2" name="lower" />
+ <filter type="param_value" column="2" value="^c\d{1,}$" compare="re_search" keep="True"/>
+ <filter type="column_strip" column="2" strip="c"/><!-- get rid of c's -->
+ <filter type="boolean" column="2" cast="int" />
+
+ <filter type="multiple_splitter" column="3" separator=","/>
+ <filter type="column_strip" column="3"/><!-- get rid of all external whitespace -->
+ <filter type="string_function" column="3" name="lower" />
+ <filter type="param_value" column="3" value="^c\d{1,}$" compare="re_search" keep="True"/>
+ <filter type="column_strip" column="3" strip="c"/><!-- get rid of c's -->
+ <filter type="boolean" column="3" cast="int" />
+
+ <filter type="metadata_value" ref="input" name="chromCol" column="1" />
+ <filter type="metadata_value" ref="input" name="startCol" column="2" />
+ <filter type="metadata_value" ref="input" name="endCol" column="3" />
+
+ </option>
+ </action>
+
+ <conditional name="out_file1">
+ <when datatype_isinstance="interval">
+ <action type="metadata" name="chromCol">
+ <option type="from_param" name="columnList" column="0" offset="0"><!-- chromCol is 0-->
+ <filter type="multiple_splitter" column="0" separator=","/>
+ <filter type="column_strip" column="0"/><!-- get rid of all external whitespace -->
+ <filter type="string_function" column="0" name="lower" />
+ <filter type="param_value" column="0" value="^c\d{1,}$" compare="re_search" keep="True"/>
+ <filter type="column_strip" column="0" strip="c"/><!-- get rid of c's -->
+ <filter type="insert_column" value="1" iterate="True" column="0"/>
+ <filter type="boolean" column="1" cast="int" />
+ <filter type="metadata_value" ref="input" name="chromCol" column="1" />
+ </option>
+ </action>
+
+ <action type="metadata" name="startCol">
+ <option type="from_param" name="columnList" column="0" offset="0"><!-- startCol is 0-->
+ <filter type="multiple_splitter" column="0" separator=","/>
+ <filter type="column_strip" column="0"/><!-- get rid of all external whitespace -->
+ <filter type="string_function" column="0" name="lower" />
+ <filter type="param_value" column="0" value="^c\d{1,}$" compare="re_search" keep="True"/>
+ <filter type="column_strip" column="0" strip="c"/><!-- get rid of c's -->
+ <filter type="insert_column" value="1" iterate="True" column="0"/>
+ <filter type="boolean" column="1" cast="int" />
+ <filter type="metadata_value" ref="input" name="startCol" column="1" />
+ </option>
+ </action>
+
+ <action type="metadata" name="endCol">
+ <option type="from_param" name="columnList" column="0" offset="0"><!-- endCol is 0-->
+ <filter type="multiple_splitter" column="0" separator=","/>
+ <filter type="column_strip" column="0"/><!-- get rid of all external whitespace -->
+ <filter type="string_function" column="0" name="lower" />
+ <filter type="param_value" column="0" value="^c\d{1,}$" compare="re_search" keep="True"/>
+ <filter type="column_strip" column="0" strip="c"/><!-- get rid of c's -->
+ <filter type="insert_column" value="1" iterate="True" column="0"/>
+ <filter type="boolean" column="1" cast="int" />
+ <filter type="metadata_value" ref="input" name="endCol" column="1" />
+ </option>
+ </action>
+
+ <action type="metadata" name="nameCol" default="0">
+ <option type="from_param" name="columnList" column="0" offset="0"><!-- nameCol is 0-->
+ <filter type="multiple_splitter" column="0" separator=","/>
+ <filter type="column_strip" column="0"/><!-- get rid of all external whitespace -->
+ <filter type="string_function" column="0" name="lower" />
+ <filter type="param_value" column="0" value="^c\d{1,}$" compare="re_search" keep="True"/>
+ <filter type="column_strip" column="0" strip="c"/><!-- get rid of c's -->
+ <filter type="insert_column" value="1" iterate="True" column="0"/>
+ <filter type="boolean" column="1" cast="int" />
+ <filter type="metadata_value" ref="input" name="nameCol" column="1" />
+ </option>
+ </action>
+
+ <action type="metadata" name="strandCol" default="0">
+ <option type="from_param" name="columnList" column="0" offset="0"><!-- strandCol is 0-->
+ <filter type="multiple_splitter" column="0" separator=","/>
+ <filter type="column_strip" column="0"/><!-- get rid of all external whitespace -->
+ <filter type="string_function" column="0" name="lower" />
+ <filter type="param_value" column="0" value="^c\d{1,}$" compare="re_search" keep="True"/>
+ <filter type="column_strip" column="0" strip="c"/><!-- get rid of c's -->
+ <filter type="insert_column" value="1" iterate="True" column="0"/>
+ <filter type="boolean" column="1" cast="int" />
+ <filter type="metadata_value" ref="input" name="strandCol" column="1" />
+ </option>
+ </action>
+ </when>
+ </conditional>
+
+ </when>
+ </conditional>
+ </when>
+ </conditional>
+ </actions>
+ </data>
+ </outputs>
+ <tests>
+ <test>
+ <param name="columnList" value="c1,c4,c2,c3"/>
+ <param name="delimiter" value="T"/>
+ <param name="input" value="1.bed"/>
+ <output name="out_file1" file="eq-cut.dat"/>
+ </test>
+ </tests>
+ <help>
+
+.. class:: warningmark
+
+**WARNING: This tool breaks column assignments.** To re-establish column assignments run the tools and click on the pencil icon in the latest history item.
+
+.. class:: infomark
+
+The output of this tool is always in tabular format (e.g., if your original delimiters are commas, they will be replaced with tabs). For example:
+
+ Cutting columns 1 and 3 from::
+
+ apple,is,good
+ windows,is,bad
+
+ will give::
+
+ apple good
+ windows bad
+
+-----
+
+**What it does**
+
+This tool selects (cuts out) specified columns from the dataset.
+
+- Columns are specified as **c1**, **c2**, and so on. Column count begins with **1**
+- Columns can be specified in any order (e.g., **c2,c1,c6**)
+- If you specify more columns than actually present - empty spaces will be filled with dots
+
+-----
+
+**Example**
+
+Input dataset (six columns: c1, c2, c3, c4, c5, and c6)::
+
+ chr1 10 1000 gene1 0 +
+ chr2 100 1500 gene2 0 +
+
+**cut** on columns "**c1,c4,c6**" will return::
+
+ chr1 gene1 +
+ chr2 gene2 +
+
+**cut** on columns "**c6,c5,c4,c1**" will return::
+
+ + 0 gene1 chr1
+ + 0 gene2 chr2
+
+
+**cut** on columns "**c8,c7,c4**" will return::
+
+ . . gene1
+ . . gene2
+
+
+</help>
+</tool>
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/fixedValueColumn.pl
--- /dev/null
+++ b/tools/filters/fixedValueColumn.pl
@@ -0,0 +1,34 @@
+#! /usr/bin/perl -w
+
+use strict;
+use warnings;
+
+# fixedValueColumn.pl $input $out_file1 "expression" "iterate [yes|no]"
+
+my ($input, $out_file1, $expression, $iterate) = @ARGV;
+my $i = 0;
+my $numeric = 0;
+
+die "Check arguments\n" unless @ARGV == 4;
+
+open (DATA, "<$input") or die "Cannot open $input:$!\n";
+open (OUT, ">$out_file1") or die "Cannot create $out_file1:$!\n";
+
+if ($expression =~ m/^\d+$/) {
+ $numeric = 1;
+ $i = $expression;
+}
+
+while (<DATA>) {
+ chop;
+ if ($iterate eq "no") {
+ print OUT "$_\t$expression\n";
+ } else {
+ print OUT "$_\t$i\n" if $numeric == 1;
+ print OUT "$_\t$expression-$i\n" if $numeric == 0;
+ ++$i;
+ }
+}
+
+close DATA;
+close OUT;
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/fixedValueColumn.xml
--- /dev/null
+++ b/tools/filters/fixedValueColumn.xml
@@ -0,0 +1,61 @@
+<tool id="addValue" name="Add column">
+ <description>to an existing dataset</description>
+ <command interpreter="perl">fixedValueColumn.pl $input $out_file1 "$exp" $iterate</command>
+ <inputs>
+ <param name="exp" size="20" type="text" value="1" label="Add this value"/>
+ <param format="tabular" name="input" type="data" label="to Dataset" help="Dataset missing? See TIP below" />
+ <param name="iterate" type="select" label="Iterate?">
+ <option value="no">NO</option>
+ <option value="yes">YES</option>
+ </param>
+ </inputs>
+ <outputs>
+ <data format="input" name="out_file1" metadata_source="input"/>
+ </outputs>
+ <tests>
+ <test>
+ <param name="exp" value="1"/>
+ <param name="input" value="1.bed"/>
+ <param name="iterate" value="no"/>
+ <output name="out_file1" file="eq-addvalue.dat"/>
+ </test>
+ </tests>
+ <help>
+
+.. class:: infomark
+
+**TIP:** If your data is not TAB delimited, use *Text Manipulation->Convert*
+
+-----
+
+**What it does**
+
+You can enter any value and it will be added as a new column to your dataset
+
+-----
+
+**Example**
+
+If you original data looks like this::
+
+ chr1 10 100 geneA
+ chr2 200 300 geneB
+ chr2 400 500 geneC
+
+Typing **+** in the text box will generate::
+
+ chr1 10 100 geneA +
+ chr2 200 300 geneB +
+ chr2 400 500 geneC +
+
+
+You can also add line numbers by selecting **Iterate: YES**. In this case if you enter **1** in the text box you will get::
+
+ chr1 10 100 geneA 1
+ chr2 200 300 geneB 2
+ chr2 400 500 geneC 3
+
+
+
+</help>
+</tool>
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/headWrapper.pl
--- /dev/null
+++ b/tools/filters/headWrapper.pl
@@ -0,0 +1,19 @@
+#! /usr/bin/perl -w
+
+use strict;
+use warnings;
+
+# a wrapper for head for use in galaxy
+# headWrapper.pl [filename] [# lines to show] [output]
+
+die "Check arguments" unless @ARGV == 3;
+die "Line number must be an integer\n" unless $ARGV[1]=~ m/^\d+$/;
+
+open (OUT, ">$ARGV[2]") or die "Cannot create $ARGV[2]:$!\n";
+open (HEAD, "head -n $ARGV[1] $ARGV[0]|") or die "Cannot run head:$!\n";
+while (<HEAD>) {
+ print OUT;
+}
+close OUT;
+close HEAD;
+
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/headWrapper.xml
--- /dev/null
+++ b/tools/filters/headWrapper.xml
@@ -0,0 +1,42 @@
+<tool id="Show beginning1" name="Select first">
+ <description>lines from a dataset</description>
+ <command interpreter="perl">headWrapper.pl $input $lineNum $out_file1</command>
+ <inputs>
+ <param name="lineNum" size="5" type="integer" value="10" label="Select first" help="lines"/>
+ <param format="txt" name="input" type="data" label="from"/>
+ </inputs>
+ <outputs>
+ <data format="input" name="out_file1" metadata_source="input"/>
+ </outputs>
+ <tests>
+ <test>
+ <param name="lineNum" value="10"/>
+ <param name="input" value="1.bed"/>
+ <output name="out_file1" file="eq-showbeginning.dat"/>
+ </test>
+ </tests>
+ <help>
+
+**What it does**
+
+This tool outputs specified number of lines from the **beginning** of a dataset
+
+-----
+
+**Example**
+
+Selecting 2 lines from this::
+
+ chr7 56632 56652 D17003_CTCF_R6 310 +
+ chr7 56736 56756 D17003_CTCF_R7 354 +
+ chr7 56761 56781 D17003_CTCF_R4 220 +
+ chr7 56772 56792 D17003_CTCF_R7 372 +
+ chr7 56775 56795 D17003_CTCF_R4 207 +
+
+will produce::
+
+ chr7 56632 56652 D17003_CTCF_R6 310 +
+ chr7 56736 56756 D17003_CTCF_R7 354 +
+
+ </help>
+</tool>
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/mergeCols.py
--- /dev/null
+++ b/tools/filters/mergeCols.py
@@ -0,0 +1,37 @@
+import sys, re
+
+def stop_err( msg ):
+ sys.stderr.write( msg )
+ sys.exit()
+
+def __main__():
+ try:
+ infile = open ( sys.argv[1], 'r')
+ outfile = open ( sys.argv[2], 'w')
+ except:
+ stop_err( 'Cannot open or create a file\n' )
+
+ if len( sys.argv ) < 4:
+ stop_err( 'No columns to merge' )
+ else:
+ cols = sys.argv[3:]
+
+ skipped_lines = 0
+
+ for line in infile:
+ line = line.rstrip( '\r\n' )
+ if line and not line.startswith( '#' ):
+ fields = line.split( '\t' )
+ line += '\t'
+ for col in cols:
+ try:
+ line += fields[ int( col ) -1 ]
+ except:
+ skipped_lines += 1
+
+ print >>outfile, line
+
+ if skipped_lines > 0:
+ print 'Skipped %d invalid lines' % skipped_lines
+
+if __name__ == "__main__" : __main__()
\ No newline at end of file
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/mergeCols.xml
--- /dev/null
+++ b/tools/filters/mergeCols.xml
@@ -0,0 +1,63 @@
+<tool id="mergeCols1" name="Merge Columns" version="1.0.1">
+ <description>together</description>
+ <command interpreter="python">
+ mergeCols.py
+ $input1
+ $out_file1
+ $col1
+ $col2
+ #for $col in $columns
+ ${col.datacol}
+ #end for
+ </command>
+ <inputs>
+ <param format="tabular" name="input1" type="data" label="Select data" help="Dataset missing? See TIP below."/>
+ <param name="col1" label="Merge column" type="data_column" data_ref="input1" />
+ <param name="col2" label="with column" type="data_column" data_ref="input1" help="Need to add more columns? Use controls below."/>
+ <repeat name="columns" title="Columns">
+ <param name="datacol" label="Add column" type="data_column" data_ref="input1" />
+ </repeat>
+ </inputs>
+ <outputs>
+ <data format="tabular" name="out_file1" />
+ </outputs>
+ <tests>
+ <test>
+ <param name="input1" value="1.bed"/>
+ <param name="col1" value="4" />
+ <param name="col2" value="1" />
+ <param name="datacol" value="6" />
+ <output name="out_file1" file="mergeCols.dat"/>
+ </test>
+ </tests>
+<help>
+
+.. class:: infomark
+
+**TIP:** If your data is not TAB delimited, use *Text Manipulation->Convert*
+
+-----
+
+**What it does**
+
+This tool merges columns together. Any number of valid columns can be merged in any order.
+
+-----
+
+**Example**
+
+Input dataset (five columns: c1, c2, c3, c4, and c5)::
+
+ 1 10 1000 gene1 chr
+ 2 100 1500 gene2 chr
+
+merging columns "**c5,c1**" will return::
+
+ 1 10 1000 gene1 chr chr1
+ 2 100 1500 gene2 chr chr2
+
+.. class:: warningmark
+
+Note that all original columns are preserved and the result of merge is added as the rightmost column.
+ </help>
+</tool>
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/remove_beginning.pl
--- /dev/null
+++ b/tools/filters/remove_beginning.pl
@@ -0,0 +1,33 @@
+#! /usr/bin/perl -w
+
+use strict;
+use warnings;
+
+# Removes the specified number of lines from the beginning of the file.
+# remove_beginning.pl [input] [num_lines] [output]
+
+die "Check arguments" unless @ARGV == 3;
+
+my $inputfile = $ARGV[0];
+my $num_lines = $ARGV[1];
+my $outputfile = $ARGV[2];
+
+my $curCount=0;
+
+my $fhIn;
+open ($fhIn, "< $inputfile") or die "Cannot open source file";
+
+my $fhOut;
+open ($fhOut, "> $outputfile");
+
+while (<$fhIn>)
+{
+ $curCount++;
+ if ($curCount<=$num_lines)
+ {
+ next;
+ }
+ print $fhOut $_;
+}
+close ($fhIn) or die "Cannot close source file";
+close ($fhOut) or die "Cannot close output file";
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/remove_beginning.xml
--- /dev/null
+++ b/tools/filters/remove_beginning.xml
@@ -0,0 +1,42 @@
+<tool id="Remove beginning1" name="Remove beginning">
+ <description>of a file</description>
+ <command interpreter="perl">remove_beginning.pl $input $num_lines $out_file1</command>
+ <inputs>
+ <param name="num_lines" size="5" type="integer" value="1" label="Remove first" help="lines"/>
+ <param format="txt" name="input" type="data" label="from"/>
+ </inputs>
+ <outputs>
+ <data format="input" name="out_file1" metadata_source="input"/>
+ </outputs>
+ <tests>
+ <test>
+ <param name="num_lines" value="5"/>
+ <param name="input" value="1.bed"/>
+ <output name="out_file1" file="eq-removebeginning.dat"/>
+ </test>
+ </tests>
+ <help>
+
+**What it does**
+
+This tool removes a specified number of lines from the beginning of a dataset.
+
+-----
+
+**Example**
+
+Input File::
+
+ chr7 56632 56652 D17003_CTCF_R6 310 +
+ chr7 56736 56756 D17003_CTCF_R7 354 +
+ chr7 56761 56781 D17003_CTCF_R4 220 +
+ chr7 56772 56792 D17003_CTCF_R7 372 +
+ chr7 56775 56795 D17003_CTCF_R4 207 +
+
+After removing the first 3 lines the dataset will look like this::
+
+ chr7 56772 56792 D17003_CTCF_R7 372 +
+ chr7 56775 56795 D17003_CTCF_R4 207 +
+
+</help>
+</tool>
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/tailWrapper.pl
--- /dev/null
+++ b/tools/filters/tailWrapper.pl
@@ -0,0 +1,19 @@
+#! /usr/bin/perl -w
+
+use strict;
+use warnings;
+
+# a wrapper for tail for use in galaxy
+# lessWrapper.pl [filename] [# lines to show] [output]
+
+die "Check arguments" unless @ARGV == 3;
+die "Line number should be an integer\n" unless $ARGV[1]=~ m/^\d+$/;
+
+open (OUT, ">$ARGV[2]") or die "Cannot create $ARGV[2]:$!\n";
+open (TAIL, "tail -n $ARGV[1] $ARGV[0]|") or die "Cannot run tail:$!\n";
+while (<TAIL>) {
+ print OUT;
+}
+close OUT;
+close TAIL;
+
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/tailWrapper.xml
--- /dev/null
+++ b/tools/filters/tailWrapper.xml
@@ -0,0 +1,42 @@
+<tool id="Show tail1" name="Select last">
+ <description>lines from a dataset</description>
+ <command interpreter="perl">tailWrapper.pl $input $lineNum $out_file1</command>
+ <inputs>
+ <param name="lineNum" size="5" type="integer" value="10" label="Select last" help="lines"/>
+ <param format="txt" name="input" type="data" label="from"/>
+ </inputs>
+ <outputs>
+ <data format="input" name="out_file1" metadata_source="input"/>
+ </outputs>
+ <tests>
+ <test>
+ <param name="lineNum" value="10"/>
+ <param name="input" value="1.bed"/>
+ <output name="out_file1" file="eq-showtail.dat"/>
+ </test>
+ </tests>
+ <help>
+
+**What it does**
+
+This tool outputs specified number of lines from the **end** of a dataset
+
+-----
+
+**Example**
+
+- Input File::
+
+ chr7 57134 57154 D17003_CTCF_R7 356 -
+ chr7 57247 57267 D17003_CTCF_R4 207 +
+ chr7 57314 57334 D17003_CTCF_R5 269 +
+ chr7 57341 57361 D17003_CTCF_R7 375 +
+ chr7 57457 57477 D17003_CTCF_R3 188 +
+
+- Show last two lines of above file. The result is::
+
+ chr7 57341 57361 D17003_CTCF_R7 375 +
+ chr7 57457 57477 D17003_CTCF_R3 188 +
+
+ </help>
+</tool>
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/trimmer.py
--- /dev/null
+++ b/tools/filters/trimmer.py
@@ -0,0 +1,106 @@
+#!/usr/bin/env python
+
+import sys
+import optparse
+
+def stop_err( msg ):
+ sys.stderr.write( msg )
+ sys.exit()
+
+def main():
+ usage = """%prog [options]
+
+options (listed below) default to 'None' if omitted
+ """
+ parser = optparse.OptionParser(usage=usage)
+
+ parser.add_option(
+ '-a','--ascii',
+ dest='ascii',
+ action='store_true',
+ default = False,
+ help='Use ascii codes to defined ignored beginnings instead of raw characters')
+
+ parser.add_option(
+ '-q','--fastq',
+ dest='fastq',
+ action='store_true',
+ default = False,
+ help='The input data in fastq format. It selected the script skips every even line since they contain sequence ids')
+
+ parser.add_option(
+ '-i','--ignore',
+ dest='ignore',
+ help='A comma separated list on ignored beginnings (e.g., ">,@"), or its ascii codes (e.g., "60,42") if option -a is enabled')
+
+ parser.add_option(
+ '-s','--start',
+ dest='start',
+ default = '0',
+ help='Trim from beginning to here (1-based)')
+
+ parser.add_option(
+ '-e','--end',
+ dest='end',
+ default = '0',
+ help='Trim from here to the ned (1-based)')
+
+ parser.add_option(
+ '-f','--file',
+ dest='input_txt',
+ default = False,
+ help='Name of file to be chopped. STDIN is default')
+
+ parser.add_option(
+ '-c','--column',
+ dest='col',
+ default = '0',
+ help='Column to chop. If 0 = chop the whole line')
+
+
+ options, args = parser.parse_args()
+ invalid_starts = []
+
+ if options.input_txt:
+ infile = open ( options.input_txt, 'r')
+ else:
+ infile = sys.stdin
+
+ if options.ignore and options.ignore != "None":
+ invalid_starts = options.ignore.split(',')
+
+ if options.ascii and options.ignore and options.ignore != "None":
+ for i, item in enumerate( invalid_starts ):
+ invalid_starts[i] = chr( int( item ) )
+
+ col = int( options.col )
+
+ for i, line in enumerate( infile ):
+ line = line.rstrip( '\r\n' )
+ if line:
+
+ if options.fastq and i % 2 == 0:
+ print line
+ continue
+
+
+ if line[0] not in invalid_starts:
+ if col == 0:
+ if int( options.end ) > 0:
+ line = line[ int( options.start )-1 : int( options.end ) ]
+ else:
+ line = line[ int( options.start )-1 : ]
+ else:
+ fields = line.split( '\t' )
+ if col-1 > len( fields ):
+ stop_err('Column %d does not exist. Check input parameters\n' % col)
+
+ if int( options.end ) > 0:
+ fields[col - 1] = fields[col - 1][ int( options.start )-1 : int( options.end ) ]
+ else:
+ fields[col - 1] = fields[col - 1][ int( options.start )-1 : ]
+ line = '\t'.join(fields)
+ print line
+
+if __name__ == "__main__": main()
+
diff -r 2f45da781f926f667dd90ad23d23fd123716a535 -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 tools/filters/trimmer.xml
--- /dev/null
+++ b/tools/filters/trimmer.xml
@@ -0,0 +1,120 @@
+<tool id="trimmer" name="Trim" version="0.0.1">
+ <description>leading or trailing characters</description>
+ <command interpreter="python">
+ trimmer.py -a -f $input1 -c $col -s $start -e $end -i $ignore $fastq > $out_file1
+ </command>
+ <inputs>
+ <param format="tabular,txt" name="input1" type="data" label="this dataset"/>
+ <param name="col" type="integer" value="0" label="Trim this column only" help="0 = process entire line" />
+ <param name="start" type="integer" size="10" value="1" label="Trim from the beginning to this position" help="1 = do not trim the beginning"/>
+ <param name="end" type="integer" size="10" value="0" label="Remove everything from this position to the end" help="0 = do not trim the end"/>
+ <param name="fastq" type="select" label="Is input dataset in fastq format?" help="If set to YES, the tool will not trim evenly numbered lines (0, 2, 4, etc...)">
+ <option selected="true" value="">No</option>
+ <option value="-q">Yes</option>
+ </param>
+ <param name="ignore" type="select" display="checkboxes" multiple="True" label="Ignore lines beginning with these characters" help="lines beginning with these are not trimmed">
+ <option value="62">></option>
+ <option value="64">@</option>
+ <option value="43">+</option>
+ <option value="60"><</option>
+ <option value="42">*</option>
+ <option value="45">-</option>
+ <option value="61">=</option>
+ <option value="124">|</option>
+ <option value="63">?</option>
+ <option value="36">$</option>
+ <option value="46">.</option>
+ <option value="58">:</option>
+ <option value="38">&</option>
+ <option value="37">%</option>
+ <option value="94">^</option>
+ <option value="35">#</option>
+ </param>
+ </inputs>
+ <outputs>
+ <data name="out_file1" format="input" metadata_source="input1"/>
+ </outputs>
+ <tests>
+ <test>
+ <param name="input1" value="trimmer_tab_delimited.dat"/>
+ <param name="col" value="0"/>
+ <param name="start" value="1"/>
+ <param name="end" value="13"/>
+ <param name="ignore" value="62"/>
+ <param name="fastq" value="No"/>
+ <output name="out_file1" file="trimmer_a_f_c0_s1_e13_i62.dat"/>
+ </test>
+ <test>
+ <param name="input1" value="trimmer_tab_delimited.dat"/>
+ <param name="col" value="2"/>
+ <param name="start" value="1"/>
+ <param name="end" value="2"/>
+ <param name="ignore" value="62"/>
+ <param name="fastq" value="No"/>
+ <output name="out_file1" file="trimmer_a_f_c2_s1_e2_i62.dat"/>
+ </test>
+
+ </tests>
+
+ <help>
+
+
+**What it does**
+
+Trims specified number of characters from a dataset or its field (if dataset is tab-delimited).
+
+-----
+
+**Example 1**
+
+Trimming this dataset::
+
+ 1234567890
+ abcdefghijk
+
+by setting **Trim from the beginning to this position** to *2* and **Remove everything from this position to the end** to *6* will produce::
+
+ 23456
+ bcdef
+
+-----
+
+**Example 2**
+
+Trimming column 2 of this dataset::
+
+ abcde 12345 fghij 67890
+ fghij 67890 abcde 12345
+
+by setting **Trim content of this column only** to *2*, **Trim from the beginning to this position** to *2*, and **Remove everything from this position to the end** to *4* will produce::
+
+ abcde 234 fghij 67890
+ fghij 789 abcde 12345
+
+-----
+
+**Trimming FASTQ datasets**
+
+This tool can be used to trim sequences and quality strings in fastq datasets. This is done by selected *Yes* from the **Is input dataset in fastq format?** dropdown. If set to *Yes*, the tool will skip all even numbered lines (see warning below). For example, trimming last 5 bases of this dataset::
+
+ @081017-and-081020:1:1:1715:1759
+ GGACTCAGATAGTAATCCACGCTCCTTTAAAATATC
+ +
+ II#IIIIIII$5+.(9IIIIIII$%*$G$A31I&&B
+
+cab done by setting **Remove everything from this position to the end** to 31::
+
+ @081017-and-081020:1:1:1715:1759
+ GGACTCAGATAGTAATCCACGCTCCTTTAAA
+ +
+ II#IIIIIII$5+.(9IIIIIII$%*$G$A3
+
+**Note** that headers are skipped.
+
+.. class:: warningmark
+
+**WARNING:** This tool will only work on properly formatted fastq datasets where (1) each read and quality string occupy one line and (2) '@' (read header) and "+" (quality header) lines are evenly numbered like in the above example.
+
+
+ </help>
+</tool>
https://bitbucket.org/galaxy/galaxy-central/changeset/facdd387b85e/
changeset: facdd387b85e
user: inithello
date: 2012-12-07 22:39:17
summary: Updated tool_conf.xml.main with reverted migration.
affected #: 1 file
diff -r 659392eae2a8946ea6d2f2c5534d5c51c1dc28f3 -r facdd387b85e814df7428ca8cbb71828d0ec48a2 tool_conf.xml.main
--- a/tool_conf.xml.main
+++ b/tool_conf.xml.main
@@ -33,11 +33,21 @@
<tool file="extract/liftOver_wrapper.xml" /></section><section name="Text Manipulation" id="textutil">
+ <tool file="filters/fixedValueColumn.xml" /><tool file="stats/column_maker.xml" /><tool file="filters/catWrapper.xml" />
+ <tool file="filters/condense_characters.xml" />
+ <tool file="filters/convert_characters.xml" />
+ <tool file="filters/mergeCols.xml" /><tool file="filters/CreateInterval.xml" />
+ <tool file="filters/cutWrapper.xml" />
+ <tool file="filters/changeCase.xml" /><tool file="filters/pasteWrapper.xml" />
+ <tool file="filters/remove_beginning.xml" /><tool file="filters/randomlines.xml" />
+ <tool file="filters/headWrapper.xml" />
+ <tool file="filters/tailWrapper.xml" />
+ <tool file="filters/trimmer.xml" /><tool file="filters/wc_gnu.xml" /><tool file="filters/secure_hash_message_digest.xml" /></section>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/c68762fcb5a5/
changeset: c68762fcb5a5
user: inithello
date: 2012-12-07 22:08:40
summary: Migrate tools to tool shed: addValue, ChangeCase, Condense characters1, Convert characters1, Cut1, mergeCols1, Remove beginning1, Show beginning1, Show tail1, trimmer
affected #: 35 files
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 lib/galaxy/tool_shed/migrate/versions/0008_tools.py
--- /dev/null
+++ b/lib/galaxy/tool_shed/migrate/versions/0008_tools.py
@@ -0,0 +1,21 @@
+"""
+The following tools have been eliminated from the distribution:
+Add column to an existing dataset, Change Case of selected columns,
+Condense consecutive characters, Convert delimiters to TAB,
+Cut columns from a table, Merge Columns together, Remove beginning of a file,
+Select first lines from a dataset, Select last lines from a dataset,
+and Trim leading or trailing characters. The tools are now available in the
+repositories named add_value, change_case, condense_characters,
+convert_characters, cut_columns, merge_cols, remove_beginning,
+show_beginning, show_tail, and trimmer from the main Galaxy tool shed at
+http://toolshed.g2.bx.psu.edu, and will be installed into your
+local Galaxy instance at the location discussed above by running
+the following command.
+"""
+
+import sys
+
+def upgrade():
+ print __doc__
+def downgrade():
+ pass
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 scripts/migrate_tools/0008_tools.sh
--- /dev/null
+++ b/scripts/migrate_tools/0008_tools.sh
@@ -0,0 +1,4 @@
+#!/bin/sh
+
+cd `dirname $0`/../..
+python ./scripts/migrate_tools/migrate_tools.py 0008_tools.xml $@
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 scripts/migrate_tools/0008_tools.xml
--- /dev/null
+++ b/scripts/migrate_tools/0008_tools.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0"?>
+<toolshed name="toolshed.g2.bx.psu.edu">
+ <repository name="add_value" description="Add a value as a new column." changeset_revision="181dd378275c">
+ <tool id="addValue" version="1.0.0" file="fixedValueColumn.xml" />
+ </repository>
+ <repository name="change_case" description="Change the case of a column." changeset_revision="e6f966602870">
+ <tool id="ChangeCase" version="1.0.0" file="changeCase.xml" />
+ </repository>
+ <repository name="condense_characters" description="Condense repeated characters." changeset_revision="2c08781560de">
+ <tool id="Condense characters1" version="1.0.0" file="condense_characters.xml" />
+ </repository>
+ <repository name="convert_characters" description="Convert delimiters to TAB." changeset_revision="64d46676a13e">
+ <tool id="Convert characters1" version="1.0.0" file="convert_characters.xml" />
+ </repository>
+ <repository name="cut_columns" description="Remove or rearrange columns." changeset_revision="34c29e183ef7">
+ <tool id="Cut1" version="1.0.1" file="cutWrapper.xml" />
+ </repository>
+ <repository name="merge_cols" description="Merge columns together." changeset_revision="28ca7552e884">
+ <tool id="mergeCols1" version="1.0.1" file="mergeCols.xml" />
+ </repository>
+ <repository name="remove_beginning" description="Remove lines from the beginning of a file." changeset_revision="d9b82504a321">
+ <tool id="Remove beginning1" version="1.0.0" file="remove_beginning.xml" />
+ </repository>
+ <repository name="show_beginning" description="Select lines from the beginning of a file." changeset_revision="ecca14446e6a">
+ <tool id="Show beginning1" version="1.0.0" file="headWrapper.xml" />
+ </repository>
+ <repository name="show_tail" description="Select lines from the end of a file." changeset_revision="8bb4d908a523">
+ <tool id="Show tail1" version="1.0.0" file="tailWrapper.xml" />
+ </repository>
+ <repository name="trimmer" description="Trim trailing characters from each line or column." changeset_revision="f862a6e4d096">
+ <tool id="trimmer" version="0.0.1" file="trimmer.xml" />
+ </repository>
+</toolshed>
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 test-data/a.txt
--- a/test-data/a.txt
+++ /dev/null
@@ -1,15 +0,0 @@
- CHR SNP BP A1 TEST NMISS BETA STAT P
- 1 rs1181876 3671541 T DOMDEV 958 -1.415 -3.326 0.0009161
- 1 rs10492923 5092886 C ADD 1007 5.105 4.368 1.382e-05
- 1 rs10492923 5092886 C DOMDEV 1007 -5.612 -4.249 2.35e-05
- 1 rs10492923 5092886 C GENO_2DF 1007 NA 19.9 4.775e-05
- 1 rs1801133 11778965 T ADD 1022 1.23 3.97 7.682e-05
- 1 rs1801133 11778965 T GENO_2DF 1022 NA 16.07 0.0003233
- 1 rs1361912 12663121 A ADD 1021 12.69 4.093 4.596e-05
- 1 rs1361912 12663121 A DOMDEV 1021 -12.37 -3.945 8.533e-05
- 1 rs1361912 12663121 A GENO_2DF 1021 NA 17.05 0.0001982
- 1 rs1009806 19373138 G ADD 1021 -1.334 -3.756 0.0001826
- 1 rs1009806 19373138 G GENO_2DF 1021 NA 19.36 6.244e-05
- 1 rs873654 29550948 A DOMDEV 1012 1.526 3.6 0.0003339
- 1 rs10489527 36800027 C ADD 1016 12.67 4.114 4.211e-05
- 1 rs10489527 36800027 C DOMDEV 1016 -13.05 -4.02 6.249e-05
\ No newline at end of file
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 test-data/changeCase_out1.tabular
--- a/test-data/changeCase_out1.tabular
+++ /dev/null
@@ -1,10 +0,0 @@
-CHR1 4225 19670
-CHR10 6 8
-CHR1 24417 24420
-CHR6_HLA_HAP2 0 150
-CHR2 1 5
-CHR10 2 10
-CHR1 30 55
-CHRY 1 20
-CHR1 1225979 42287290
-CHR10 7 8
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 test-data/changeCase_out2.tabular
--- a/test-data/changeCase_out2.tabular
+++ /dev/null
@@ -1,65 +0,0 @@
-CHR1 147962192 147962580 CCDS989.1_cds_0_0_chr1_147962193_r 0 -
-CHR1 147984545 147984630 CCDS990.1_cds_0_0_chr1_147984546_f 0 +
-CHR1 148078400 148078582 CCDS993.1_cds_0_0_chr1_148078401_r 0 -
-CHR1 148185136 148185276 CCDS996.1_cds_0_0_chr1_148185137_f 0 +
-CHR10 55251623 55253124 CCDS7248.1_cds_0_0_chr10_55251624_r 0 -
-CHR11 116124407 116124501 CCDS8374.1_cds_0_0_chr11_116124408_r 0 -
-CHR11 116206508 116206563 CCDS8377.1_cds_0_0_chr11_116206509_f 0 +
-CHR11 116211733 116212337 CCDS8378.1_cds_0_0_chr11_116211734_r 0 -
-CHR11 1812377 1812407 CCDS7726.1_cds_0_0_chr11_1812378_f 0 +
-CHR12 38440094 38440321 CCDS8736.1_cds_0_0_chr12_38440095_r 0 -
-CHR13 112381694 112381953 CCDS9526.1_cds_0_0_chr13_112381695_f 0 +
-CHR14 98710240 98712285 CCDS9949.1_cds_0_0_chr14_98710241_r 0 -
-CHR15 41486872 41487060 CCDS10096.1_cds_0_0_chr15_41486873_r 0 -
-CHR15 41673708 41673857 CCDS10097.1_cds_0_0_chr15_41673709_f 0 +
-CHR15 41679161 41679250 CCDS10098.1_cds_0_0_chr15_41679162_r 0 -
-CHR15 41826029 41826196 CCDS10101.1_cds_0_0_chr15_41826030_f 0 +
-CHR16 142908 143003 CCDS10397.1_cds_0_0_chr16_142909_f 0 +
-CHR16 179963 180135 CCDS10401.1_cds_0_0_chr16_179964_r 0 -
-CHR16 244413 244681 CCDS10402.1_cds_0_0_chr16_244414_f 0 +
-CHR16 259268 259383 CCDS10403.1_cds_0_0_chr16_259269_r 0 -
-CHR18 23786114 23786321 CCDS11891.1_cds_0_0_chr18_23786115_r 0 -
-CHR18 59406881 59407046 CCDS11985.1_cds_0_0_chr18_59406882_f 0 +
-CHR18 59455932 59456337 CCDS11986.1_cds_0_0_chr18_59455933_r 0 -
-CHR18 59600586 59600754 CCDS11988.1_cds_0_0_chr18_59600587_f 0 +
-CHR19 59068595 59069564 CCDS12866.1_cds_0_0_chr19_59068596_f 0 +
-CHR19 59236026 59236146 CCDS12872.1_cds_0_0_chr19_59236027_r 0 -
-CHR19 59297998 59298008 CCDS12877.1_cds_0_0_chr19_59297999_f 0 +
-CHR19 59302168 59302288 CCDS12878.1_cds_0_0_chr19_59302169_r 0 -
-CHR2 118288583 118288668 CCDS2120.1_cds_0_0_chr2_118288584_f 0 +
-CHR2 118394148 118394202 CCDS2121.1_cds_0_0_chr2_118394149_r 0 -
-CHR2 220190202 220190242 CCDS2441.1_cds_0_0_chr2_220190203_f 0 +
-CHR2 220229609 220230869 CCDS2443.1_cds_0_0_chr2_220229610_r 0 -
-CHR20 33330413 33330423 CCDS13249.1_cds_0_0_chr20_33330414_r 0 -
-CHR20 33513606 33513792 CCDS13255.1_cds_0_0_chr20_33513607_f 0 +
-CHR20 33579500 33579527 CCDS13256.1_cds_0_0_chr20_33579501_r 0 -
-CHR20 33593260 33593348 CCDS13257.1_cds_0_0_chr20_33593261_f 0 +
-CHR21 32707032 32707192 CCDS13614.1_cds_0_0_chr21_32707033_f 0 +
-CHR21 32869641 32870022 CCDS13615.1_cds_0_0_chr21_32869642_r 0 -
-CHR21 33321040 33322012 CCDS13620.1_cds_0_0_chr21_33321041_f 0 +
-CHR21 33744994 33745040 CCDS13625.1_cds_0_0_chr21_33744995_r 0 -
-CHR22 30120223 30120265 CCDS13897.1_cds_0_0_chr22_30120224_f 0 +
-CHR22 30160419 30160661 CCDS13898.1_cds_0_0_chr22_30160420_r 0 -
-CHR22 30665273 30665360 CCDS13901.1_cds_0_0_chr22_30665274_f 0 +
-CHR22 30939054 30939266 CCDS13903.1_cds_0_0_chr22_30939055_r 0 -
-CHR5 131424298 131424460 CCDS4149.1_cds_0_0_chr5_131424299_f 0 +
-CHR5 131556601 131556672 CCDS4151.1_cds_0_0_chr5_131556602_r 0 -
-CHR5 131621326 131621419 CCDS4152.1_cds_0_0_chr5_131621327_f 0 +
-CHR5 131847541 131847666 CCDS4155.1_cds_0_0_chr5_131847542_r 0 -
-CHR6 108299600 108299744 CCDS5061.1_cds_0_0_chr6_108299601_r 0 -
-CHR6 108594662 108594687 CCDS5063.1_cds_0_0_chr6_108594663_f 0 +
-CHR6 108640045 108640151 CCDS5064.1_cds_0_0_chr6_108640046_r 0 -
-CHR6 108722976 108723115 CCDS5067.1_cds_0_0_chr6_108722977_f 0 +
-CHR7 113660517 113660685 CCDS5760.1_cds_0_0_chr7_113660518_f 0 +
-CHR7 116512159 116512389 CCDS5771.1_cds_0_0_chr7_116512160_r 0 -
-CHR7 116714099 116714152 CCDS5773.1_cds_0_0_chr7_116714100_f 0 +
-CHR7 116945541 116945787 CCDS5774.1_cds_0_0_chr7_116945542_r 0 -
-CHR8 118881131 118881317 CCDS6324.1_cds_0_0_chr8_118881132_r 0 -
-CHR9 128764156 128764189 CCDS6914.1_cds_0_0_chr9_128764157_f 0 +
-CHR9 128787519 128789136 CCDS6915.1_cds_0_0_chr9_128787520_r 0 -
-CHR9 128882427 128882523 CCDS6917.1_cds_0_0_chr9_128882428_f 0 +
-CHR9 128937229 128937445 CCDS6919.1_cds_0_0_chr9_128937230_r 0 -
-CHRX 122745047 122745924 CCDS14606.1_cds_0_0_chrX_122745048_f 0 +
-CHRX 152648964 152649196 CCDS14733.1_cds_0_0_chrX_152648965_r 0 -
-CHRX 152691446 152691471 CCDS14735.1_cds_0_0_chrX_152691447_f 0 +
-CHRX 152694029 152694263 CCDS14736.1_cds_0_0_chrX_152694030_r 0 -
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 test-data/eq-addvalue.dat
--- a/test-data/eq-addvalue.dat
+++ /dev/null
@@ -1,65 +0,0 @@
-chr1 147962192 147962580 CCDS989.1_cds_0_0_chr1_147962193_r 0 - 1
-chr1 147984545 147984630 CCDS990.1_cds_0_0_chr1_147984546_f 0 + 1
-chr1 148078400 148078582 CCDS993.1_cds_0_0_chr1_148078401_r 0 - 1
-chr1 148185136 148185276 CCDS996.1_cds_0_0_chr1_148185137_f 0 + 1
-chr10 55251623 55253124 CCDS7248.1_cds_0_0_chr10_55251624_r 0 - 1
-chr11 116124407 116124501 CCDS8374.1_cds_0_0_chr11_116124408_r 0 - 1
-chr11 116206508 116206563 CCDS8377.1_cds_0_0_chr11_116206509_f 0 + 1
-chr11 116211733 116212337 CCDS8378.1_cds_0_0_chr11_116211734_r 0 - 1
-chr11 1812377 1812407 CCDS7726.1_cds_0_0_chr11_1812378_f 0 + 1
-chr12 38440094 38440321 CCDS8736.1_cds_0_0_chr12_38440095_r 0 - 1
-chr13 112381694 112381953 CCDS9526.1_cds_0_0_chr13_112381695_f 0 + 1
-chr14 98710240 98712285 CCDS9949.1_cds_0_0_chr14_98710241_r 0 - 1
-chr15 41486872 41487060 CCDS10096.1_cds_0_0_chr15_41486873_r 0 - 1
-chr15 41673708 41673857 CCDS10097.1_cds_0_0_chr15_41673709_f 0 + 1
-chr15 41679161 41679250 CCDS10098.1_cds_0_0_chr15_41679162_r 0 - 1
-chr15 41826029 41826196 CCDS10101.1_cds_0_0_chr15_41826030_f 0 + 1
-chr16 142908 143003 CCDS10397.1_cds_0_0_chr16_142909_f 0 + 1
-chr16 179963 180135 CCDS10401.1_cds_0_0_chr16_179964_r 0 - 1
-chr16 244413 244681 CCDS10402.1_cds_0_0_chr16_244414_f 0 + 1
-chr16 259268 259383 CCDS10403.1_cds_0_0_chr16_259269_r 0 - 1
-chr18 23786114 23786321 CCDS11891.1_cds_0_0_chr18_23786115_r 0 - 1
-chr18 59406881 59407046 CCDS11985.1_cds_0_0_chr18_59406882_f 0 + 1
-chr18 59455932 59456337 CCDS11986.1_cds_0_0_chr18_59455933_r 0 - 1
-chr18 59600586 59600754 CCDS11988.1_cds_0_0_chr18_59600587_f 0 + 1
-chr19 59068595 59069564 CCDS12866.1_cds_0_0_chr19_59068596_f 0 + 1
-chr19 59236026 59236146 CCDS12872.1_cds_0_0_chr19_59236027_r 0 - 1
-chr19 59297998 59298008 CCDS12877.1_cds_0_0_chr19_59297999_f 0 + 1
-chr19 59302168 59302288 CCDS12878.1_cds_0_0_chr19_59302169_r 0 - 1
-chr2 118288583 118288668 CCDS2120.1_cds_0_0_chr2_118288584_f 0 + 1
-chr2 118394148 118394202 CCDS2121.1_cds_0_0_chr2_118394149_r 0 - 1
-chr2 220190202 220190242 CCDS2441.1_cds_0_0_chr2_220190203_f 0 + 1
-chr2 220229609 220230869 CCDS2443.1_cds_0_0_chr2_220229610_r 0 - 1
-chr20 33330413 33330423 CCDS13249.1_cds_0_0_chr20_33330414_r 0 - 1
-chr20 33513606 33513792 CCDS13255.1_cds_0_0_chr20_33513607_f 0 + 1
-chr20 33579500 33579527 CCDS13256.1_cds_0_0_chr20_33579501_r 0 - 1
-chr20 33593260 33593348 CCDS13257.1_cds_0_0_chr20_33593261_f 0 + 1
-chr21 32707032 32707192 CCDS13614.1_cds_0_0_chr21_32707033_f 0 + 1
-chr21 32869641 32870022 CCDS13615.1_cds_0_0_chr21_32869642_r 0 - 1
-chr21 33321040 33322012 CCDS13620.1_cds_0_0_chr21_33321041_f 0 + 1
-chr21 33744994 33745040 CCDS13625.1_cds_0_0_chr21_33744995_r 0 - 1
-chr22 30120223 30120265 CCDS13897.1_cds_0_0_chr22_30120224_f 0 + 1
-chr22 30160419 30160661 CCDS13898.1_cds_0_0_chr22_30160420_r 0 - 1
-chr22 30665273 30665360 CCDS13901.1_cds_0_0_chr22_30665274_f 0 + 1
-chr22 30939054 30939266 CCDS13903.1_cds_0_0_chr22_30939055_r 0 - 1
-chr5 131424298 131424460 CCDS4149.1_cds_0_0_chr5_131424299_f 0 + 1
-chr5 131556601 131556672 CCDS4151.1_cds_0_0_chr5_131556602_r 0 - 1
-chr5 131621326 131621419 CCDS4152.1_cds_0_0_chr5_131621327_f 0 + 1
-chr5 131847541 131847666 CCDS4155.1_cds_0_0_chr5_131847542_r 0 - 1
-chr6 108299600 108299744 CCDS5061.1_cds_0_0_chr6_108299601_r 0 - 1
-chr6 108594662 108594687 CCDS5063.1_cds_0_0_chr6_108594663_f 0 + 1
-chr6 108640045 108640151 CCDS5064.1_cds_0_0_chr6_108640046_r 0 - 1
-chr6 108722976 108723115 CCDS5067.1_cds_0_0_chr6_108722977_f 0 + 1
-chr7 113660517 113660685 CCDS5760.1_cds_0_0_chr7_113660518_f 0 + 1
-chr7 116512159 116512389 CCDS5771.1_cds_0_0_chr7_116512160_r 0 - 1
-chr7 116714099 116714152 CCDS5773.1_cds_0_0_chr7_116714100_f 0 + 1
-chr7 116945541 116945787 CCDS5774.1_cds_0_0_chr7_116945542_r 0 - 1
-chr8 118881131 118881317 CCDS6324.1_cds_0_0_chr8_118881132_r 0 - 1
-chr9 128764156 128764189 CCDS6914.1_cds_0_0_chr9_128764157_f 0 + 1
-chr9 128787519 128789136 CCDS6915.1_cds_0_0_chr9_128787520_r 0 - 1
-chr9 128882427 128882523 CCDS6917.1_cds_0_0_chr9_128882428_f 0 + 1
-chr9 128937229 128937445 CCDS6919.1_cds_0_0_chr9_128937230_r 0 - 1
-chrX 122745047 122745924 CCDS14606.1_cds_0_0_chrX_122745048_f 0 + 1
-chrX 152648964 152649196 CCDS14733.1_cds_0_0_chrX_152648965_r 0 - 1
-chrX 152691446 152691471 CCDS14735.1_cds_0_0_chrX_152691447_f 0 + 1
-chrX 152694029 152694263 CCDS14736.1_cds_0_0_chrX_152694030_r 0 - 1
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 test-data/eq-condense.dat
--- a/test-data/eq-condense.dat
+++ /dev/null
@@ -1,65 +0,0 @@
-chr1 147962192 147962580 CCDS989.1_cds_0_0_chr1_147962193_r 0 -
-chr1 147984545 147984630 CCDS990.1_cds_0_0_chr1_147984546_f 0 +
-chr1 148078400 148078582 CCDS993.1_cds_0_0_chr1_148078401_r 0 -
-chr1 148185136 148185276 CCDS996.1_cds_0_0_chr1_148185137_f 0 +
-chr10 55251623 55253124 CCDS7248.1_cds_0_0_chr10_55251624_r 0 -
-chr11 116124407 116124501 CCDS8374.1_cds_0_0_chr11_116124408_r 0 -
-chr11 116206508 116206563 CCDS8377.1_cds_0_0_chr11_116206509_f 0 +
-chr11 116211733 116212337 CCDS8378.1_cds_0_0_chr11_116211734_r 0 -
-chr11 1812377 1812407 CCDS7726.1_cds_0_0_chr11_1812378_f 0 +
-chr12 38440094 38440321 CCDS8736.1_cds_0_0_chr12_38440095_r 0 -
-chr13 112381694 112381953 CCDS9526.1_cds_0_0_chr13_112381695_f 0 +
-chr14 98710240 98712285 CCDS9949.1_cds_0_0_chr14_98710241_r 0 -
-chr15 41486872 41487060 CCDS10096.1_cds_0_0_chr15_41486873_r 0 -
-chr15 41673708 41673857 CCDS10097.1_cds_0_0_chr15_41673709_f 0 +
-chr15 41679161 41679250 CCDS10098.1_cds_0_0_chr15_41679162_r 0 -
-chr15 41826029 41826196 CCDS10101.1_cds_0_0_chr15_41826030_f 0 +
-chr16 142908 143003 CCDS10397.1_cds_0_0_chr16_142909_f 0 +
-chr16 179963 180135 CCDS10401.1_cds_0_0_chr16_179964_r 0 -
-chr16 244413 244681 CCDS10402.1_cds_0_0_chr16_244414_f 0 +
-chr16 259268 259383 CCDS10403.1_cds_0_0_chr16_259269_r 0 -
-chr18 23786114 23786321 CCDS11891.1_cds_0_0_chr18_23786115_r 0 -
-chr18 59406881 59407046 CCDS11985.1_cds_0_0_chr18_59406882_f 0 +
-chr18 59455932 59456337 CCDS11986.1_cds_0_0_chr18_59455933_r 0 -
-chr18 59600586 59600754 CCDS11988.1_cds_0_0_chr18_59600587_f 0 +
-chr19 59068595 59069564 CCDS12866.1_cds_0_0_chr19_59068596_f 0 +
-chr19 59236026 59236146 CCDS12872.1_cds_0_0_chr19_59236027_r 0 -
-chr19 59297998 59298008 CCDS12877.1_cds_0_0_chr19_59297999_f 0 +
-chr19 59302168 59302288 CCDS12878.1_cds_0_0_chr19_59302169_r 0 -
-chr2 118288583 118288668 CCDS2120.1_cds_0_0_chr2_118288584_f 0 +
-chr2 118394148 118394202 CCDS2121.1_cds_0_0_chr2_118394149_r 0 -
-chr2 220190202 220190242 CCDS2441.1_cds_0_0_chr2_220190203_f 0 +
-chr2 220229609 220230869 CCDS2443.1_cds_0_0_chr2_220229610_r 0 -
-chr20 33330413 33330423 CCDS13249.1_cds_0_0_chr20_33330414_r 0 -
-chr20 33513606 33513792 CCDS13255.1_cds_0_0_chr20_33513607_f 0 +
-chr20 33579500 33579527 CCDS13256.1_cds_0_0_chr20_33579501_r 0 -
-chr20 33593260 33593348 CCDS13257.1_cds_0_0_chr20_33593261_f 0 +
-chr21 32707032 32707192 CCDS13614.1_cds_0_0_chr21_32707033_f 0 +
-chr21 32869641 32870022 CCDS13615.1_cds_0_0_chr21_32869642_r 0 -
-chr21 33321040 33322012 CCDS13620.1_cds_0_0_chr21_33321041_f 0 +
-chr21 33744994 33745040 CCDS13625.1_cds_0_0_chr21_33744995_r 0 -
-chr22 30120223 30120265 CCDS13897.1_cds_0_0_chr22_30120224_f 0 +
-chr22 30160419 30160661 CCDS13898.1_cds_0_0_chr22_30160420_r 0 -
-chr22 30665273 30665360 CCDS13901.1_cds_0_0_chr22_30665274_f 0 +
-chr22 30939054 30939266 CCDS13903.1_cds_0_0_chr22_30939055_r 0 -
-chr5 131424298 131424460 CCDS4149.1_cds_0_0_chr5_131424299_f 0 +
-chr5 131556601 131556672 CCDS4151.1_cds_0_0_chr5_131556602_r 0 -
-chr5 131621326 131621419 CCDS4152.1_cds_0_0_chr5_131621327_f 0 +
-chr5 131847541 131847666 CCDS4155.1_cds_0_0_chr5_131847542_r 0 -
-chr6 108299600 108299744 CCDS5061.1_cds_0_0_chr6_108299601_r 0 -
-chr6 108594662 108594687 CCDS5063.1_cds_0_0_chr6_108594663_f 0 +
-chr6 108640045 108640151 CCDS5064.1_cds_0_0_chr6_108640046_r 0 -
-chr6 108722976 108723115 CCDS5067.1_cds_0_0_chr6_108722977_f 0 +
-chr7 113660517 113660685 CCDS5760.1_cds_0_0_chr7_113660518_f 0 +
-chr7 116512159 116512389 CCDS5771.1_cds_0_0_chr7_116512160_r 0 -
-chr7 116714099 116714152 CCDS5773.1_cds_0_0_chr7_116714100_f 0 +
-chr7 116945541 116945787 CCDS5774.1_cds_0_0_chr7_116945542_r 0 -
-chr8 118881131 118881317 CCDS6324.1_cds_0_0_chr8_118881132_r 0 -
-chr9 128764156 128764189 CCDS6914.1_cds_0_0_chr9_128764157_f 0 +
-chr9 128787519 128789136 CCDS6915.1_cds_0_0_chr9_128787520_r 0 -
-chr9 128882427 128882523 CCDS6917.1_cds_0_0_chr9_128882428_f 0 +
-chr9 128937229 128937445 CCDS6919.1_cds_0_0_chr9_128937230_r 0 -
-chrX 122745047 122745924 CCDS14606.1_cds_0_0_chrX_122745048_f 0 +
-chrX 152648964 152649196 CCDS14733.1_cds_0_0_chrX_152648965_r 0 -
-chrX 152691446 152691471 CCDS14735.1_cds_0_0_chrX_152691447_f 0 +
-chrX 152694029 152694263 CCDS14736.1_cds_0_0_chrX_152694030_r 0 -
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 test-data/eq-convert.dat
--- a/test-data/eq-convert.dat
+++ /dev/null
@@ -1,65 +0,0 @@
-chr1 147962192 147962580 CCDS989.1_cds_0_0_chr1_147962193_r 0 -
-chr1 147984545 147984630 CCDS990.1_cds_0_0_chr1_147984546_f 0 +
-chr1 148078400 148078582 CCDS993.1_cds_0_0_chr1_148078401_r 0 -
-chr1 148185136 148185276 CCDS996.1_cds_0_0_chr1_148185137_f 0 +
-chr10 55251623 55253124 CCDS7248.1_cds_0_0_chr10_55251624_r 0 -
-chr11 116124407 116124501 CCDS8374.1_cds_0_0_chr11_116124408_r 0 -
-chr11 116206508 116206563 CCDS8377.1_cds_0_0_chr11_116206509_f 0 +
-chr11 116211733 116212337 CCDS8378.1_cds_0_0_chr11_116211734_r 0 -
-chr11 1812377 1812407 CCDS7726.1_cds_0_0_chr11_1812378_f 0 +
-chr12 38440094 38440321 CCDS8736.1_cds_0_0_chr12_38440095_r 0 -
-chr13 112381694 112381953 CCDS9526.1_cds_0_0_chr13_112381695_f 0 +
-chr14 98710240 98712285 CCDS9949.1_cds_0_0_chr14_98710241_r 0 -
-chr15 41486872 41487060 CCDS10096.1_cds_0_0_chr15_41486873_r 0 -
-chr15 41673708 41673857 CCDS10097.1_cds_0_0_chr15_41673709_f 0 +
-chr15 41679161 41679250 CCDS10098.1_cds_0_0_chr15_41679162_r 0 -
-chr15 41826029 41826196 CCDS10101.1_cds_0_0_chr15_41826030_f 0 +
-chr16 142908 143003 CCDS10397.1_cds_0_0_chr16_142909_f 0 +
-chr16 179963 180135 CCDS10401.1_cds_0_0_chr16_179964_r 0 -
-chr16 244413 244681 CCDS10402.1_cds_0_0_chr16_244414_f 0 +
-chr16 259268 259383 CCDS10403.1_cds_0_0_chr16_259269_r 0 -
-chr18 23786114 23786321 CCDS11891.1_cds_0_0_chr18_23786115_r 0 -
-chr18 59406881 59407046 CCDS11985.1_cds_0_0_chr18_59406882_f 0 +
-chr18 59455932 59456337 CCDS11986.1_cds_0_0_chr18_59455933_r 0 -
-chr18 59600586 59600754 CCDS11988.1_cds_0_0_chr18_59600587_f 0 +
-chr19 59068595 59069564 CCDS12866.1_cds_0_0_chr19_59068596_f 0 +
-chr19 59236026 59236146 CCDS12872.1_cds_0_0_chr19_59236027_r 0 -
-chr19 59297998 59298008 CCDS12877.1_cds_0_0_chr19_59297999_f 0 +
-chr19 59302168 59302288 CCDS12878.1_cds_0_0_chr19_59302169_r 0 -
-chr2 118288583 118288668 CCDS2120.1_cds_0_0_chr2_118288584_f 0 +
-chr2 118394148 118394202 CCDS2121.1_cds_0_0_chr2_118394149_r 0 -
-chr2 220190202 220190242 CCDS2441.1_cds_0_0_chr2_220190203_f 0 +
-chr2 220229609 220230869 CCDS2443.1_cds_0_0_chr2_220229610_r 0 -
-chr20 33330413 33330423 CCDS13249.1_cds_0_0_chr20_33330414_r 0 -
-chr20 33513606 33513792 CCDS13255.1_cds_0_0_chr20_33513607_f 0 +
-chr20 33579500 33579527 CCDS13256.1_cds_0_0_chr20_33579501_r 0 -
-chr20 33593260 33593348 CCDS13257.1_cds_0_0_chr20_33593261_f 0 +
-chr21 32707032 32707192 CCDS13614.1_cds_0_0_chr21_32707033_f 0 +
-chr21 32869641 32870022 CCDS13615.1_cds_0_0_chr21_32869642_r 0 -
-chr21 33321040 33322012 CCDS13620.1_cds_0_0_chr21_33321041_f 0 +
-chr21 33744994 33745040 CCDS13625.1_cds_0_0_chr21_33744995_r 0 -
-chr22 30120223 30120265 CCDS13897.1_cds_0_0_chr22_30120224_f 0 +
-chr22 30160419 30160661 CCDS13898.1_cds_0_0_chr22_30160420_r 0 -
-chr22 30665273 30665360 CCDS13901.1_cds_0_0_chr22_30665274_f 0 +
-chr22 30939054 30939266 CCDS13903.1_cds_0_0_chr22_30939055_r 0 -
-chr5 131424298 131424460 CCDS4149.1_cds_0_0_chr5_131424299_f 0 +
-chr5 131556601 131556672 CCDS4151.1_cds_0_0_chr5_131556602_r 0 -
-chr5 131621326 131621419 CCDS4152.1_cds_0_0_chr5_131621327_f 0 +
-chr5 131847541 131847666 CCDS4155.1_cds_0_0_chr5_131847542_r 0 -
-chr6 108299600 108299744 CCDS5061.1_cds_0_0_chr6_108299601_r 0 -
-chr6 108594662 108594687 CCDS5063.1_cds_0_0_chr6_108594663_f 0 +
-chr6 108640045 108640151 CCDS5064.1_cds_0_0_chr6_108640046_r 0 -
-chr6 108722976 108723115 CCDS5067.1_cds_0_0_chr6_108722977_f 0 +
-chr7 113660517 113660685 CCDS5760.1_cds_0_0_chr7_113660518_f 0 +
-chr7 116512159 116512389 CCDS5771.1_cds_0_0_chr7_116512160_r 0 -
-chr7 116714099 116714152 CCDS5773.1_cds_0_0_chr7_116714100_f 0 +
-chr7 116945541 116945787 CCDS5774.1_cds_0_0_chr7_116945542_r 0 -
-chr8 118881131 118881317 CCDS6324.1_cds_0_0_chr8_118881132_r 0 -
-chr9 128764156 128764189 CCDS6914.1_cds_0_0_chr9_128764157_f 0 +
-chr9 128787519 128789136 CCDS6915.1_cds_0_0_chr9_128787520_r 0 -
-chr9 128882427 128882523 CCDS6917.1_cds_0_0_chr9_128882428_f 0 +
-chr9 128937229 128937445 CCDS6919.1_cds_0_0_chr9_128937230_r 0 -
-chrX 122745047 122745924 CCDS14606.1_cds_0_0_chrX_122745048_f 0 +
-chrX 152648964 152649196 CCDS14733.1_cds_0_0_chrX_152648965_r 0 -
-chrX 152691446 152691471 CCDS14735.1_cds_0_0_chrX_152691447_f 0 +
-chrX 152694029 152694263 CCDS14736.1_cds_0_0_chrX_152694030_r 0 -
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 test-data/eq-cut.dat
--- a/test-data/eq-cut.dat
+++ /dev/null
@@ -1,65 +0,0 @@
-chr1 CCDS989.1_cds_0_0_chr1_147962193_r 147962192 147962580
-chr1 CCDS990.1_cds_0_0_chr1_147984546_f 147984545 147984630
-chr1 CCDS993.1_cds_0_0_chr1_148078401_r 148078400 148078582
-chr1 CCDS996.1_cds_0_0_chr1_148185137_f 148185136 148185276
-chr10 CCDS7248.1_cds_0_0_chr10_55251624_r 55251623 55253124
-chr11 CCDS8374.1_cds_0_0_chr11_116124408_r 116124407 116124501
-chr11 CCDS8377.1_cds_0_0_chr11_116206509_f 116206508 116206563
-chr11 CCDS8378.1_cds_0_0_chr11_116211734_r 116211733 116212337
-chr11 CCDS7726.1_cds_0_0_chr11_1812378_f 1812377 1812407
-chr12 CCDS8736.1_cds_0_0_chr12_38440095_r 38440094 38440321
-chr13 CCDS9526.1_cds_0_0_chr13_112381695_f 112381694 112381953
-chr14 CCDS9949.1_cds_0_0_chr14_98710241_r 98710240 98712285
-chr15 CCDS10096.1_cds_0_0_chr15_41486873_r 41486872 41487060
-chr15 CCDS10097.1_cds_0_0_chr15_41673709_f 41673708 41673857
-chr15 CCDS10098.1_cds_0_0_chr15_41679162_r 41679161 41679250
-chr15 CCDS10101.1_cds_0_0_chr15_41826030_f 41826029 41826196
-chr16 CCDS10397.1_cds_0_0_chr16_142909_f 142908 143003
-chr16 CCDS10401.1_cds_0_0_chr16_179964_r 179963 180135
-chr16 CCDS10402.1_cds_0_0_chr16_244414_f 244413 244681
-chr16 CCDS10403.1_cds_0_0_chr16_259269_r 259268 259383
-chr18 CCDS11891.1_cds_0_0_chr18_23786115_r 23786114 23786321
-chr18 CCDS11985.1_cds_0_0_chr18_59406882_f 59406881 59407046
-chr18 CCDS11986.1_cds_0_0_chr18_59455933_r 59455932 59456337
-chr18 CCDS11988.1_cds_0_0_chr18_59600587_f 59600586 59600754
-chr19 CCDS12866.1_cds_0_0_chr19_59068596_f 59068595 59069564
-chr19 CCDS12872.1_cds_0_0_chr19_59236027_r 59236026 59236146
-chr19 CCDS12877.1_cds_0_0_chr19_59297999_f 59297998 59298008
-chr19 CCDS12878.1_cds_0_0_chr19_59302169_r 59302168 59302288
-chr2 CCDS2120.1_cds_0_0_chr2_118288584_f 118288583 118288668
-chr2 CCDS2121.1_cds_0_0_chr2_118394149_r 118394148 118394202
-chr2 CCDS2441.1_cds_0_0_chr2_220190203_f 220190202 220190242
-chr2 CCDS2443.1_cds_0_0_chr2_220229610_r 220229609 220230869
-chr20 CCDS13249.1_cds_0_0_chr20_33330414_r 33330413 33330423
-chr20 CCDS13255.1_cds_0_0_chr20_33513607_f 33513606 33513792
-chr20 CCDS13256.1_cds_0_0_chr20_33579501_r 33579500 33579527
-chr20 CCDS13257.1_cds_0_0_chr20_33593261_f 33593260 33593348
-chr21 CCDS13614.1_cds_0_0_chr21_32707033_f 32707032 32707192
-chr21 CCDS13615.1_cds_0_0_chr21_32869642_r 32869641 32870022
-chr21 CCDS13620.1_cds_0_0_chr21_33321041_f 33321040 33322012
-chr21 CCDS13625.1_cds_0_0_chr21_33744995_r 33744994 33745040
-chr22 CCDS13897.1_cds_0_0_chr22_30120224_f 30120223 30120265
-chr22 CCDS13898.1_cds_0_0_chr22_30160420_r 30160419 30160661
-chr22 CCDS13901.1_cds_0_0_chr22_30665274_f 30665273 30665360
-chr22 CCDS13903.1_cds_0_0_chr22_30939055_r 30939054 30939266
-chr5 CCDS4149.1_cds_0_0_chr5_131424299_f 131424298 131424460
-chr5 CCDS4151.1_cds_0_0_chr5_131556602_r 131556601 131556672
-chr5 CCDS4152.1_cds_0_0_chr5_131621327_f 131621326 131621419
-chr5 CCDS4155.1_cds_0_0_chr5_131847542_r 131847541 131847666
-chr6 CCDS5061.1_cds_0_0_chr6_108299601_r 108299600 108299744
-chr6 CCDS5063.1_cds_0_0_chr6_108594663_f 108594662 108594687
-chr6 CCDS5064.1_cds_0_0_chr6_108640046_r 108640045 108640151
-chr6 CCDS5067.1_cds_0_0_chr6_108722977_f 108722976 108723115
-chr7 CCDS5760.1_cds_0_0_chr7_113660518_f 113660517 113660685
-chr7 CCDS5771.1_cds_0_0_chr7_116512160_r 116512159 116512389
-chr7 CCDS5773.1_cds_0_0_chr7_116714100_f 116714099 116714152
-chr7 CCDS5774.1_cds_0_0_chr7_116945542_r 116945541 116945787
-chr8 CCDS6324.1_cds_0_0_chr8_118881132_r 118881131 118881317
-chr9 CCDS6914.1_cds_0_0_chr9_128764157_f 128764156 128764189
-chr9 CCDS6915.1_cds_0_0_chr9_128787520_r 128787519 128789136
-chr9 CCDS6917.1_cds_0_0_chr9_128882428_f 128882427 128882523
-chr9 CCDS6919.1_cds_0_0_chr9_128937230_r 128937229 128937445
-chrX CCDS14606.1_cds_0_0_chrX_122745048_f 122745047 122745924
-chrX CCDS14733.1_cds_0_0_chrX_152648965_r 152648964 152649196
-chrX CCDS14735.1_cds_0_0_chrX_152691447_f 152691446 152691471
-chrX CCDS14736.1_cds_0_0_chrX_152694030_r 152694029 152694263
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 test-data/mergeCols.dat
--- a/test-data/mergeCols.dat
+++ /dev/null
@@ -1,65 +0,0 @@
-chr1 147962192 147962580 CCDS989.1_cds_0_0_chr1_147962193_r 0 - CCDS989.1_cds_0_0_chr1_147962193_rchr1-
-chr1 147984545 147984630 CCDS990.1_cds_0_0_chr1_147984546_f 0 + CCDS990.1_cds_0_0_chr1_147984546_fchr1+
-chr1 148078400 148078582 CCDS993.1_cds_0_0_chr1_148078401_r 0 - CCDS993.1_cds_0_0_chr1_148078401_rchr1-
-chr1 148185136 148185276 CCDS996.1_cds_0_0_chr1_148185137_f 0 + CCDS996.1_cds_0_0_chr1_148185137_fchr1+
-chr10 55251623 55253124 CCDS7248.1_cds_0_0_chr10_55251624_r 0 - CCDS7248.1_cds_0_0_chr10_55251624_rchr10-
-chr11 116124407 116124501 CCDS8374.1_cds_0_0_chr11_116124408_r 0 - CCDS8374.1_cds_0_0_chr11_116124408_rchr11-
-chr11 116206508 116206563 CCDS8377.1_cds_0_0_chr11_116206509_f 0 + CCDS8377.1_cds_0_0_chr11_116206509_fchr11+
-chr11 116211733 116212337 CCDS8378.1_cds_0_0_chr11_116211734_r 0 - CCDS8378.1_cds_0_0_chr11_116211734_rchr11-
-chr11 1812377 1812407 CCDS7726.1_cds_0_0_chr11_1812378_f 0 + CCDS7726.1_cds_0_0_chr11_1812378_fchr11+
-chr12 38440094 38440321 CCDS8736.1_cds_0_0_chr12_38440095_r 0 - CCDS8736.1_cds_0_0_chr12_38440095_rchr12-
-chr13 112381694 112381953 CCDS9526.1_cds_0_0_chr13_112381695_f 0 + CCDS9526.1_cds_0_0_chr13_112381695_fchr13+
-chr14 98710240 98712285 CCDS9949.1_cds_0_0_chr14_98710241_r 0 - CCDS9949.1_cds_0_0_chr14_98710241_rchr14-
-chr15 41486872 41487060 CCDS10096.1_cds_0_0_chr15_41486873_r 0 - CCDS10096.1_cds_0_0_chr15_41486873_rchr15-
-chr15 41673708 41673857 CCDS10097.1_cds_0_0_chr15_41673709_f 0 + CCDS10097.1_cds_0_0_chr15_41673709_fchr15+
-chr15 41679161 41679250 CCDS10098.1_cds_0_0_chr15_41679162_r 0 - CCDS10098.1_cds_0_0_chr15_41679162_rchr15-
-chr15 41826029 41826196 CCDS10101.1_cds_0_0_chr15_41826030_f 0 + CCDS10101.1_cds_0_0_chr15_41826030_fchr15+
-chr16 142908 143003 CCDS10397.1_cds_0_0_chr16_142909_f 0 + CCDS10397.1_cds_0_0_chr16_142909_fchr16+
-chr16 179963 180135 CCDS10401.1_cds_0_0_chr16_179964_r 0 - CCDS10401.1_cds_0_0_chr16_179964_rchr16-
-chr16 244413 244681 CCDS10402.1_cds_0_0_chr16_244414_f 0 + CCDS10402.1_cds_0_0_chr16_244414_fchr16+
-chr16 259268 259383 CCDS10403.1_cds_0_0_chr16_259269_r 0 - CCDS10403.1_cds_0_0_chr16_259269_rchr16-
-chr18 23786114 23786321 CCDS11891.1_cds_0_0_chr18_23786115_r 0 - CCDS11891.1_cds_0_0_chr18_23786115_rchr18-
-chr18 59406881 59407046 CCDS11985.1_cds_0_0_chr18_59406882_f 0 + CCDS11985.1_cds_0_0_chr18_59406882_fchr18+
-chr18 59455932 59456337 CCDS11986.1_cds_0_0_chr18_59455933_r 0 - CCDS11986.1_cds_0_0_chr18_59455933_rchr18-
-chr18 59600586 59600754 CCDS11988.1_cds_0_0_chr18_59600587_f 0 + CCDS11988.1_cds_0_0_chr18_59600587_fchr18+
-chr19 59068595 59069564 CCDS12866.1_cds_0_0_chr19_59068596_f 0 + CCDS12866.1_cds_0_0_chr19_59068596_fchr19+
-chr19 59236026 59236146 CCDS12872.1_cds_0_0_chr19_59236027_r 0 - CCDS12872.1_cds_0_0_chr19_59236027_rchr19-
-chr19 59297998 59298008 CCDS12877.1_cds_0_0_chr19_59297999_f 0 + CCDS12877.1_cds_0_0_chr19_59297999_fchr19+
-chr19 59302168 59302288 CCDS12878.1_cds_0_0_chr19_59302169_r 0 - CCDS12878.1_cds_0_0_chr19_59302169_rchr19-
-chr2 118288583 118288668 CCDS2120.1_cds_0_0_chr2_118288584_f 0 + CCDS2120.1_cds_0_0_chr2_118288584_fchr2+
-chr2 118394148 118394202 CCDS2121.1_cds_0_0_chr2_118394149_r 0 - CCDS2121.1_cds_0_0_chr2_118394149_rchr2-
-chr2 220190202 220190242 CCDS2441.1_cds_0_0_chr2_220190203_f 0 + CCDS2441.1_cds_0_0_chr2_220190203_fchr2+
-chr2 220229609 220230869 CCDS2443.1_cds_0_0_chr2_220229610_r 0 - CCDS2443.1_cds_0_0_chr2_220229610_rchr2-
-chr20 33330413 33330423 CCDS13249.1_cds_0_0_chr20_33330414_r 0 - CCDS13249.1_cds_0_0_chr20_33330414_rchr20-
-chr20 33513606 33513792 CCDS13255.1_cds_0_0_chr20_33513607_f 0 + CCDS13255.1_cds_0_0_chr20_33513607_fchr20+
-chr20 33579500 33579527 CCDS13256.1_cds_0_0_chr20_33579501_r 0 - CCDS13256.1_cds_0_0_chr20_33579501_rchr20-
-chr20 33593260 33593348 CCDS13257.1_cds_0_0_chr20_33593261_f 0 + CCDS13257.1_cds_0_0_chr20_33593261_fchr20+
-chr21 32707032 32707192 CCDS13614.1_cds_0_0_chr21_32707033_f 0 + CCDS13614.1_cds_0_0_chr21_32707033_fchr21+
-chr21 32869641 32870022 CCDS13615.1_cds_0_0_chr21_32869642_r 0 - CCDS13615.1_cds_0_0_chr21_32869642_rchr21-
-chr21 33321040 33322012 CCDS13620.1_cds_0_0_chr21_33321041_f 0 + CCDS13620.1_cds_0_0_chr21_33321041_fchr21+
-chr21 33744994 33745040 CCDS13625.1_cds_0_0_chr21_33744995_r 0 - CCDS13625.1_cds_0_0_chr21_33744995_rchr21-
-chr22 30120223 30120265 CCDS13897.1_cds_0_0_chr22_30120224_f 0 + CCDS13897.1_cds_0_0_chr22_30120224_fchr22+
-chr22 30160419 30160661 CCDS13898.1_cds_0_0_chr22_30160420_r 0 - CCDS13898.1_cds_0_0_chr22_30160420_rchr22-
-chr22 30665273 30665360 CCDS13901.1_cds_0_0_chr22_30665274_f 0 + CCDS13901.1_cds_0_0_chr22_30665274_fchr22+
-chr22 30939054 30939266 CCDS13903.1_cds_0_0_chr22_30939055_r 0 - CCDS13903.1_cds_0_0_chr22_30939055_rchr22-
-chr5 131424298 131424460 CCDS4149.1_cds_0_0_chr5_131424299_f 0 + CCDS4149.1_cds_0_0_chr5_131424299_fchr5+
-chr5 131556601 131556672 CCDS4151.1_cds_0_0_chr5_131556602_r 0 - CCDS4151.1_cds_0_0_chr5_131556602_rchr5-
-chr5 131621326 131621419 CCDS4152.1_cds_0_0_chr5_131621327_f 0 + CCDS4152.1_cds_0_0_chr5_131621327_fchr5+
-chr5 131847541 131847666 CCDS4155.1_cds_0_0_chr5_131847542_r 0 - CCDS4155.1_cds_0_0_chr5_131847542_rchr5-
-chr6 108299600 108299744 CCDS5061.1_cds_0_0_chr6_108299601_r 0 - CCDS5061.1_cds_0_0_chr6_108299601_rchr6-
-chr6 108594662 108594687 CCDS5063.1_cds_0_0_chr6_108594663_f 0 + CCDS5063.1_cds_0_0_chr6_108594663_fchr6+
-chr6 108640045 108640151 CCDS5064.1_cds_0_0_chr6_108640046_r 0 - CCDS5064.1_cds_0_0_chr6_108640046_rchr6-
-chr6 108722976 108723115 CCDS5067.1_cds_0_0_chr6_108722977_f 0 + CCDS5067.1_cds_0_0_chr6_108722977_fchr6+
-chr7 113660517 113660685 CCDS5760.1_cds_0_0_chr7_113660518_f 0 + CCDS5760.1_cds_0_0_chr7_113660518_fchr7+
-chr7 116512159 116512389 CCDS5771.1_cds_0_0_chr7_116512160_r 0 - CCDS5771.1_cds_0_0_chr7_116512160_rchr7-
-chr7 116714099 116714152 CCDS5773.1_cds_0_0_chr7_116714100_f 0 + CCDS5773.1_cds_0_0_chr7_116714100_fchr7+
-chr7 116945541 116945787 CCDS5774.1_cds_0_0_chr7_116945542_r 0 - CCDS5774.1_cds_0_0_chr7_116945542_rchr7-
-chr8 118881131 118881317 CCDS6324.1_cds_0_0_chr8_118881132_r 0 - CCDS6324.1_cds_0_0_chr8_118881132_rchr8-
-chr9 128764156 128764189 CCDS6914.1_cds_0_0_chr9_128764157_f 0 + CCDS6914.1_cds_0_0_chr9_128764157_fchr9+
-chr9 128787519 128789136 CCDS6915.1_cds_0_0_chr9_128787520_r 0 - CCDS6915.1_cds_0_0_chr9_128787520_rchr9-
-chr9 128882427 128882523 CCDS6917.1_cds_0_0_chr9_128882428_f 0 + CCDS6917.1_cds_0_0_chr9_128882428_fchr9+
-chr9 128937229 128937445 CCDS6919.1_cds_0_0_chr9_128937230_r 0 - CCDS6919.1_cds_0_0_chr9_128937230_rchr9-
-chrX 122745047 122745924 CCDS14606.1_cds_0_0_chrX_122745048_f 0 + CCDS14606.1_cds_0_0_chrX_122745048_fchrX+
-chrX 152648964 152649196 CCDS14733.1_cds_0_0_chrX_152648965_r 0 - CCDS14733.1_cds_0_0_chrX_152648965_rchrX-
-chrX 152691446 152691471 CCDS14735.1_cds_0_0_chrX_152691447_f 0 + CCDS14735.1_cds_0_0_chrX_152691447_fchrX+
-chrX 152694029 152694263 CCDS14736.1_cds_0_0_chrX_152694030_r 0 - CCDS14736.1_cds_0_0_chrX_152694030_rchrX-
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 test-data/trimmer_a_f_c0_s1_e13_i62.dat
--- a/test-data/trimmer_a_f_c0_s1_e13_i62.dat
+++ /dev/null
@@ -1,5 +0,0 @@
-12345 abcdef
-67890 ghjkl g
->assa lljlj ljlj
-sasas hghg hg
-@dgf gfgf gfg
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 test-data/trimmer_a_f_c2_s1_e2_i62.dat
--- a/test-data/trimmer_a_f_c2_s1_e2_i62.dat
+++ /dev/null
@@ -1,5 +0,0 @@
-12345 ab xyz
-67890 gh ghjt
->assa lljlj ljlj
-sasas hg hghg
-@dgf gf gfgf
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 test-data/trimmer_tab_delimited.dat
--- a/test-data/trimmer_tab_delimited.dat
+++ /dev/null
@@ -1,5 +0,0 @@
-12345 abcdef xyz
-67890 ghjkl ghjt
->assa lljlj ljlj
-sasas hghg hghg
-@dgf gfgf gfgf
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tool_conf.xml.sample
--- a/tool_conf.xml.sample
+++ b/tool_conf.xml.sample
@@ -44,21 +44,12 @@
<tool file="extract/liftOver_wrapper.xml" /></section><section name="Text Manipulation" id="textutil">
- <tool file="filters/fixedValueColumn.xml" /><tool file="stats/column_maker.xml" /><tool file="filters/catWrapper.xml" /><tool file="filters/cutWrapper.xml" />
- <tool file="filters/mergeCols.xml" />
- <tool file="filters/convert_characters.xml" /><tool file="filters/CreateInterval.xml" />
- <tool file="filters/cutWrapper.xml" />
- <tool file="filters/changeCase.xml" /><tool file="filters/pasteWrapper.xml" />
- <tool file="filters/remove_beginning.xml" /><tool file="filters/randomlines.xml" />
- <tool file="filters/headWrapper.xml" />
- <tool file="filters/tailWrapper.xml" />
- <tool file="filters/trimmer.xml" /><tool file="filters/wc_gnu.xml" /><tool file="filters/secure_hash_message_digest.xml" /><tool file="stats/dna_filtering.xml" />
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/changeCase.pl
--- a/tools/filters/changeCase.pl
+++ /dev/null
@@ -1,58 +0,0 @@
-#! /usr/bin/perl -w
-
-use strict;
-use warnings;
-
-my $columns = {};
-my $del = "";
-my @in = ();
-my @out = ();
-my $command = "";
-my $field = 0;
-
-# a wrapper for changing the case of columns from within galaxy
-# isaChangeCase.pl [filename] [columns] [delim] [casing] [output]
-
-die "Check arguments: $0 [filename] [columns] [delim] [casing] [output]\n" unless @ARGV == 5;
-
-# process column input
-$ARGV[1] =~ s/\s+//g;
-foreach ( split /,/, $ARGV[1] ) {
- if (m/^c\d{1,}$/i) {
- s/c//ig;
- $columns->{$_} = --$_;
- }
-}
-
-die "No columns specified, columns are not preceeded with 'c', or commas are not used to separate column numbers: $ARGV[1]\n" if keys %$columns == 0;
-
-my $column_delimiters_href = {
- 'TAB' => q{\t},
- 'COMMA' => ",",
- 'DASH' => "-",
- 'UNDERSCORE' => "_",
- 'PIPE' => q{\|},
- 'DOT' => q{\.},
- 'SPACE' => q{\s+}
-};
-
-$del = $column_delimiters_href->{$ARGV[2]};
-
-open (OUT, ">$ARGV[4]") or die "Cannot create $ARGV[4]:$!\n";
-open (IN, "<$ARGV[0]") or die "Cannot open $ARGV[0]:$!\n";
-while (<IN>) {
- chop;
- @in = split /$del/;
- for ( my $i = 0; $i <= $#in; ++$i) {
- if (exists $columns->{$i}) {
- push(@out, $ARGV[3] eq 'up' ? uc($in[$i]) : lc($in[$i]));
- } else {
- push(@out, $in[$i]);
- }
- }
- print OUT join("\t",@out), "\n";
- @out = ();
-}
-close IN;
-
-close OUT;
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/changeCase.xml
--- a/tools/filters/changeCase.xml
+++ /dev/null
@@ -1,77 +0,0 @@
-<tool id="ChangeCase" name="Change Case">
- <description> of selected columns</description>
- <stdio>
- <exit_code range="1:" err_level="fatal" />
- </stdio>
- <command interpreter="perl">changeCase.pl $input "$cols" $delimiter $casing $out_file1</command>
- <inputs>
- <param name="input" format="txt" type="data" label="From"/>
- <param name="cols" size="10" type="text" value="c1,c2" label="Change case of columns"/>
- <param name="delimiter" type="select" label="Delimited by">
- <option value="TAB">Tab</option>
- <option value="SPACE">Whitespace</option>
- <option value="DOT">Dot</option>
- <option value="COMMA">Comma</option>
- <option value="DASH">Dash</option>
- <option value="UNDERSCORE">Underscore</option>
- <option value="PIPE">Pipe</option>
- </param>
- <param name="casing" type="select" label="To">
- <option value="up">Upper case</option>
- <option value="lo">Lower case</option>
- </param>
- </inputs>
- <outputs>
- <data format="tabular" name="out_file1" />
- </outputs>
- <tests>
- <test>
- <param name="input" value="1.txt" ftype="txt"/>
- <param name="cols" value="c1"/>
- <param name="delimiter" value="SPACE"/>
- <param name="casing" value="up"/>
- <output name="out_file1" file="changeCase_out1.tabular"/>
- </test>
- <test>
- <param name="input" value="1.bed" ftype="bed"/>
- <param name="cols" value="c1"/>
- <param name="delimiter" value="TAB"/>
- <param name="casing" value="up"/>
- <output name="out_file1" file="changeCase_out2.tabular"/>
- </test>
- </tests>
- <help>
-
-.. class:: warningmark
-
-**This tool breaks column assignments.** To re-establish column assignments run the tool and click on the pencil icon in the resulting history item.
-
-.. class:: warningmark
-
-The format of the resulting dataset from this tool is always tabular.
-
------
-
-**What it does**
-
-This tool selects specified columns from a dataset and converts the values of those columns to upper or lower case.
-
-- Columns are specified as **c1**, **c2**, and so on.
-- Columns can be specified in any order (e.g., **c2,c1,c6**)
-
------
-
-**Example**
-
-Changing columns 1 and 3 ( delimited by Comma ) to upper case in::
-
- apple,is,good
- windows,is,bad
-
-will result in::
-
- APPLE is GOOD
- WINDOWS is BAD
-
- </help>
-</tool>
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/condense_characters.pl
--- a/tools/filters/condense_characters.pl
+++ /dev/null
@@ -1,105 +0,0 @@
-#! /usr/bin/perl -w
-
-use strict;
-use warnings;
-
-# condenses all consecutive characters of one type
-# convert_characters.pl [input] [character] [output]
-
-die "Check arguments" unless @ARGV == 3;
-
-my $inputfile = $ARGV[0];
-my $character = $ARGV[1];
-my $outputfile = $ARGV[2];
-
-
-my $convert_from;
-my $convert_to;
-
-
-if ($character eq "s")
-{
- $convert_from = '\s';
-}
-elsif ($character eq "T")
-{
- $convert_from = '\t';
-}
-elsif ($character eq "Sp")
-{
- $convert_from = " ";
-}
-elsif ($character eq "Dt")
-{
- $convert_from = '\.';
-}
-elsif ($character eq "C")
-{
- $convert_from = ",";
-}
-elsif ($character eq "D")
-{
- $convert_from = "-";
-}
-elsif ($character eq "U")
-{
- $convert_from = "_";
-}
-elsif ($character eq "P")
-{
- $convert_from = '\|';
-}
-else
-{
- die "Invalid value specified for convert from\n";
-}
-
-
-if ($character eq "T")
-{
- $convert_to = "\t";
-}
-elsif ($character eq "Sp")
-{
- $convert_to = " ";
-}
-elsif ($character eq "Dt")
-{
- $convert_to = "\.";
-}
-elsif ($character eq "C")
-{
- $convert_to = ",";
-}
-elsif ($character eq "D")
-{
- $convert_to = "-";
-}
-elsif ($character eq "U")
-{
- $convert_to = "_";
-}
-elsif ($character eq "P")
-{
- $convert_to = "|";
-}
-else
-{
- die "Invalid value specified for Convert to\n";
-}
-
-my $fhIn;
-open ($fhIn, "< $inputfile") or die "Cannot open source file";
-
-my $fhOut;
-open ($fhOut, "> $outputfile");
-
-while (<$fhIn>)
-{
- my $thisLine = $_;
- chomp $thisLine;
- $thisLine =~ s/${convert_from}+/$convert_to/g;
- print $fhOut $thisLine,"\n";
-}
-close ($fhIn) or die "Cannot close source file";
-close ($fhOut) or die "Cannot close output file";
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/condense_characters.xml
--- a/tools/filters/condense_characters.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<tool id="Condense characters1" name="Condense">
- <description>consecutive characters</description>
- <command interpreter="perl">condense_characters.pl $input $character $out_file1</command>
- <inputs>
-<!-- <display>condense all consecutive $character from $input</display> -->
- <param name="character" type="select" label="Condense all consecutive">
- <option value="T">Tabs</option>
- <option value="Sp">Spaces</option>
- <option value="Dt">Dots</option>
- <option value="C">Commas</option>
- <option value="D">Dashes</option>
- <option value="U">Underscores</option>
- <option value="P">Pipes</option>
- </param>
- <param format="txt" name="input" type="data" label="in this Query"/>
- </inputs>
- <outputs>
- <data format="input" name="out_file1" metadata_source="input" />
- </outputs>
- <tests>
- <test>
- <param name="character" value="T"/>
- <param name="input" value="1.bed"/>
- <output name="out_file1" file="eq-condense.dat"/>
- </test>
- </tests>
- <help>
-
-**What it does**
-
-This tool condenses all consecutive characters of a specified type.
-
------
-
-**Example**
-
-- Input file::
-
- geneX,,,10,,,,,20
- geneY,,5,,,,,12,15,9,
-
-- Condense all consecutive commas. The above file will be converted into::
-
- geneX,10,20
- geneY,5,12,15,9
-
-</help>
-</tool>
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/convert_characters.py
--- a/tools/filters/convert_characters.py
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/usr/bin/env python
-#By, Guruprasad Ananda.
-
-from galaxy import eggs
-import sys, re
-
-def stop_err(msg):
- sys.stderr.write(msg)
- sys.exit()
-
-def main():
- if len(sys.argv) != 4:
- stop_err("usage: convert_characters infile from_char outfile")
-
- try:
- fin = open(sys.argv[1],'r')
- except:
- stop_err("Input file cannot be opened for reading.")
-
- from_char = sys.argv[2]
-
- try:
- fout = open(sys.argv[3],'w')
- except:
- stop_err("Output file cannot be opened for writing.")
-
- char_dict = {'T':'\t','s':'\s','Dt':'\.','C':',','D':'-','U':'_','P':'\|','Co':':'}
- from_ch = char_dict[from_char] + '+' #making an RE to match 1 or more occurences.
- skipped = 0
-
- for line in fin:
- line = line.strip()
- try:
- fout.write("%s\n" %(re.sub(from_ch,'\t',line)))
- except:
- skipped += 1
-
- if skipped:
- print "Skipped %d lines as invalid." %skipped
-
-if __name__ == "__main__":
- main()
\ No newline at end of file
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/convert_characters.xml
--- a/tools/filters/convert_characters.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<tool id="Convert characters1" name="Convert">
- <description>delimiters to TAB</description>
- <command interpreter="python">convert_characters.py $input $convert_from $out_file1</command>
- <inputs>
- <param name="convert_from" type="select" label="Convert all">
- <option value="s">Whitespaces</option>
- <option value="T">Tabs</option>
- <!--<option value="Sp">Spaces</option>-->
- <option value="Dt">Dots</option>
- <option value="C">Commas</option>
- <option value="D">Dashes</option>
- <option value="U">Underscores</option>
- <option value="P">Pipes</option>
- <option value="Co">Colons</option>
- </param>
- <param format="txt" name="input" type="data" label="in Query"/>
- </inputs>
- <outputs>
- <data format="tabular" name="out_file1" />
- </outputs>
- <tests>
- <test>
- <param name="convert_from" value="s"/>
- <param name="input" value="1.bed"/>
- <output name="out_file1" file="eq-convert.dat"/>
- </test>
- <test>
- <param name="convert_from" value="s"/>
- <param name="input" value="a.txt"/>
- <output name="out_file1" file="a.tab"/>
- </test>
- </tests>
- <help>
-
-**What it does**
-
-Converts all delimiters of a specified type into TABs. Consecutive characters are condensed. For example, if columns are separated by 5 spaces they will converted into 1 tab.
-
------
-
-**Example**
-
-- Input file::
-
- chrX||151283558|151283724|NM_000808_exon_8_0_chrX_151283559_r|0|-
- chrX|151370273|151370486|NM_000808_exon_9_0_chrX_151370274_r|0|-
- chrX|151559494|151559583|NM_018558_exon_1_0_chrX_151559495_f|0|+
- chrX|151564643|151564711|NM_018558_exon_2_0_chrX_151564644_f||||0|+
-
-- Converting all pipe delimiters of the above file to TABs will get::
-
- chrX 151283558 151283724 NM_000808_exon_8_0_chrX_151283559_r 0 -
- chrX 151370273 151370486 NM_000808_exon_9_0_chrX_151370274_r 0 -
- chrX 151559494 151559583 NM_018558_exon_1_0_chrX_151559495_f 0 +
- chrX 151564643 151564711 NM_018558_exon_2_0_chrX_151564644_f 0 +
-
-</help>
-</tool>
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/cutWrapper.pl
--- a/tools/filters/cutWrapper.pl
+++ /dev/null
@@ -1,77 +0,0 @@
-#!/usr/bin/perl -w
-
-use strict;
-use warnings;
-
-my @columns = ();
-my $del = "";
-my @in = ();
-my @out = ();
-my $command = "";
-my $field = 0;
-
-# a wrapper for cut for use in galaxy
-# cutWrapper.pl [filename] [columns] [delim] [output]
-
-die "Check arguments\n" unless @ARGV == 4;
-
-$ARGV[1] =~ s/\s+//g;
-foreach ( split /,/, $ARGV[1] ) {
- if (m/^c\d{1,}$/i) {
- push (@columns, $_);
- $columns[@columns-1] =~s/c//ig;
- }
-}
-
-die "No columns specified, columns are not preceded with 'c', or commas are not used to separate column numbers: $ARGV[1]\n" if @columns == 0;
-
-my $column_delimiters_href = {
- 'T' => q{\t},
- 'C' => ",",
- 'D' => "-",
- 'U' => "_",
- 'P' => q{\|},
- 'Dt' => q{\.},
- 'Sp' => q{\s+}
-};
-
-$del = $column_delimiters_href->{$ARGV[2]};
-
-open (OUT, ">$ARGV[3]") or die "Cannot create $ARGV[2]:$!\n";
-open (IN, "<$ARGV[0]") or die "Cannot open $ARGV[0]:$!\n";
-
-while (my $line=<IN>) {
- if ($line =~ /^#/) {
- #Ignore comment lines
- } else {
- chop($line);
- @in = split(/$del/, $line);
- foreach $field (@columns) {
- if (defined($in[$field-1])) {
- push(@out, $in[$field-1]);
- } else {
- push(@out, ".");
- }
- }
- print OUT join("\t",@out), "\n";
- @out = ();
- }
-}
-
-#while (<IN>) {
-# chop;
-# @in = split /$del/;
-# foreach $field (@columns) {
-# if (defined($in[$field-1])) {
-# push(@out, $in[$field-1]);
-# } else {
-# push(@out, ".");
-# }
-# }
-# print OUT join("\t",@out), "\n";
-# @out = ();
-#}
-close IN;
-
-close OUT;
-
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/cutWrapper.xml
--- a/tools/filters/cutWrapper.xml
+++ /dev/null
@@ -1,202 +0,0 @@
-<tool id="Cut1" name="Cut" version="1.0.1">
- <description>columns from a table</description>
- <command interpreter="perl">cutWrapper.pl $input "$columnList" $delimiter $out_file1</command>
- <inputs>
- <param name="columnList" size="10" type="text" value="c1,c2" label="Cut columns"/>
- <param name="delimiter" type="select" label="Delimited by">
- <option value="T">Tab</option>
- <option value="Sp">Whitespace</option>
- <option value="Dt">Dot</option>
- <option value="C">Comma</option>
- <option value="D">Dash</option>
- <option value="U">Underscore</option>
- <option value="P">Pipe</option>
- </param>
- <param format="txt" name="input" type="data" label="From"/>
- </inputs>
- <outputs>
- <data format="tabular" name="out_file1" >
- <actions>
- <conditional name="delimiter">
- <when value="T">
- <conditional name="input">
- <when datatype_isinstance="interval">
- <action type="format" default="tabular">
- <option type="from_param" name="columnList" column="0" offset="0"><!-- chromCol is 1-->
-
- <filter type="insert_column" column="0" value="interval"/>
-
- <filter type="insert_column" ref="columnList" /><!-- startCol -->
-
- <filter type="insert_column" ref="columnList" /><!-- endCol -->
-
- <filter type="multiple_splitter" column="1" separator=","/>
- <filter type="column_strip" column="1"/><!-- get rid of all external whitespace -->
- <filter type="string_function" column="1" name="lower" />
- <filter type="param_value" column="1" value="^c\d{1,}$" compare="re_search" keep="True"/>
- <filter type="column_strip" column="1" strip="c"/><!-- get rid of c's -->
- <filter type="boolean" column="1" cast="int" />
-
- <filter type="multiple_splitter" column="2" separator=","/>
- <filter type="column_strip" column="2"/><!-- get rid of all external whitespace -->
- <filter type="string_function" column="2" name="lower" />
- <filter type="param_value" column="2" value="^c\d{1,}$" compare="re_search" keep="True"/>
- <filter type="column_strip" column="2" strip="c"/><!-- get rid of c's -->
- <filter type="boolean" column="2" cast="int" />
-
- <filter type="multiple_splitter" column="3" separator=","/>
- <filter type="column_strip" column="3"/><!-- get rid of all external whitespace -->
- <filter type="string_function" column="3" name="lower" />
- <filter type="param_value" column="3" value="^c\d{1,}$" compare="re_search" keep="True"/>
- <filter type="column_strip" column="3" strip="c"/><!-- get rid of c's -->
- <filter type="boolean" column="3" cast="int" />
-
- <filter type="metadata_value" ref="input" name="chromCol" column="1" />
- <filter type="metadata_value" ref="input" name="startCol" column="2" />
- <filter type="metadata_value" ref="input" name="endCol" column="3" />
-
- </option>
- </action>
-
- <conditional name="out_file1">
- <when datatype_isinstance="interval">
- <action type="metadata" name="chromCol">
- <option type="from_param" name="columnList" column="0" offset="0"><!-- chromCol is 0-->
- <filter type="multiple_splitter" column="0" separator=","/>
- <filter type="column_strip" column="0"/><!-- get rid of all external whitespace -->
- <filter type="string_function" column="0" name="lower" />
- <filter type="param_value" column="0" value="^c\d{1,}$" compare="re_search" keep="True"/>
- <filter type="column_strip" column="0" strip="c"/><!-- get rid of c's -->
- <filter type="insert_column" value="1" iterate="True" column="0"/>
- <filter type="boolean" column="1" cast="int" />
- <filter type="metadata_value" ref="input" name="chromCol" column="1" />
- </option>
- </action>
-
- <action type="metadata" name="startCol">
- <option type="from_param" name="columnList" column="0" offset="0"><!-- startCol is 0-->
- <filter type="multiple_splitter" column="0" separator=","/>
- <filter type="column_strip" column="0"/><!-- get rid of all external whitespace -->
- <filter type="string_function" column="0" name="lower" />
- <filter type="param_value" column="0" value="^c\d{1,}$" compare="re_search" keep="True"/>
- <filter type="column_strip" column="0" strip="c"/><!-- get rid of c's -->
- <filter type="insert_column" value="1" iterate="True" column="0"/>
- <filter type="boolean" column="1" cast="int" />
- <filter type="metadata_value" ref="input" name="startCol" column="1" />
- </option>
- </action>
-
- <action type="metadata" name="endCol">
- <option type="from_param" name="columnList" column="0" offset="0"><!-- endCol is 0-->
- <filter type="multiple_splitter" column="0" separator=","/>
- <filter type="column_strip" column="0"/><!-- get rid of all external whitespace -->
- <filter type="string_function" column="0" name="lower" />
- <filter type="param_value" column="0" value="^c\d{1,}$" compare="re_search" keep="True"/>
- <filter type="column_strip" column="0" strip="c"/><!-- get rid of c's -->
- <filter type="insert_column" value="1" iterate="True" column="0"/>
- <filter type="boolean" column="1" cast="int" />
- <filter type="metadata_value" ref="input" name="endCol" column="1" />
- </option>
- </action>
-
- <action type="metadata" name="nameCol" default="0">
- <option type="from_param" name="columnList" column="0" offset="0"><!-- nameCol is 0-->
- <filter type="multiple_splitter" column="0" separator=","/>
- <filter type="column_strip" column="0"/><!-- get rid of all external whitespace -->
- <filter type="string_function" column="0" name="lower" />
- <filter type="param_value" column="0" value="^c\d{1,}$" compare="re_search" keep="True"/>
- <filter type="column_strip" column="0" strip="c"/><!-- get rid of c's -->
- <filter type="insert_column" value="1" iterate="True" column="0"/>
- <filter type="boolean" column="1" cast="int" />
- <filter type="metadata_value" ref="input" name="nameCol" column="1" />
- </option>
- </action>
-
- <action type="metadata" name="strandCol" default="0">
- <option type="from_param" name="columnList" column="0" offset="0"><!-- strandCol is 0-->
- <filter type="multiple_splitter" column="0" separator=","/>
- <filter type="column_strip" column="0"/><!-- get rid of all external whitespace -->
- <filter type="string_function" column="0" name="lower" />
- <filter type="param_value" column="0" value="^c\d{1,}$" compare="re_search" keep="True"/>
- <filter type="column_strip" column="0" strip="c"/><!-- get rid of c's -->
- <filter type="insert_column" value="1" iterate="True" column="0"/>
- <filter type="boolean" column="1" cast="int" />
- <filter type="metadata_value" ref="input" name="strandCol" column="1" />
- </option>
- </action>
- </when>
- </conditional>
-
- </when>
- </conditional>
- </when>
- </conditional>
- </actions>
- </data>
- </outputs>
- <tests>
- <test>
- <param name="columnList" value="c1,c4,c2,c3"/>
- <param name="delimiter" value="T"/>
- <param name="input" value="1.bed"/>
- <output name="out_file1" file="eq-cut.dat"/>
- </test>
- </tests>
- <help>
-
-.. class:: warningmark
-
-**WARNING: This tool breaks column assignments.** To re-establish column assignments run the tools and click on the pencil icon in the latest history item.
-
-.. class:: infomark
-
-The output of this tool is always in tabular format (e.g., if your original delimiters are commas, they will be replaced with tabs). For example:
-
- Cutting columns 1 and 3 from::
-
- apple,is,good
- windows,is,bad
-
- will give::
-
- apple good
- windows bad
-
------
-
-**What it does**
-
-This tool selects (cuts out) specified columns from the dataset.
-
-- Columns are specified as **c1**, **c2**, and so on. Column count begins with **1**
-- Columns can be specified in any order (e.g., **c2,c1,c6**)
-- If you specify more columns than actually present - empty spaces will be filled with dots
-
------
-
-**Example**
-
-Input dataset (six columns: c1, c2, c3, c4, c5, and c6)::
-
- chr1 10 1000 gene1 0 +
- chr2 100 1500 gene2 0 +
-
-**cut** on columns "**c1,c4,c6**" will return::
-
- chr1 gene1 +
- chr2 gene2 +
-
-**cut** on columns "**c6,c5,c4,c1**" will return::
-
- + 0 gene1 chr1
- + 0 gene2 chr2
-
-
-**cut** on columns "**c8,c7,c4**" will return::
-
- . . gene1
- . . gene2
-
-
-</help>
-</tool>
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/fixedValueColumn.pl
--- a/tools/filters/fixedValueColumn.pl
+++ /dev/null
@@ -1,34 +0,0 @@
-#! /usr/bin/perl -w
-
-use strict;
-use warnings;
-
-# fixedValueColumn.pl $input $out_file1 "expression" "iterate [yes|no]"
-
-my ($input, $out_file1, $expression, $iterate) = @ARGV;
-my $i = 0;
-my $numeric = 0;
-
-die "Check arguments\n" unless @ARGV == 4;
-
-open (DATA, "<$input") or die "Cannot open $input:$!\n";
-open (OUT, ">$out_file1") or die "Cannot create $out_file1:$!\n";
-
-if ($expression =~ m/^\d+$/) {
- $numeric = 1;
- $i = $expression;
-}
-
-while (<DATA>) {
- chop;
- if ($iterate eq "no") {
- print OUT "$_\t$expression\n";
- } else {
- print OUT "$_\t$i\n" if $numeric == 1;
- print OUT "$_\t$expression-$i\n" if $numeric == 0;
- ++$i;
- }
-}
-
-close DATA;
-close OUT;
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/fixedValueColumn.xml
--- a/tools/filters/fixedValueColumn.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<tool id="addValue" name="Add column">
- <description>to an existing dataset</description>
- <command interpreter="perl">fixedValueColumn.pl $input $out_file1 "$exp" $iterate</command>
- <inputs>
- <param name="exp" size="20" type="text" value="1" label="Add this value"/>
- <param format="tabular" name="input" type="data" label="to Dataset" help="Dataset missing? See TIP below" />
- <param name="iterate" type="select" label="Iterate?">
- <option value="no">NO</option>
- <option value="yes">YES</option>
- </param>
- </inputs>
- <outputs>
- <data format="input" name="out_file1" metadata_source="input"/>
- </outputs>
- <tests>
- <test>
- <param name="exp" value="1"/>
- <param name="input" value="1.bed"/>
- <param name="iterate" value="no"/>
- <output name="out_file1" file="eq-addvalue.dat"/>
- </test>
- </tests>
- <help>
-
-.. class:: infomark
-
-**TIP:** If your data is not TAB delimited, use *Text Manipulation->Convert*
-
------
-
-**What it does**
-
-You can enter any value and it will be added as a new column to your dataset
-
------
-
-**Example**
-
-If you original data looks like this::
-
- chr1 10 100 geneA
- chr2 200 300 geneB
- chr2 400 500 geneC
-
-Typing **+** in the text box will generate::
-
- chr1 10 100 geneA +
- chr2 200 300 geneB +
- chr2 400 500 geneC +
-
-
-You can also add line numbers by selecting **Iterate: YES**. In this case if you enter **1** in the text box you will get::
-
- chr1 10 100 geneA 1
- chr2 200 300 geneB 2
- chr2 400 500 geneC 3
-
-
-
-</help>
-</tool>
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/headWrapper.pl
--- a/tools/filters/headWrapper.pl
+++ /dev/null
@@ -1,19 +0,0 @@
-#! /usr/bin/perl -w
-
-use strict;
-use warnings;
-
-# a wrapper for head for use in galaxy
-# headWrapper.pl [filename] [# lines to show] [output]
-
-die "Check arguments" unless @ARGV == 3;
-die "Line number must be an integer\n" unless $ARGV[1]=~ m/^\d+$/;
-
-open (OUT, ">$ARGV[2]") or die "Cannot create $ARGV[2]:$!\n";
-open (HEAD, "head -n $ARGV[1] $ARGV[0]|") or die "Cannot run head:$!\n";
-while (<HEAD>) {
- print OUT;
-}
-close OUT;
-close HEAD;
-
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/headWrapper.xml
--- a/tools/filters/headWrapper.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<tool id="Show beginning1" name="Select first">
- <description>lines from a dataset</description>
- <command interpreter="perl">headWrapper.pl $input $lineNum $out_file1</command>
- <inputs>
- <param name="lineNum" size="5" type="integer" value="10" label="Select first" help="lines"/>
- <param format="txt" name="input" type="data" label="from"/>
- </inputs>
- <outputs>
- <data format="input" name="out_file1" metadata_source="input"/>
- </outputs>
- <tests>
- <test>
- <param name="lineNum" value="10"/>
- <param name="input" value="1.bed"/>
- <output name="out_file1" file="eq-showbeginning.dat"/>
- </test>
- </tests>
- <help>
-
-**What it does**
-
-This tool outputs specified number of lines from the **beginning** of a dataset
-
------
-
-**Example**
-
-Selecting 2 lines from this::
-
- chr7 56632 56652 D17003_CTCF_R6 310 +
- chr7 56736 56756 D17003_CTCF_R7 354 +
- chr7 56761 56781 D17003_CTCF_R4 220 +
- chr7 56772 56792 D17003_CTCF_R7 372 +
- chr7 56775 56795 D17003_CTCF_R4 207 +
-
-will produce::
-
- chr7 56632 56652 D17003_CTCF_R6 310 +
- chr7 56736 56756 D17003_CTCF_R7 354 +
-
- </help>
-</tool>
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/mergeCols.py
--- a/tools/filters/mergeCols.py
+++ /dev/null
@@ -1,37 +0,0 @@
-import sys, re
-
-def stop_err( msg ):
- sys.stderr.write( msg )
- sys.exit()
-
-def __main__():
- try:
- infile = open ( sys.argv[1], 'r')
- outfile = open ( sys.argv[2], 'w')
- except:
- stop_err( 'Cannot open or create a file\n' )
-
- if len( sys.argv ) < 4:
- stop_err( 'No columns to merge' )
- else:
- cols = sys.argv[3:]
-
- skipped_lines = 0
-
- for line in infile:
- line = line.rstrip( '\r\n' )
- if line and not line.startswith( '#' ):
- fields = line.split( '\t' )
- line += '\t'
- for col in cols:
- try:
- line += fields[ int( col ) -1 ]
- except:
- skipped_lines += 1
-
- print >>outfile, line
-
- if skipped_lines > 0:
- print 'Skipped %d invalid lines' % skipped_lines
-
-if __name__ == "__main__" : __main__()
\ No newline at end of file
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/mergeCols.xml
--- a/tools/filters/mergeCols.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<tool id="mergeCols1" name="Merge Columns" version="1.0.1">
- <description>together</description>
- <command interpreter="python">
- mergeCols.py
- $input1
- $out_file1
- $col1
- $col2
- #for $col in $columns
- ${col.datacol}
- #end for
- </command>
- <inputs>
- <param format="tabular" name="input1" type="data" label="Select data" help="Dataset missing? See TIP below."/>
- <param name="col1" label="Merge column" type="data_column" data_ref="input1" />
- <param name="col2" label="with column" type="data_column" data_ref="input1" help="Need to add more columns? Use controls below."/>
- <repeat name="columns" title="Columns">
- <param name="datacol" label="Add column" type="data_column" data_ref="input1" />
- </repeat>
- </inputs>
- <outputs>
- <data format="tabular" name="out_file1" />
- </outputs>
- <tests>
- <test>
- <param name="input1" value="1.bed"/>
- <param name="col1" value="4" />
- <param name="col2" value="1" />
- <param name="datacol" value="6" />
- <output name="out_file1" file="mergeCols.dat"/>
- </test>
- </tests>
-<help>
-
-.. class:: infomark
-
-**TIP:** If your data is not TAB delimited, use *Text Manipulation->Convert*
-
------
-
-**What it does**
-
-This tool merges columns together. Any number of valid columns can be merged in any order.
-
------
-
-**Example**
-
-Input dataset (five columns: c1, c2, c3, c4, and c5)::
-
- 1 10 1000 gene1 chr
- 2 100 1500 gene2 chr
-
-merging columns "**c5,c1**" will return::
-
- 1 10 1000 gene1 chr chr1
- 2 100 1500 gene2 chr chr2
-
-.. class:: warningmark
-
-Note that all original columns are preserved and the result of merge is added as the rightmost column.
- </help>
-</tool>
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/remove_beginning.pl
--- a/tools/filters/remove_beginning.pl
+++ /dev/null
@@ -1,33 +0,0 @@
-#! /usr/bin/perl -w
-
-use strict;
-use warnings;
-
-# Removes the specified number of lines from the beginning of the file.
-# remove_beginning.pl [input] [num_lines] [output]
-
-die "Check arguments" unless @ARGV == 3;
-
-my $inputfile = $ARGV[0];
-my $num_lines = $ARGV[1];
-my $outputfile = $ARGV[2];
-
-my $curCount=0;
-
-my $fhIn;
-open ($fhIn, "< $inputfile") or die "Cannot open source file";
-
-my $fhOut;
-open ($fhOut, "> $outputfile");
-
-while (<$fhIn>)
-{
- $curCount++;
- if ($curCount<=$num_lines)
- {
- next;
- }
- print $fhOut $_;
-}
-close ($fhIn) or die "Cannot close source file";
-close ($fhOut) or die "Cannot close output file";
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/remove_beginning.xml
--- a/tools/filters/remove_beginning.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<tool id="Remove beginning1" name="Remove beginning">
- <description>of a file</description>
- <command interpreter="perl">remove_beginning.pl $input $num_lines $out_file1</command>
- <inputs>
- <param name="num_lines" size="5" type="integer" value="1" label="Remove first" help="lines"/>
- <param format="txt" name="input" type="data" label="from"/>
- </inputs>
- <outputs>
- <data format="input" name="out_file1" metadata_source="input"/>
- </outputs>
- <tests>
- <test>
- <param name="num_lines" value="5"/>
- <param name="input" value="1.bed"/>
- <output name="out_file1" file="eq-removebeginning.dat"/>
- </test>
- </tests>
- <help>
-
-**What it does**
-
-This tool removes a specified number of lines from the beginning of a dataset.
-
------
-
-**Example**
-
-Input File::
-
- chr7 56632 56652 D17003_CTCF_R6 310 +
- chr7 56736 56756 D17003_CTCF_R7 354 +
- chr7 56761 56781 D17003_CTCF_R4 220 +
- chr7 56772 56792 D17003_CTCF_R7 372 +
- chr7 56775 56795 D17003_CTCF_R4 207 +
-
-After removing the first 3 lines the dataset will look like this::
-
- chr7 56772 56792 D17003_CTCF_R7 372 +
- chr7 56775 56795 D17003_CTCF_R4 207 +
-
-</help>
-</tool>
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/tailWrapper.pl
--- a/tools/filters/tailWrapper.pl
+++ /dev/null
@@ -1,19 +0,0 @@
-#! /usr/bin/perl -w
-
-use strict;
-use warnings;
-
-# a wrapper for tail for use in galaxy
-# lessWrapper.pl [filename] [# lines to show] [output]
-
-die "Check arguments" unless @ARGV == 3;
-die "Line number should be an integer\n" unless $ARGV[1]=~ m/^\d+$/;
-
-open (OUT, ">$ARGV[2]") or die "Cannot create $ARGV[2]:$!\n";
-open (TAIL, "tail -n $ARGV[1] $ARGV[0]|") or die "Cannot run tail:$!\n";
-while (<TAIL>) {
- print OUT;
-}
-close OUT;
-close TAIL;
-
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/tailWrapper.xml
--- a/tools/filters/tailWrapper.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<tool id="Show tail1" name="Select last">
- <description>lines from a dataset</description>
- <command interpreter="perl">tailWrapper.pl $input $lineNum $out_file1</command>
- <inputs>
- <param name="lineNum" size="5" type="integer" value="10" label="Select last" help="lines"/>
- <param format="txt" name="input" type="data" label="from"/>
- </inputs>
- <outputs>
- <data format="input" name="out_file1" metadata_source="input"/>
- </outputs>
- <tests>
- <test>
- <param name="lineNum" value="10"/>
- <param name="input" value="1.bed"/>
- <output name="out_file1" file="eq-showtail.dat"/>
- </test>
- </tests>
- <help>
-
-**What it does**
-
-This tool outputs specified number of lines from the **end** of a dataset
-
------
-
-**Example**
-
-- Input File::
-
- chr7 57134 57154 D17003_CTCF_R7 356 -
- chr7 57247 57267 D17003_CTCF_R4 207 +
- chr7 57314 57334 D17003_CTCF_R5 269 +
- chr7 57341 57361 D17003_CTCF_R7 375 +
- chr7 57457 57477 D17003_CTCF_R3 188 +
-
-- Show last two lines of above file. The result is::
-
- chr7 57341 57361 D17003_CTCF_R7 375 +
- chr7 57457 57477 D17003_CTCF_R3 188 +
-
- </help>
-</tool>
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/trimmer.py
--- a/tools/filters/trimmer.py
+++ /dev/null
@@ -1,106 +0,0 @@
-#!/usr/bin/env python
-
-import sys
-import optparse
-
-def stop_err( msg ):
- sys.stderr.write( msg )
- sys.exit()
-
-def main():
- usage = """%prog [options]
-
-options (listed below) default to 'None' if omitted
- """
- parser = optparse.OptionParser(usage=usage)
-
- parser.add_option(
- '-a','--ascii',
- dest='ascii',
- action='store_true',
- default = False,
- help='Use ascii codes to defined ignored beginnings instead of raw characters')
-
- parser.add_option(
- '-q','--fastq',
- dest='fastq',
- action='store_true',
- default = False,
- help='The input data in fastq format. It selected the script skips every even line since they contain sequence ids')
-
- parser.add_option(
- '-i','--ignore',
- dest='ignore',
- help='A comma separated list on ignored beginnings (e.g., ">,@"), or its ascii codes (e.g., "60,42") if option -a is enabled')
-
- parser.add_option(
- '-s','--start',
- dest='start',
- default = '0',
- help='Trim from beginning to here (1-based)')
-
- parser.add_option(
- '-e','--end',
- dest='end',
- default = '0',
- help='Trim from here to the ned (1-based)')
-
- parser.add_option(
- '-f','--file',
- dest='input_txt',
- default = False,
- help='Name of file to be chopped. STDIN is default')
-
- parser.add_option(
- '-c','--column',
- dest='col',
- default = '0',
- help='Column to chop. If 0 = chop the whole line')
-
-
- options, args = parser.parse_args()
- invalid_starts = []
-
- if options.input_txt:
- infile = open ( options.input_txt, 'r')
- else:
- infile = sys.stdin
-
- if options.ignore and options.ignore != "None":
- invalid_starts = options.ignore.split(',')
-
- if options.ascii and options.ignore and options.ignore != "None":
- for i, item in enumerate( invalid_starts ):
- invalid_starts[i] = chr( int( item ) )
-
- col = int( options.col )
-
- for i, line in enumerate( infile ):
- line = line.rstrip( '\r\n' )
- if line:
-
- if options.fastq and i % 2 == 0:
- print line
- continue
-
-
- if line[0] not in invalid_starts:
- if col == 0:
- if int( options.end ) > 0:
- line = line[ int( options.start )-1 : int( options.end ) ]
- else:
- line = line[ int( options.start )-1 : ]
- else:
- fields = line.split( '\t' )
- if col-1 > len( fields ):
- stop_err('Column %d does not exist. Check input parameters\n' % col)
-
- if int( options.end ) > 0:
- fields[col - 1] = fields[col - 1][ int( options.start )-1 : int( options.end ) ]
- else:
- fields[col - 1] = fields[col - 1][ int( options.start )-1 : ]
- line = '\t'.join(fields)
- print line
-
-if __name__ == "__main__": main()
-
diff -r 63fc9cbe381d2719134f87c019911565e3a934a1 -r c68762fcb5a521007d89cb01455a0ad409011528 tools/filters/trimmer.xml
--- a/tools/filters/trimmer.xml
+++ /dev/null
@@ -1,120 +0,0 @@
-<tool id="trimmer" name="Trim" version="0.0.1">
- <description>leading or trailing characters</description>
- <command interpreter="python">
- trimmer.py -a -f $input1 -c $col -s $start -e $end -i $ignore $fastq > $out_file1
- </command>
- <inputs>
- <param format="tabular,txt" name="input1" type="data" label="this dataset"/>
- <param name="col" type="integer" value="0" label="Trim this column only" help="0 = process entire line" />
- <param name="start" type="integer" size="10" value="1" label="Trim from the beginning to this position" help="1 = do not trim the beginning"/>
- <param name="end" type="integer" size="10" value="0" label="Remove everything from this position to the end" help="0 = do not trim the end"/>
- <param name="fastq" type="select" label="Is input dataset in fastq format?" help="If set to YES, the tool will not trim evenly numbered lines (0, 2, 4, etc...)">
- <option selected="true" value="">No</option>
- <option value="-q">Yes</option>
- </param>
- <param name="ignore" type="select" display="checkboxes" multiple="True" label="Ignore lines beginning with these characters" help="lines beginning with these are not trimmed">
- <option value="62">></option>
- <option value="64">@</option>
- <option value="43">+</option>
- <option value="60"><</option>
- <option value="42">*</option>
- <option value="45">-</option>
- <option value="61">=</option>
- <option value="124">|</option>
- <option value="63">?</option>
- <option value="36">$</option>
- <option value="46">.</option>
- <option value="58">:</option>
- <option value="38">&</option>
- <option value="37">%</option>
- <option value="94">^</option>
- <option value="35">#</option>
- </param>
- </inputs>
- <outputs>
- <data name="out_file1" format="input" metadata_source="input1"/>
- </outputs>
- <tests>
- <test>
- <param name="input1" value="trimmer_tab_delimited.dat"/>
- <param name="col" value="0"/>
- <param name="start" value="1"/>
- <param name="end" value="13"/>
- <param name="ignore" value="62"/>
- <param name="fastq" value="No"/>
- <output name="out_file1" file="trimmer_a_f_c0_s1_e13_i62.dat"/>
- </test>
- <test>
- <param name="input1" value="trimmer_tab_delimited.dat"/>
- <param name="col" value="2"/>
- <param name="start" value="1"/>
- <param name="end" value="2"/>
- <param name="ignore" value="62"/>
- <param name="fastq" value="No"/>
- <output name="out_file1" file="trimmer_a_f_c2_s1_e2_i62.dat"/>
- </test>
-
- </tests>
-
- <help>
-
-
-**What it does**
-
-Trims specified number of characters from a dataset or its field (if dataset is tab-delimited).
-
------
-
-**Example 1**
-
-Trimming this dataset::
-
- 1234567890
- abcdefghijk
-
-by setting **Trim from the beginning to this position** to *2* and **Remove everything from this position to the end** to *6* will produce::
-
- 23456
- bcdef
-
------
-
-**Example 2**
-
-Trimming column 2 of this dataset::
-
- abcde 12345 fghij 67890
- fghij 67890 abcde 12345
-
-by setting **Trim content of this column only** to *2*, **Trim from the beginning to this position** to *2*, and **Remove everything from this position to the end** to *4* will produce::
-
- abcde 234 fghij 67890
- fghij 789 abcde 12345
-
------
-
-**Trimming FASTQ datasets**
-
-This tool can be used to trim sequences and quality strings in fastq datasets. This is done by selected *Yes* from the **Is input dataset in fastq format?** dropdown. If set to *Yes*, the tool will skip all even numbered lines (see warning below). For example, trimming last 5 bases of this dataset::
-
- @081017-and-081020:1:1:1715:1759
- GGACTCAGATAGTAATCCACGCTCCTTTAAAATATC
- +
- II#IIIIIII$5+.(9IIIIIII$%*$G$A31I&&B
-
-cab done by setting **Remove everything from this position to the end** to 31::
-
- @081017-and-081020:1:1:1715:1759
- GGACTCAGATAGTAATCCACGCTCCTTTAAA
- +
- II#IIIIIII$5+.(9IIIIIII$%*$G$A3
-
-**Note** that headers are skipped.
-
-.. class:: warningmark
-
-**WARNING:** This tool will only work on properly formatted fastq datasets where (1) each read and quality string occupy one line and (2) '@' (read header) and "+" (quality header) lines are evenly numbered like in the above example.
-
-
- </help>
-</tool>
https://bitbucket.org/galaxy/galaxy-central/changeset/2f45da781f92/
changeset: 2f45da781f92
user: inithello
date: 2012-12-07 22:08:58
summary: Remove migrated tools from Galaxy main tool configuration.
affected #: 1 file
diff -r c68762fcb5a521007d89cb01455a0ad409011528 -r 2f45da781f926f667dd90ad23d23fd123716a535 tool_conf.xml.main
--- a/tool_conf.xml.main
+++ b/tool_conf.xml.main
@@ -33,21 +33,11 @@
<tool file="extract/liftOver_wrapper.xml" /></section><section name="Text Manipulation" id="textutil">
- <tool file="filters/fixedValueColumn.xml" /><tool file="stats/column_maker.xml" /><tool file="filters/catWrapper.xml" />
- <tool file="filters/condense_characters.xml" />
- <tool file="filters/convert_characters.xml" />
- <tool file="filters/mergeCols.xml" /><tool file="filters/CreateInterval.xml" />
- <tool file="filters/cutWrapper.xml" />
- <tool file="filters/changeCase.xml" /><tool file="filters/pasteWrapper.xml" />
- <tool file="filters/remove_beginning.xml" /><tool file="filters/randomlines.xml" />
- <tool file="filters/headWrapper.xml" />
- <tool file="filters/tailWrapper.xml" />
- <tool file="filters/trimmer.xml" /><tool file="filters/wc_gnu.xml" /><tool file="filters/secure_hash_message_digest.xml" /></section>
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 and popupmenu: various fixes for IE
by Bitbucket 07 Dec '12
by Bitbucket 07 Dec '12
07 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/63fc9cbe381d/
changeset: 63fc9cbe381d
user: carlfeberhard
date: 2012-12-07 22:02:21
summary: history panel and popupmenu: various fixes for IE
affected #: 3 files
diff -r b516a3fb0fc102c1b0b527f072e86a4afc74679e -r 63fc9cbe381d2719134f87c019911565e3a934a1 templates/base.mako
--- a/templates/base.mako
+++ b/templates/base.mako
@@ -54,7 +54,7 @@
info : function(){},
warn : function(){},
error : function(){},
- assert : function(){},
+ assert : function(){}
};
// Set up needed paths.
diff -r b516a3fb0fc102c1b0b527f072e86a4afc74679e -r 63fc9cbe381d2719134f87c019911565e3a934a1 templates/base/base_panels.mako
--- a/templates/base/base_panels.mako
+++ b/templates/base/base_panels.mako
@@ -75,7 +75,7 @@
info : function(){},
warn : function(){},
error : function(){},
- assert : function(){},
+ assert : function(){}
};
// Set up needed paths.
diff -r b516a3fb0fc102c1b0b527f072e86a4afc74679e -r 63fc9cbe381d2719134f87c019911565e3a934a1 templates/root/alternate_history.mako
--- a/templates/root/alternate_history.mako
+++ b/templates/root/alternate_history.mako
@@ -287,7 +287,7 @@
top.Galaxy.currUser = top.Galaxy.currUser;
top.Galaxy.currHistoryPanel = top.Galaxy.currHistoryPanel;
- top.Galaxy.paths = galaxy_paths;
+ //top.Galaxy.paths = galaxy_paths;
top.Galaxy.localization = GalaxyLocalization;
window.Galaxy = top.Galaxy;
@@ -297,12 +297,13 @@
GalaxyLocalization.setLocalizedString( ${ create_localization_json( get_page_localized_strings() ) } );
// add needed controller urls to GalaxyPaths
+if( !galaxy_paths ){ galaxy_paths = top.galaxy_paths || new GalaxyPaths(); }
galaxy_paths.set( 'hda', ${get_hda_url_templates()} );
galaxy_paths.set( 'history', ${get_history_url_templates()} );
$(function(){
galaxyPageSetUp();
- Galaxy.historyFrame = window;
+ //Galaxy.historyFrame = window;
var debugging = ( new PersistantStorage( '__history_panel' ).get( 'debugging' ) || false );
@@ -387,6 +388,7 @@
}
// lots of wtf here...due to infernalframes
+ //TODO: this is way tooo acrobatic
var $historyButtonWindow = $( top.document ),
HISTORY_MENU_BUTTON_ID = 'history-options-button',
$historyMenuButton = $historyButtonWindow.find( '#' + HISTORY_MENU_BUTTON_ID ),
@@ -410,44 +412,50 @@
// since the history frame reloads so often (compared to the main window),
// we need to check whether these options are there already before we add them again
- //NOTE: we use the global here because these remain bound in the main window even if panel refreshes
+ // In IE, however, NOT re-adding them creates a 'cant execute from freed script' error:
+ // so...we need to re-add the function in either case (just not the option itself)
+ //NOTE: we use the global Galaxy.currHistoryPanel here
+ // because these remain bound in the main window even if panel refreshes
//TODO: too much boilerplate
- if( popupMenu.findIndexByHtml( COLLAPSE_OPTION_TEXT ) === null ){
- popupMenu.addItem({
- html : COLLAPSE_OPTION_TEXT,
- func : function() {
- Galaxy.currHistoryPanel.collapseAllHdaBodies();
- }
- }, START_INSERTING_AT_INDEX )
+ //TODO: ugh...(in general)
+ var collapseOption = popupMenu.findItemByHtml( COLLAPSE_OPTION_TEXT );
+ if( !collapseOption ){
+ collapseOption = {
+ html : COLLAPSE_OPTION_TEXT
+ };
+ popupMenu.addItem( collapseOption, START_INSERTING_AT_INDEX )
}
+ collapseOption.func = function() {
+ Galaxy.currHistoryPanel.collapseAllHdaBodies();
+ };
- var deletedOptionIndex = popupMenu.findIndexByHtml( DELETED_OPTION_TEXT );
- if( deletedOptionIndex === null ){
- popupMenu.addItem({
- html : DELETED_OPTION_TEXT,
- func : function( clickEvent, thisMenuOption ){
- var show_deleted = Galaxy.currHistoryPanel.toggleShowDeleted();
- thisMenuOption.checked = show_deleted;
- }
- }, START_INSERTING_AT_INDEX + 1 )
- deletedOptionIndex = START_INSERTING_AT_INDEX + 1;
+ var deletedOption = popupMenu.findItemByHtml( DELETED_OPTION_TEXT );
+ if( !deletedOption ){
+ deletedOption = {
+ html : DELETED_OPTION_TEXT
+ };
+ popupMenu.addItem( deletedOption, START_INSERTING_AT_INDEX + 1 )
}
+ deletedOption.func = function( clickEvent, thisMenuOption ){
+ var show_deleted = Galaxy.currHistoryPanel.toggleShowDeleted();
+ thisMenuOption.checked = show_deleted;
+ };
// whether was there or added, update the checked option to reflect the panel's settings on the panel render
- popupMenu.options[ deletedOptionIndex ].checked = Galaxy.currHistoryPanel.storage.get( 'show_deleted' );
+ deletedOption.checked = Galaxy.currHistoryPanel.storage.get( 'show_deleted' );
- var hiddenOptionIndex = popupMenu.findIndexByHtml( HIDDEN_OPTION_TEXT );
- if( hiddenOptionIndex === null ){
- popupMenu.addItem({
- html : HIDDEN_OPTION_TEXT,
- func : function( clickEvent, thisMenuOption ){
- var show_hidden = Galaxy.currHistoryPanel.toggleShowHidden();
- thisMenuOption.checked = show_hidden;
- }
- }, START_INSERTING_AT_INDEX + 2 )
- hiddenOptionIndex = START_INSERTING_AT_INDEX + 2;
+ var hiddenOption = popupMenu.findItemByHtml( HIDDEN_OPTION_TEXT );
+ if( !hiddenOption ){
+ hiddenOption = {
+ html : HIDDEN_OPTION_TEXT
+ };
+ popupMenu.addItem( hiddenOption, START_INSERTING_AT_INDEX + 2 )
}
+ hiddenOption.func = function( clickEvent, thisMenuOption ){
+ var show_hidden = Galaxy.currHistoryPanel.toggleShowHidden();
+ thisMenuOption.checked = show_hidden;
+ };
// whether was there or added, update the checked option to reflect the panel's settings on the panel render
- popupMenu.options[ hiddenOptionIndex ].checked = Galaxy.currHistoryPanel.storage.get( 'show_hidden' );
+ hiddenOption.checked = Galaxy.currHistoryPanel.storage.get( 'show_hidden' );
})();
//TODO: both the quota meter and the options-menu stuff need to be moved out when iframes are removed
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/b516a3fb0fc1/
changeset: b516a3fb0fc1
user: carlfeberhard
date: 2012-12-07 20:36:44
summary: pack_scripts
affected #: 1 file
diff -r 9c90d4c2f4ccfa6303b127a51c27bd2e57402594 -r b516a3fb0fc102c1b0b527f072e86a4afc74679e static/scripts/packed/mvc/ui.js
--- a/static/scripts/packed/mvc/ui.js
+++ b/static/scripts/packed/mvc/ui.js
@@ -1,1 +1,1 @@
-var IconButton=Backbone.Model.extend({defaults:{title:"",icon_class:"",on_click:null,menu_options:null,tooltip_config:{},isMenuButton:true,id:null,href:null,target:null,enabled:true,visible:true}});var IconButtonView=Backbone.View.extend({initialize:function(){this.model.attributes.tooltip_config={placement:"bottom"};this.model.bind("change",this.render,this)},render:function(){this.$el.tooltip("hide");var a=$(Handlebars.partials.iconButton(this.model.toJSON()));a.tooltip(this.model.get("tooltip_config"));this.$el.replaceWith(a);this.setElement(a);return this},events:{click:"click"},click:function(a){if(this.model.attributes.on_click){this.model.attributes.on_click(a);return false}return true}});IconButtonView.templates={iconButton:Handlebars.partials.iconButton};var IconButtonCollection=Backbone.Collection.extend({model:IconButton});var IconButtonMenuView=Backbone.View.extend({tagName:"div",initialize:function(){this.render()},render:function(){var a=this;this.collection.each(function(d){var b=$("<a/>").attr("href","javascript:void(0)").attr("title",d.attributes.title).addClass("icon-button menu-button").addClass(d.attributes.icon_class).appendTo(a.$el).click(d.attributes.on_click);if(d.attributes.tooltip_config){b.tooltip(d.attributes.tooltip_config)}var c=d.get("options");if(c){make_popupmenu(b,c)}});return this}});var create_icon_buttons_menu=function(b,a){if(!a){a={}}var c=new IconButtonCollection(_.map(b,function(d){return new IconButton(_.extend(d,a))}));return new IconButtonMenuView({collection:c})};var Grid=Backbone.Collection.extend({});var GridView=Backbone.View.extend({});var GalaxyPaths=Backbone.Model.extend({defaults:{root_path:"",image_path:""}});var PopupMenu=Backbone.View.extend({initialize:function(b,a){this.$button=b||$("<div/>");this.options=a||[];var c=this;this.$button.click(function(d){c._renderAndShow(d);return false});this.$button.data("PopupMenu",this);if(!this.templates.wrapper){this.templates.wrapper=Handlebars.templates["template-popupmenu-wrapper"]}},render:function(){var a=this;this.$el.addClass("popmenu-wrapper").css({position:"absolute",display:"none"});this.$el.html(PopupMenu.templates.menu({options:this.options,id:this.$button.attr("id")}));if(this.options.length){this.$el.find("li").each(function(c,b){var f=$(b),e=f.children("a.popupmenu-option"),d=a.options[c].func;if(e.length&&d){e.click(function(g){d(g,a.options[c])})}a.options[c].$li=f})}return this},_getShownPosition:function(b){var c=this.$el.width(),a=b.pageX-c/2;a=Math.min(a,$(document).scrollLeft()+$(window).width()-c-5);a=Math.max(a,$(document).scrollLeft()+5);return{top:b.pageY,left:a}},_renderAndShow:function(a){this.render();this.$el.appendTo("body");this.$el.css(this._getShownPosition(a));this._setUpCloseBehavior();this.$el.show()},_setUpCloseBehavior:function(){var b=this,a=function(c){c.bind("click.close_popup",function(){b.remove();c.unbind("click.close_popup")})};a($(window.document));a($(window.top.document));_.each(window.top.frames,function(c){a($(c.document))})},addItem:function(b,a){a=(a>=0)?(a):(this.options.length);this.options.splice(a,0,b);return this},removeItem:function(a){if(a>=0){this.options.splice(a,1)}return this},findIndexByHtml:function(b){for(var a=0;a<this.options.length;a++){if((_.has(this.options[a],"html"))&&(this.options[a].html===b)){return a}}return null},findItemByHtml:function(a){return this.options[(this.findIndexByHtml(a))]},toString:function(){return"PopupMenu"}});PopupMenu.templates={menu:Handlebars.templates["template-popupmenu-menu"]};PopupMenu.make_popupmenu=function(b,c){var a=[];_.each(c,function(f,d){var e={html:d};if(f===null){e.header=true}else{if(jQuery.type(f)==="function"){e.func=f}}a.push(e)});return new PopupMenu($(b),a)};PopupMenu.convertLinksToOptions=function(c,a){c=$(c);a=a||"a";var b=[];c.find(a).each(function(g,e){var f={},d=$(g);f.html=d.text();if(j){var j=d.attr("href"),k=d.attr("target"),h=d.attr("confirm");f.func=function(){if((h)&&(!confirm(h))){return}var i;switch(k){case"_parent":window.parent.location=j;break;case"_top":window.top.location=j;break;case"demo":if(i===undefined||i.closed){i=window.open(j,k);i.creator=self}break;default:window.location=j}}}b.push(f)});return b};PopupMenu.fromExistingDom=function(d,c,a){d=$(d);c=$(c);var b=PopupMenu.convertLinksToOptions(c,a);c.remove();return new PopupMenu(d,b)};PopupMenu.make_popup_menus=function(c,b,d){c=c||document;b=b||"div[popupmenu]";d=d||function(e,f){return"#"+e.attr("popupmenu")};var a=[];$(c).find(b).each(function(){var e=$(this),f=$(c).find(d(e,c));a.push(PopupMenu.fromDom(f,e));f.addClass("popup")});return a};
\ No newline at end of file
+var IconButton=Backbone.Model.extend({defaults:{title:"",icon_class:"",on_click:null,menu_options:null,tooltip_config:{},isMenuButton:true,id:null,href:null,target:null,enabled:true,visible:true}});var IconButtonView=Backbone.View.extend({initialize:function(){this.model.attributes.tooltip_config={placement:"bottom"};this.model.bind("change",this.render,this)},render:function(){this.$el.tooltip("hide");var a=$(Handlebars.partials.iconButton(this.model.toJSON()));a.tooltip(this.model.get("tooltip_config"));this.$el.replaceWith(a);this.setElement(a);return this},events:{click:"click"},click:function(a){if(this.model.attributes.on_click){this.model.attributes.on_click(a);return false}return true}});IconButtonView.templates={iconButton:Handlebars.partials.iconButton};var IconButtonCollection=Backbone.Collection.extend({model:IconButton});var IconButtonMenuView=Backbone.View.extend({tagName:"div",initialize:function(){this.render()},render:function(){var a=this;this.collection.each(function(d){var b=$("<a/>").attr("href","javascript:void(0)").attr("title",d.attributes.title).addClass("icon-button menu-button").addClass(d.attributes.icon_class).appendTo(a.$el).click(d.attributes.on_click);if(d.attributes.tooltip_config){b.tooltip(d.attributes.tooltip_config)}var c=d.get("options");if(c){make_popupmenu(b,c)}});return this}});var create_icon_buttons_menu=function(b,a){if(!a){a={}}var c=new IconButtonCollection(_.map(b,function(d){return new IconButton(_.extend(d,a))}));return new IconButtonMenuView({collection:c})};var Grid=Backbone.Collection.extend({});var GridView=Backbone.View.extend({});var GalaxyPaths=Backbone.Model.extend({defaults:{root_path:"",image_path:""}});var PopupMenu=Backbone.View.extend({initialize:function(b,a){this.$button=b||$("<div/>");this.options=a||[];var c=this;this.$button.click(function(d){c._renderAndShow(d);return false});this.$button.data("PopupMenu",this)},render:function(){var a=this;this.$el.addClass("popmenu-wrapper").css({position:"absolute",display:"none"});this.$el.html(PopupMenu.templates.menu({options:this.options,id:this.$button.attr("id")}));if(this.options.length){this.$el.find("li").each(function(c,b){var f=$(b),e=f.children("a.popupmenu-option"),d=a.options[c].func;if(e.length&&d){e.click(function(g){d(g,a.options[c])})}a.options[c].$li=f})}return this},_getShownPosition:function(b){var c=this.$el.width(),a=b.pageX-c/2;a=Math.min(a,$(document).scrollLeft()+$(window).width()-c-5);a=Math.max(a,$(document).scrollLeft()+5);return{top:b.pageY,left:a}},_renderAndShow:function(a){this.render();this.$el.appendTo("body");this.$el.css(this._getShownPosition(a));this._setUpCloseBehavior();this.$el.show()},_setUpCloseBehavior:function(){var b=this,a=function(c){c.bind("click.close_popup",function(){b.remove();c.unbind("click.close_popup")})};a($(window.document));a($(window.top.document));_.each(window.top.frames,function(c){a($(c.document))})},addItem:function(b,a){a=(a>=0)?(a):(this.options.length);this.options.splice(a,0,b);return this},removeItem:function(a){if(a>=0){this.options.splice(a,1)}return this},findIndexByHtml:function(b){for(var a=0;a<this.options.length;a++){if((_.has(this.options[a],"html"))&&(this.options[a].html===b)){return a}}return null},findItemByHtml:function(a){return this.options[(this.findIndexByHtml(a))]},toString:function(){return"PopupMenu"}});PopupMenu.templates={menu:Handlebars.templates["template-popupmenu-menu"]};PopupMenu.make_popupmenu=function(b,c){var a=[];_.each(c,function(f,d){var e={html:d};if(f===null){e.header=true}else{if(jQuery.type(f)==="function"){e.func=f}}a.push(e)});return new PopupMenu($(b),a)};PopupMenu.convertLinksToOptions=function(c,a){c=$(c);a=a||"a";var b=[];c.find(a).each(function(g,e){var f={},d=$(g);f.html=d.text();if(j){var j=d.attr("href"),k=d.attr("target"),h=d.attr("confirm");f.func=function(){if((h)&&(!confirm(h))){return}var i;switch(k){case"_parent":window.parent.location=j;break;case"_top":window.top.location=j;break;case"demo":if(i===undefined||i.closed){i=window.open(j,k);i.creator=self}break;default:window.location=j}}}b.push(f)});return b};PopupMenu.fromExistingDom=function(d,c,a){d=$(d);c=$(c);var b=PopupMenu.convertLinksToOptions(c,a);c.remove();return new PopupMenu(d,b)};PopupMenu.make_popup_menus=function(c,b,d){c=c||document;b=b||"div[popupmenu]";d=d||function(e,f){return"#"+e.attr("popupmenu")};var a=[];$(c).find(b).each(function(){var e=$(this),f=$(c).find(d(e,c));a.push(PopupMenu.fromDom(f,e));f.addClass("popup")});return a};
\ 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
07 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/9c90d4c2f4cc/
changeset: 9c90d4c2f4cc
user: carlfeberhard
date: 2012-12-07 20:13:25
summary: ui.js: fix to bad template reference
affected #: 1 file
diff -r cba8dbdb8312dcfa93e0be299fb560c067266064 -r 9c90d4c2f4ccfa6303b127a51c27bd2e57402594 static/scripts/mvc/ui.js
--- a/static/scripts/mvc/ui.js
+++ b/static/scripts/mvc/ui.js
@@ -205,9 +205,6 @@
// template loading is problematic - ui is loaded in base.mako
// and the template (prev.) needed to be loaded before ui
- if( !this.templates.wrapper ){
- this.templates.wrapper = Handlebars.templates[ 'template-popupmenu-wrapper' ];
- }
},
/** Render the menu. NOTE: doesn't attach itself to the DOM.
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/6d7e637883b7/
changeset: 6d7e637883b7
user: carlfeberhard
date: 2012-12-07 19:56:53
summary: ui: adding PopupMenu view as alternate to make_popup_menu and allow changing option text, adding/removing options, and adding checkmarks for togglable options; index.mako: use PopupMenu for history-options-button; history panel: use alternate_history.mako to add 'collapse all', 'Include hidden datasets'(toggle), 'Include deleted datasets'(toggle) to history-options-button; alternate_history.mako: include better system for debugging js when changing source directly is problematic (main/test); pack_scripts;
affected #: 19 files
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 lib/galaxy/webapps/galaxy/controllers/root.py
--- a/lib/galaxy/webapps/galaxy/controllers/root.py
+++ b/lib/galaxy/webapps/galaxy/controllers/root.py
@@ -98,7 +98,6 @@
return trans.fill_template_mako( "/my_data.mako" )
@web.expose
- #def history( self, trans, as_xml=False, show_deleted=False, show_hidden=False, hda_id=None, **kwd ):
def history( self, trans, as_xml=False, show_deleted=None, show_hidden=None, hda_id=None, **kwd ):
"""
Display the current history, creating a new history if necessary.
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 static/scripts/mvc/base-mvc.js
--- a/static/scripts/mvc/base-mvc.js
+++ b/static/scripts/mvc/base-mvc.js
@@ -288,7 +288,7 @@
},
/** String representation.
*/
- toString : function(){ return 'PersistantStorage(' + data + ')'; }
+ toString : function(){ return 'PersistantStorage(' + storageKey + ')'; }
});
return returnedStorage;
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 static/scripts/mvc/dataset/hda-base.js
--- a/static/scripts/mvc/dataset/hda-base.js
+++ b/static/scripts/mvc/dataset/hda-base.js
@@ -28,6 +28,7 @@
* @see Backbone.View#initialize
*/
initialize : function( attributes ){
+ if( attributes.logger ){ this.logger = this.model.logger = attributes.logger; }
this.log( this + '.initialize:', attributes );
/** list of rendering functions for the default, primary icon-buttons. */
@@ -334,6 +335,8 @@
//TODO: not a fan of this dispatch
switch( this.model.get( 'state' ) ){
+ case HistoryDatasetAssociation.STATES.NEW :
+ break;
case HistoryDatasetAssociation.STATES.NOT_VIEWABLE :
this._render_body_not_viewable( body );
break;
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 static/scripts/mvc/dataset/hda-model.js
--- a/static/scripts/mvc/dataset/hda-model.js
+++ b/static/scripts/mvc/dataset/hda-model.js
@@ -130,8 +130,7 @@
//TODO: to list inclusion test
//TODO: class level readyStates list
return (
- ( state === HistoryDatasetAssociation.STATES.NEW )
- || ( state === HistoryDatasetAssociation.STATES.OK )
+ ( state === HistoryDatasetAssociation.STATES.OK )
|| ( state === HistoryDatasetAssociation.STATES.EMPTY )
|| ( state === HistoryDatasetAssociation.STATES.FAILED_METADATA )
|| ( state === HistoryDatasetAssociation.STATES.NOT_VIEWABLE )
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 static/scripts/mvc/history/history-panel.js
--- a/static/scripts/mvc/history/history-panel.js
+++ b/static/scripts/mvc/history/history-panel.js
@@ -140,6 +140,8 @@
* @see Backbone.View#initialize
*/
initialize : function( attributes ){
+ // set the logger if requested
+ if( attributes.logger ){ this.logger = this.model.logger = attributes.logger; }
this.log( this + '.initialize:', attributes );
// set up url templates
@@ -203,7 +205,7 @@
show_deleted : false,
show_hidden : false
});
- this.log( 'this.storage:', this.storage.get() );
+ this.log( this + ' (prev) storage:', JSON.stringify( this.storage.get(), null, 2 ) );
// expanded Hdas is a map of hda.ids -> a boolean rep'ing whether this hda's body is expanded
// store any pre-expanded ids passed in
@@ -226,7 +228,7 @@
this.show_deleted = this.storage.get( 'show_deleted' );
this.show_hidden = this.storage.get( 'show_hidden' );
//this.log( 'this.show_deleted:', this.show_deleted, 'show_hidden', this.show_hidden );
- this.log( '(init\'d) this.storage:', this.storage.get() );
+ this.log( this + ' (init\'d) storage:', this.storage.get() );
},
/** Add an hda to this history's collection
@@ -351,7 +353,8 @@
historyView.hdaViews[ hdaId ] = new historyView.HDAView({
model : hda,
expanded : expanded,
- urlTemplates : historyView.hdaUrlTemplates
+ urlTemplates : historyView.hdaUrlTemplates,
+ logger : historyView.logger
});
historyView._setUpHdaListeners( historyView.hdaViews[ hdaId ] );
@@ -432,19 +435,23 @@
/** Handle the user toggling the deleted visibility by:
* (1) storing the new value in the persistant storage
* (2) re-rendering the history
+ * @returns {Boolean} new show_deleted setting
*/
toggleShowDeleted : function(){
this.storage.set( 'show_deleted', !this.storage.get( 'show_deleted' ) );
this.render();
+ return this.storage.get( 'show_deleted' );
},
/** Handle the user toggling the deleted visibility by:
* (1) storing the new value in the persistant storage
* (2) re-rendering the history
+ * @returns {Boolean} new show_hidden setting
*/
toggleShowHidden : function(){
this.storage.set( 'show_hidden', !this.storage.get( 'show_hidden' ) );
this.render();
+ return this.storage.get( 'show_hidden' );
},
/** Collapse all hda bodies and clear expandedHdas in the storage
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 static/scripts/mvc/ui.js
--- a/static/scripts/mvc/ui.js
+++ b/static/scripts/mvc/ui.js
@@ -76,11 +76,11 @@
iconButton : Handlebars.partials.iconButton
};
-
var IconButtonCollection = Backbone.Collection.extend({
model: IconButton
});
+
//------------------------------------------------------------------------------
/**
* Menu with multiple icon buttons. Views are not needed nor used for individual buttons.
@@ -166,15 +166,319 @@
});
+// =============================================================================
+/** @class View for a popup menu
+ * @name PopupMenu
+ *
+ * @constructs
+ */
+var PopupMenu = Backbone.View.extend(
+/** @lends PopupMenu.prototype */{
+ /* TODO:
+ add submenus
+ add hrefs
+ test various html keys
+ add make_popupmenus style
+ get template inside this file somehow
+ */
+ /** Cache the desired button element and options, set up the button click handler
+ * NOTE: attaches this view as HTML/jQ data on the button for later use.
+ */
+ //TODO: include docs on special option keys (divider, checked, etc.)
+ initialize : function( $button, options ){
+ // default settings
+ this.$button = $button || $( '<div/>' );
+ this.options = options || [];
+ //console.debug( this + '.initialize, button:', $button, ', options:', options );
+ // set up button click -> open menu behavior
+ var menu = this;
+ this.$button.click( function( event ){
+ menu._renderAndShow( event );
+ //event.stopPropagation();
+ return false;
+ });
+ // attach this view as a data object on the button - for later access
+ //TODO:?? memleak?
+ this.$button.data( 'PopupMenu', this );
+ // template loading is problematic - ui is loaded in base.mako
+ // and the template (prev.) needed to be loaded before ui
+ if( !this.templates.wrapper ){
+ this.templates.wrapper = Handlebars.templates[ 'template-popupmenu-wrapper' ];
+ }
+ },
+ /** Render the menu. NOTE: doesn't attach itself to the DOM.
+ * @see PopupMenu#_renderAndShow
+ */
+ render : function(){
+ var menu = this;
+ // render the menu body
+ this.$el.addClass( 'popmenu-wrapper' )
+ .css({
+ position: 'absolute',
+ display: 'none'
+ });
+ //BUG: anchors within a.popupmenu-option render OUTSIDE the a.popupmenu-option!?
+ this.$el.html( PopupMenu.templates.menu({
+ options : this.options,
+ // sets menu div id to '{{ id }}-menu'
+ id : this.$button.attr( 'id' )
+ }));
+ //console.debug( this.$el, ':', this.$el.html() );
+ // set up behavior on each link/anchor elem
+ if( this.options.length ){
+ this.$el.find( 'li' ).each( function( i, li ){
+ var $li = $( li ),
+ $anchor = $li.children( 'a.popupmenu-option' ),
+ menuFunc = menu.options[ i ].func;
+ //console.debug( 'setting up behavior:', i, menu.options[ i ], $li, $anchor );
+ if( $anchor.length && menuFunc ){
+ $anchor.click( function( event ){
+ menuFunc( event, menu.options[ i ] );
+ });
+ }
+ // cache the anchor as a jq obj within the options obj
+ menu.options[ i ].$li = $li;
+ });
+ }
+ return this;
+ },
+ /** Get the absolute position/offset for the menu
+ */
+ _getShownPosition : function( clickEvent ){
+ var menuWidth = this.$el.width(),
+ // display menu horiz. centered on click...
+ x = clickEvent.pageX - menuWidth / 2 ;
+ // ...but adjust that to handle horiz. scroll and window dimensions (draw entirely on visible screen area)
+ x = Math.min( x, $( document ).scrollLeft() + $( window ).width() - menuWidth - 5 );
+ x = Math.max( x, $( document ).scrollLeft() + 5 );
+
+ return {
+ top: clickEvent.pageY,
+ left: x
+ };
+ },
+
+ /** Render the menu, append to the page body at the click position, and set up the 'click-away' handlers, show
+ */
+ _renderAndShow : function( clickEvent ){
+ this.render();
+ this.$el.appendTo( 'body' );
+ this.$el.css( this._getShownPosition( clickEvent ) );
+ this._setUpCloseBehavior();
+ this.$el.show();
+ },
+
+ /** Bind an event handler to all available frames so that when anything is clicked
+ * * the menu is removed from the DOM
+ * * The event handler unbinds itself
+ */
+ _setUpCloseBehavior : function(){
+ var menu = this,
+ // function to close popup and unbind itself
+ closePopupWhenClicked = function( $elClicked ){
+ $elClicked.bind( "click.close_popup", function(){
+ menu.remove();
+ $elClicked.unbind( "click.close_popup" );
+ });
+ };
+
+ // bind to current, parent, and sibling frames
+ //TODO: (Assuming for now that this is the best way to do this...)
+ closePopupWhenClicked( $( window.document ) );
+ closePopupWhenClicked( $( window.top.document ) );
+ _.each( window.top.frames, function( siblingFrame ){
+ closePopupWhenClicked( $( siblingFrame.document ) );
+ });
+ },
+
+ /** Add a menu option/item at the given index
+ */
+ addItem : function( item, index ){
+ // append to end if no index
+ index = ( index >= 0 )?( index ):( this.options.length );
+ this.options.splice( index, 0, item );
+ return this;
+ },
+
+ /** Remove a menu option/item at the given index
+ */
+ removeItem : function( index ){
+ if( index >=0 ){
+ this.options.splice( index, 1 );
+ }
+ return this;
+ },
+
+ /** Search for a menu option by it's html
+ */
+ findIndexByHtml : function( html ){
+ for( var i=0; i<this.options.length; i++ ){
+ if( ( _.has( this.options[i], 'html' ) )
+ && ( this.options[i].html === html ) ){
+ return i;
+ }
+ }
+ return null;
+ },
+
+ /** Search for a menu option by it's html
+ */
+ findItemByHtml : function( html ){
+ return this.options[( this.findIndexByHtml( html ) )];
+ },
+
+ /** String representation. */
+ toString : function(){
+ return 'PopupMenu';
+ }
+});
+PopupMenu.templates = {
+ menu : Handlebars.templates[ 'template-popupmenu-menu' ]
+};
+
+// -----------------------------------------------------------------------------
+// the following class functions are bridges from the original make_popupmenu and make_popup_menus
+// to the newer backbone.js PopupMenu
+
+/** Create a PopupMenu from simple map initial_options activated by clicking button_element.
+ * Converts initial_options to object array used by PopupMenu.
+ * @param {jQuery|DOMElement} button_element element which, when clicked, activates menu
+ * @param {Object} initial_options map of key -> values, where
+ * key is option text, value is fn to call when option is clicked
+ * @returns {PopupMenu} the PopupMenu created
+ */
+PopupMenu.make_popupmenu = function( button_element, initial_options ){
+ var convertedOptions = [];
+ _.each( initial_options, function( optionVal, optionKey ){
+ var newOption = { html: optionKey };
+
+ // keys with null values indicate: header
+ if( optionVal === null ){ // !optionVal? (null only?)
+ newOption.header = true;
+
+ // keys with function values indicate: a menu option
+ } else if( jQuery.type( optionVal ) === 'function' ){
+ newOption.func = optionVal;
+ }
+ //TODO:?? any other special optionVals?
+ // there was no divider option originally
+ convertedOptions.push( newOption );
+ });
+ return new PopupMenu( $( button_element ), convertedOptions );
+};
+
+/** Find all anchors in $parent (using selector) and covert anchors into a PopupMenu options map.
+ * @param {jQuery} $parent the element that contains the links to convert to options
+ * @param {String} selector jq selector string to find links
+ * @returns {Object[]} the options array to initialize a PopupMenu
+ */
+//TODO: lose parent and selector, pass in array of links, use map to return options
+PopupMenu.convertLinksToOptions = function( $parent, selector ){
+ $parent = $( $parent );
+ selector = selector || 'a';
+ var options = [];
+ $parent.find( selector ).each( function( elem, i ){
+ var option = {},
+ $link = $( elem );
+
+ // convert link text to the option text (html) and the href into the option func
+ option.html = $link.text();
+ if( linkHref ){
+ var linkHref = $link.attr( 'href' ),
+ linkTarget = $link.attr( 'target' ),
+ confirmText = $link.attr( 'confirm' );
+
+ option.func = function(){
+ // if there's a "confirm" attribute, throw up a confirmation dialog, and
+ // if the user cancels - do nothing
+ if( ( confirmText ) && ( !confirm( confirmText ) ) ){ return; }
+
+ // if there's no confirm attribute, or the user accepted the confirm dialog:
+ var f;
+ switch( linkTarget ){
+ // relocate the center panel
+ case '_parent':
+ window.parent.location = linkHref;
+ break;
+
+ // relocate the entire window
+ case '_top':
+ window.top.location = linkHref;
+ break;
+
+ // Http request target is a window named demolocal on the local box
+ //TODO: I still don't understand this option (where the hell does f get set? confirm?)
+ case 'demo':
+ if( f === undefined || f.closed ){
+ f = window.open( linkHref, linkTarget );
+ f.creator = self;
+ }
+ break;
+
+ // relocate this panel
+ default:
+ window.location = linkHref;
+ }
+ };
+ }
+ options.push( option );
+ });
+ return options;
+};
+
+/** Create a single popupmenu from existing DOM button and anchor elements
+ * @param {jQuery} $buttonElement the element that when clicked will open the menu
+ * @param {jQuery} $menuElement the element that contains the anchors to convert into a menu
+ * @param {String} menuElementLinkSelector jq selector string used to find anchors to be made into menu options
+ * @returns {PopupMenu} the PopupMenu (Backbone View) that can render, control the menu
+ */
+PopupMenu.fromExistingDom = function( $buttonElement, $menuElement, menuElementLinkSelector ){
+ $buttonElement = $( $buttonElement );
+ $menuElement = $( $menuElement );
+ var options = PopupMenu.convertLinksToOptions( $menuElement, menuElementLinkSelector );
+ // we're done with the menu (having converted it to an options map)
+ $menuElement.remove();
+ return new PopupMenu( $buttonElement, options );
+};
+
+/** Create all popupmenus within a document or a more specific element
+ * @param {DOMElement} parent the DOM element in which to search for popupmenus to build (defaults to document)
+ * @param {String} menuSelector jq selector string to find popupmenu menu elements (defaults to "div[popupmenu]")
+ * @param {Function} buttonSelectorBuildFn the function to build the jq button selector.
+ * Will be passed $menuElement, parent.
+ * (Defaults to return '#' + $menuElement.attr( 'popupmenu' ); )
+ * @returns {PopupMenu[]} array of popupmenus created
+ */
+PopupMenu.make_popup_menus = function( parent, menuSelector, buttonSelectorBuildFn ){
+ parent = parent || document;
+ // orig. Glx popupmenu menus have a (non-std) attribute 'popupmenu'
+ // which contains the id of the button that activates the menu
+ menuSelector = menuSelector || 'div[popupmenu]';
+ // default to (orig. Glx) matching button to menu by using the popupmenu attr of the menu as the id of the button
+ buttonSelectorBuildFn = buttonSelectorBuildFn || function( $menuElement, parent ){
+ return '#' + $menuElement.attr( 'popupmenu' );
+ };
+
+ // aggregate and return all PopupMenus
+ var popupMenusCreated = [];
+ $( parent ).find( menuSelector ).each( function(){
+ var $menuElement = $( this ),
+ $buttonElement = $( parent ).find( buttonSelectorBuildFn( $menuElement, parent ) );
+ popupMenusCreated.push( PopupMenu.fromDom( $buttonElement, $menuElement ) );
+ $buttonElement.addClass( 'popup' );
+ });
+ return popupMenusCreated;
+}
+
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 static/scripts/packed/mvc/base-mvc.js
--- a/static/scripts/packed/mvc/base-mvc.js
+++ b/static/scripts/packed/mvc/base-mvc.js
@@ -1,1 +1,1 @@
-var BaseModel=Backbone.RelationalModel.extend({defaults:{name:null,hidden:false},show:function(){this.set("hidden",false)},hide:function(){this.set("hidden",true)},is_visible:function(){return !this.attributes.hidden}});var BaseView=Backbone.View.extend({initialize:function(){this.model.on("change:hidden",this.update_visible,this);this.update_visible()},update_visible:function(){if(this.model.attributes.hidden){this.$el.hide()}else{this.$el.show()}}});var LoggableMixin={logger:null,log:function(){if(this.logger){return this.logger.log.apply(this.logger,arguments)}return undefined}};var GalaxyLocalization=jQuery.extend({},{ALIAS_NAME:"_l",localizedStrings:{},setLocalizedString:function(b,a){var c=this;var d=function(f,e){if(f!==e){c.localizedStrings[f]=e}};if(jQuery.type(b)==="string"){d(b,a)}else{if(jQuery.type(b)==="object"){jQuery.each(b,function(e,f){d(e,f)})}else{throw ("Localization.setLocalizedString needs either a string or object as the first argument, given: "+b)}}},localize:function(a){return this.localizedStrings[a]||a},toString:function(){return"GalaxyLocalization"}});window[GalaxyLocalization.ALIAS_NAME]=function(a){return GalaxyLocalization.localize(a)};var PersistantStorage=function(g,d){if(!g){throw ("PersistantStorage needs storageKey argument")}d=d||{};var b=jQuery.jStorage.get,c=jQuery.jStorage.set,a=jQuery.jStorage.deleteKey;function e(i,h){i=i||{};h=h||null;return{get:function(j){if(j===undefined){return i}else{if(i.hasOwnProperty(j)){return(jQuery.type(i[j])==="object")?(new e(i[j],this)):(i[j])}}return undefined},set:function(j,k){i[j]=k;this._save();return this},deleteKey:function(j){delete i[j];this._save();return this},_save:function(){return h._save()},toString:function(){return("StorageRecursionHelper("+i+")")}}}var f={};data=b(g);if(data===null){data=jQuery.extend(true,{},d);c(g,data)}f=new e(data);jQuery.extend(f,{_save:function(h){return c(g,f.get())},destroy:function(){return a(g)},toString:function(){return"PersistantStorage("+data+")"}});return f};
\ No newline at end of file
+var BaseModel=Backbone.RelationalModel.extend({defaults:{name:null,hidden:false},show:function(){this.set("hidden",false)},hide:function(){this.set("hidden",true)},is_visible:function(){return !this.attributes.hidden}});var BaseView=Backbone.View.extend({initialize:function(){this.model.on("change:hidden",this.update_visible,this);this.update_visible()},update_visible:function(){if(this.model.attributes.hidden){this.$el.hide()}else{this.$el.show()}}});var LoggableMixin={logger:null,log:function(){if(this.logger){return this.logger.log.apply(this.logger,arguments)}return undefined}};var GalaxyLocalization=jQuery.extend({},{ALIAS_NAME:"_l",localizedStrings:{},setLocalizedString:function(b,a){var c=this;var d=function(f,e){if(f!==e){c.localizedStrings[f]=e}};if(jQuery.type(b)==="string"){d(b,a)}else{if(jQuery.type(b)==="object"){jQuery.each(b,function(e,f){d(e,f)})}else{throw ("Localization.setLocalizedString needs either a string or object as the first argument, given: "+b)}}},localize:function(a){return this.localizedStrings[a]||a},toString:function(){return"GalaxyLocalization"}});window[GalaxyLocalization.ALIAS_NAME]=function(a){return GalaxyLocalization.localize(a)};var PersistantStorage=function(g,d){if(!g){throw ("PersistantStorage needs storageKey argument")}d=d||{};var b=jQuery.jStorage.get,c=jQuery.jStorage.set,a=jQuery.jStorage.deleteKey;function e(i,h){i=i||{};h=h||null;return{get:function(j){if(j===undefined){return i}else{if(i.hasOwnProperty(j)){return(jQuery.type(i[j])==="object")?(new e(i[j],this)):(i[j])}}return undefined},set:function(j,k){i[j]=k;this._save();return this},deleteKey:function(j){delete i[j];this._save();return this},_save:function(){return h._save()},toString:function(){return("StorageRecursionHelper("+i+")")}}}var f={};data=b(g);if(data===null){data=jQuery.extend(true,{},d);c(g,data)}f=new e(data);jQuery.extend(f,{_save:function(h){return c(g,f.get())},destroy:function(){return a(g)},toString:function(){return"PersistantStorage("+g+")"}});return f};
\ No newline at end of file
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 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){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.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: 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
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 static/scripts/packed/mvc/dataset/hda-model.js
--- a/static/scripts/packed/mvc/dataset/hda-model.js
+++ b/static/scripts/packed/mvc/dataset/hda-model.js
@@ -1,1 +1,1 @@
-var HistoryDatasetAssociation=BaseModel.extend(LoggableMixin).extend({defaults:{history_id:null,model_class:"HistoryDatasetAssociation",hid:0,id:null,name:"(unnamed dataset)",state:"ok",data_type:null,file_size:0,file_ext:"",meta_files:[],misc_blurb:"",misc_info:"",deleted:false,purged:false,visible:false,accessible:true},urlRoot:"api/histories/",url:function(){return"api/histories/"+this.get("history_id")+"/contents/"+this.get("id")},initialize:function(){this.log(this+".initialize",this.attributes);this.log("\tparent history_id: "+this.get("history_id"));if(!this.get("accessible")){this.set("state",HistoryDatasetAssociation.STATES.NOT_VIEWABLE)}this.on("change:state",function(b,a){this.log(this+" has changed state:",b,a);if(this.inReadyState()){this.trigger("state:ready",this.get("id"),a,this.previous("state"),b)}})},isDeletedOrPurged:function(){return(this.get("deleted")||this.get("purged"))},isVisible:function(b,c){var a=true;if((!b)&&(this.get("deleted")||this.get("purged"))){a=false}if((!c)&&(!this.get("visible"))){a=false}return a},inReadyState:function(){var a=this.get("state");return((a===HistoryDatasetAssociation.STATES.NEW)||(a===HistoryDatasetAssociation.STATES.OK)||(a===HistoryDatasetAssociation.STATES.EMPTY)||(a===HistoryDatasetAssociation.STATES.FAILED_METADATA)||(a===HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(a===HistoryDatasetAssociation.STATES.DISCARDED)||(a===HistoryDatasetAssociation.STATES.ERROR))},hasData:function(){return(this.get("file_size")>0)},toString:function(){var a=this.get("id")||"";if(this.get("name")){a+=':"'+this.get("name")+'"'}return"HistoryDatasetAssociation("+a+")"}});HistoryDatasetAssociation.STATES={UPLOAD:"upload",QUEUED:"queued",PAUSED:"paused",RUNNING:"running",SETTING_METADATA:"setting_metadata",NEW:"new",EMPTY:"empty",OK:"ok",FAILED_METADATA:"failed_metadata",NOT_VIEWABLE:"noPermission",DISCARDED:"discarded",ERROR:"error"};var HDACollection=Backbone.Collection.extend(LoggableMixin).extend({model:HistoryDatasetAssociation,initialize:function(){},ids:function(){return this.map(function(a){return a.id})},hidToCollectionIndex:function(a){if(!a){return this.models.length}var d=this.models.length-1;for(var b=d;b>=0;b--){var c=this.at(b).get("hid");if(c==a){return b}if(c<a){return b+1}}return null},getVisible:function(a,b){return this.filter(function(c){return c.isVisible(a,b)})},getStateLists:function(){var a={};_.each(_.values(HistoryDatasetAssociation.STATES),function(b){a[b]=[]});this.each(function(b){a[b.get("state")].push(b.get("id"))});return a},running:function(){var a=[];this.each(function(b){if(!b.inReadyState()){a.push(b.get("id"))}});return a},update:function(a){this.log(this+"update:",a);if(!(a&&a.length)){return[]}var c=this,b=null;_.each(a,function(f,d){var e=c.get(f);if(e){e.fetch();b.push(e)}});return b},toString:function(){return("HDACollection()")}});
\ No newline at end of file
+var HistoryDatasetAssociation=BaseModel.extend(LoggableMixin).extend({defaults:{history_id:null,model_class:"HistoryDatasetAssociation",hid:0,id:null,name:"(unnamed dataset)",state:"ok",data_type:null,file_size:0,file_ext:"",meta_files:[],misc_blurb:"",misc_info:"",deleted:false,purged:false,visible:false,accessible:true},urlRoot:"api/histories/",url:function(){return"api/histories/"+this.get("history_id")+"/contents/"+this.get("id")},initialize:function(){this.log(this+".initialize",this.attributes);this.log("\tparent history_id: "+this.get("history_id"));if(!this.get("accessible")){this.set("state",HistoryDatasetAssociation.STATES.NOT_VIEWABLE)}this.on("change:state",function(b,a){this.log(this+" has changed state:",b,a);if(this.inReadyState()){this.trigger("state:ready",this.get("id"),a,this.previous("state"),b)}})},isDeletedOrPurged:function(){return(this.get("deleted")||this.get("purged"))},isVisible:function(b,c){var a=true;if((!b)&&(this.get("deleted")||this.get("purged"))){a=false}if((!c)&&(!this.get("visible"))){a=false}return a},inReadyState:function(){var a=this.get("state");return((a===HistoryDatasetAssociation.STATES.OK)||(a===HistoryDatasetAssociation.STATES.EMPTY)||(a===HistoryDatasetAssociation.STATES.FAILED_METADATA)||(a===HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(a===HistoryDatasetAssociation.STATES.DISCARDED)||(a===HistoryDatasetAssociation.STATES.ERROR))},hasData:function(){return(this.get("file_size")>0)},toString:function(){var a=this.get("id")||"";if(this.get("name")){a+=':"'+this.get("name")+'"'}return"HistoryDatasetAssociation("+a+")"}});HistoryDatasetAssociation.STATES={UPLOAD:"upload",QUEUED:"queued",PAUSED:"paused",RUNNING:"running",SETTING_METADATA:"setting_metadata",NEW:"new",EMPTY:"empty",OK:"ok",FAILED_METADATA:"failed_metadata",NOT_VIEWABLE:"noPermission",DISCARDED:"discarded",ERROR:"error"};var HDACollection=Backbone.Collection.extend(LoggableMixin).extend({model:HistoryDatasetAssociation,initialize:function(){},ids:function(){return this.map(function(a){return a.id})},hidToCollectionIndex:function(a){if(!a){return this.models.length}var d=this.models.length-1;for(var b=d;b>=0;b--){var c=this.at(b).get("hid");if(c==a){return b}if(c<a){return b+1}}return null},getVisible:function(a,b){return this.filter(function(c){return c.isVisible(a,b)})},getStateLists:function(){var a={};_.each(_.values(HistoryDatasetAssociation.STATES),function(b){a[b]=[]});this.each(function(b){a[b.get("state")].push(b.get("id"))});return a},running:function(){var a=[];this.each(function(b){if(!b.inReadyState()){a.push(b.get("id"))}});return a},update:function(a){this.log(this+"update:",a);if(!(a&&a.length)){return[]}var c=this,b=null;_.each(a,function(f,d){var e=c.get(f);if(e){e.fetch();b.push(e)}});return b},toString:function(){return("HDACollection()")}});
\ No newline at end of file
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 static/scripts/packed/mvc/history/history-panel.js
--- a/static/scripts/packed/mvc/history/history-panel.js
+++ b/static/scripts/packed/mvc/history/history-panel.js
@@ -1,1 +1,1 @@
-var HistoryPanel=BaseView.extend(LoggableMixin).extend({el:"body.historyPage",HDAView:HDAEditView,events:{"click #history-tag":"loadAndDisplayTags"},initialize:function(a){this.log(this+".initialize:",a);if(!a.urlTemplates){throw (this+" needs urlTemplates on initialize")}if(!a.urlTemplates.history){throw (this+" needs urlTemplates.history on initialize")}if(!a.urlTemplates.hda){throw (this+" needs urlTemplates.hda on initialize")}this.urlTemplates=a.urlTemplates.history;this.hdaUrlTemplates=a.urlTemplates.hda;this._setUpWebStorage(a.initiallyExpanded,a.show_deleted,a.show_hidden);this.model.bind("change:nice_size",this.updateHistoryDiskSize,this);this.model.hdas.bind("add",this.add,this);this.model.hdas.bind("reset",this.addAll,this);this.model.hdas.bind("change:state",function(c,d,b){if((c.inReadyState())&&(!c.get("visible"))&&(!this.storage.get("show_hidden"))){this.removeHda(c)}},this);this.hdaViews={};this.urls={}},_setUpWebStorage:function(b,a,c){this.storage=new PersistantStorage("HistoryView."+this.model.get("id"),{expandedHdas:{},show_deleted:false,show_hidden:false});this.log("this.storage:",this.storage.get());if(b){this.storage.set("exandedHdas",b)}if((a===true)||(a===false)){this.storage.set("show_deleted",a)}if((c===true)||(c===false)){this.storage.set("show_hidden",c)}this.show_deleted=this.storage.get("show_deleted");this.show_hidden=this.storage.get("show_hidden");this.log("(init'd) this.storage:",this.storage.get())},add:function(a){this.render()},addAll:function(){this.render()},removeHda:function(a,c){var b=this.hdaViews[a.get("id")];b.$el.fadeOut("fast",function(){b.$el.remove();if(c){c()}});this.model.hdas.remove(a)},render:function(){var b=this,d=b.toString()+".set-up",c=$("<div/>"),a=this.model.toJSON(),e=(this.$el.children().size()===0);a.urls=this._renderUrls(a);c.append(HistoryPanel.templates.historyPanel(a));c.find(".tooltip").tooltip({placement:"bottom"});if(!this.model.hdas.length||!this.renderItems(c.find("#"+this.model.get("id")+"-datasets"))){c.find("#emptyHistoryMessage").show()}$(b).queue(d,function(f){b.$el.fadeOut("fast",function(){f()})});$(b).queue(d,function(f){b.$el.html("");b.$el.append(c.children());b.$el.fadeIn("fast",function(){f()})});$(b).queue(d,function(f){this.log(b+" rendered:",b.$el);b._setUpBehaviours();if(e){b.trigger("rendered:initial")}else{b.trigger("rendered")}f()});$(b).dequeue(d);return this},_renderUrls:function(a){var b=this;b.urls={};_.each(this.urlTemplates,function(d,c){b.urls[c]=_.template(d,a)});return b.urls},renderItems:function(b){this.hdaViews={};var a=this,c=this.model.hdas.getVisible(this.storage.get("show_deleted"),this.storage.get("show_hidden"));_.each(c,function(f){var e=f.get("id"),d=a.storage.get("expandedHdas").get(e);a.hdaViews[e]=new a.HDAView({model:f,expanded:d,urlTemplates:a.hdaUrlTemplates});a._setUpHdaListeners(a.hdaViews[e]);b.prepend(a.hdaViews[e].render().$el)});return c.length},_setUpHdaListeners:function(b){var a=this;b.bind("body-expanded",function(c){a.storage.get("expandedHdas").set(c,true)});b.bind("body-collapsed",function(c){a.storage.get("expandedHdas").deleteKey(c)})},_setUpBehaviours:function(){if(!(this.model.get("user")&&this.model.get("user").email)){return}var a=this.$("#history-annotation-area");this.$("#history-annotate").click(function(){if(a.is(":hidden")){a.slideDown("fast")}else{a.slideUp("fast")}return false});async_save_text("history-name-container","history-name",this.urls.rename,"new_name",18);async_save_text("history-annotation-container","history-annotation",this.urls.annotate,"new_annotation",18,true,4)},updateHistoryDiskSize:function(){this.$el.find("#history-size").text(this.model.get("nice_size"))},showQuotaMessage:function(){var a=this.$el.find("#quota-message-container");if(a.is(":hidden")){a.slideDown("fast")}},hideQuotaMessage:function(){var a=this.$el.find("#quota-message-container");if(!a.is(":hidden")){a.slideUp("fast")}},toggleShowDeleted:function(){this.storage.set("show_deleted",!this.storage.get("show_deleted"));this.render()},toggleShowHidden:function(){this.storage.set("show_hidden",!this.storage.get("show_hidden"));this.render()},collapseAllHdaBodies:function(){_.each(this.hdaViews,function(a){a.toggleBodyVisibility(null,false)});this.storage.set("expandedHdas",{})},loadAndDisplayTags:function(c){this.log(this+".loadAndDisplayTags",c);var d=this.$el.find("#history-tag-area"),b=d.find(".tag-elt");this.log("\t tagArea",d," tagElt",b);if(d.is(":hidden")){if(!jQuery.trim(b.html())){var a=this;$.ajax({url:a.urls.tag,error:function(){alert(_l("Tagging failed"))},success:function(e){b.html(e);b.find(".tooltip").tooltip();d.slideDown("fast")}})}else{d.slideDown("fast")}}else{d.slideUp("fast")}return false},toString:function(){var a=this.model.get("name")||"";return"HistoryPanel("+a+")"}});HistoryPanel.templates={historyPanel:Handlebars.templates["template-history-historyPanel"]};
\ No newline at end of file
+var HistoryPanel=BaseView.extend(LoggableMixin).extend({el:"body.historyPage",HDAView:HDAEditView,events:{"click #history-tag":"loadAndDisplayTags"},initialize:function(a){if(a.logger){this.logger=this.model.logger=a.logger}this.log(this+".initialize:",a);if(!a.urlTemplates){throw (this+" needs urlTemplates on initialize")}if(!a.urlTemplates.history){throw (this+" needs urlTemplates.history on initialize")}if(!a.urlTemplates.hda){throw (this+" needs urlTemplates.hda on initialize")}this.urlTemplates=a.urlTemplates.history;this.hdaUrlTemplates=a.urlTemplates.hda;this._setUpWebStorage(a.initiallyExpanded,a.show_deleted,a.show_hidden);this.model.bind("change:nice_size",this.updateHistoryDiskSize,this);this.model.hdas.bind("add",this.add,this);this.model.hdas.bind("reset",this.addAll,this);this.model.hdas.bind("change:state",function(c,d,b){if((c.inReadyState())&&(!c.get("visible"))&&(!this.storage.get("show_hidden"))){this.removeHda(c)}},this);this.hdaViews={};this.urls={}},_setUpWebStorage:function(b,a,c){this.storage=new PersistantStorage("HistoryView."+this.model.get("id"),{expandedHdas:{},show_deleted:false,show_hidden:false});this.log(this+" (prev) storage:",JSON.stringify(this.storage.get(),null,2));if(b){this.storage.set("exandedHdas",b)}if((a===true)||(a===false)){this.storage.set("show_deleted",a)}if((c===true)||(c===false)){this.storage.set("show_hidden",c)}this.show_deleted=this.storage.get("show_deleted");this.show_hidden=this.storage.get("show_hidden");this.log(this+" (init'd) storage:",this.storage.get())},add:function(a){this.render()},addAll:function(){this.render()},removeHda:function(a,c){var b=this.hdaViews[a.get("id")];b.$el.fadeOut("fast",function(){b.$el.remove();if(c){c()}});this.model.hdas.remove(a)},render:function(){var b=this,d=b.toString()+".set-up",c=$("<div/>"),a=this.model.toJSON(),e=(this.$el.children().size()===0);a.urls=this._renderUrls(a);c.append(HistoryPanel.templates.historyPanel(a));c.find(".tooltip").tooltip({placement:"bottom"});if(!this.model.hdas.length||!this.renderItems(c.find("#"+this.model.get("id")+"-datasets"))){c.find("#emptyHistoryMessage").show()}$(b).queue(d,function(f){b.$el.fadeOut("fast",function(){f()})});$(b).queue(d,function(f){b.$el.html("");b.$el.append(c.children());b.$el.fadeIn("fast",function(){f()})});$(b).queue(d,function(f){this.log(b+" rendered:",b.$el);b._setUpBehaviours();if(e){b.trigger("rendered:initial")}else{b.trigger("rendered")}f()});$(b).dequeue(d);return this},_renderUrls:function(a){var b=this;b.urls={};_.each(this.urlTemplates,function(d,c){b.urls[c]=_.template(d,a)});return b.urls},renderItems:function(b){this.hdaViews={};var a=this,c=this.model.hdas.getVisible(this.storage.get("show_deleted"),this.storage.get("show_hidden"));_.each(c,function(f){var e=f.get("id"),d=a.storage.get("expandedHdas").get(e);a.hdaViews[e]=new a.HDAView({model:f,expanded:d,urlTemplates:a.hdaUrlTemplates,logger:a.logger});a._setUpHdaListeners(a.hdaViews[e]);b.prepend(a.hdaViews[e].render().$el)});return c.length},_setUpHdaListeners:function(b){var a=this;b.bind("body-expanded",function(c){a.storage.get("expandedHdas").set(c,true)});b.bind("body-collapsed",function(c){a.storage.get("expandedHdas").deleteKey(c)})},_setUpBehaviours:function(){if(!(this.model.get("user")&&this.model.get("user").email)){return}var a=this.$("#history-annotation-area");this.$("#history-annotate").click(function(){if(a.is(":hidden")){a.slideDown("fast")}else{a.slideUp("fast")}return false});async_save_text("history-name-container","history-name",this.urls.rename,"new_name",18);async_save_text("history-annotation-container","history-annotation",this.urls.annotate,"new_annotation",18,true,4)},updateHistoryDiskSize:function(){this.$el.find("#history-size").text(this.model.get("nice_size"))},showQuotaMessage:function(){var a=this.$el.find("#quota-message-container");if(a.is(":hidden")){a.slideDown("fast")}},hideQuotaMessage:function(){var a=this.$el.find("#quota-message-container");if(!a.is(":hidden")){a.slideUp("fast")}},toggleShowDeleted:function(){this.storage.set("show_deleted",!this.storage.get("show_deleted"));this.render();return this.storage.get("show_deleted")},toggleShowHidden:function(){this.storage.set("show_hidden",!this.storage.get("show_hidden"));this.render();return this.storage.get("show_hidden")},collapseAllHdaBodies:function(){_.each(this.hdaViews,function(a){a.toggleBodyVisibility(null,false)});this.storage.set("expandedHdas",{})},loadAndDisplayTags:function(c){this.log(this+".loadAndDisplayTags",c);var d=this.$el.find("#history-tag-area"),b=d.find(".tag-elt");this.log("\t tagArea",d," tagElt",b);if(d.is(":hidden")){if(!jQuery.trim(b.html())){var a=this;$.ajax({url:a.urls.tag,error:function(){alert(_l("Tagging failed"))},success:function(e){b.html(e);b.find(".tooltip").tooltip();d.slideDown("fast")}})}else{d.slideDown("fast")}}else{d.slideUp("fast")}return false},toString:function(){var a=this.model.get("name")||"";return"HistoryPanel("+a+")"}});HistoryPanel.templates={historyPanel:Handlebars.templates["template-history-historyPanel"]};
\ No newline at end of file
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 static/scripts/packed/mvc/ui.js
--- a/static/scripts/packed/mvc/ui.js
+++ b/static/scripts/packed/mvc/ui.js
@@ -1,1 +1,1 @@
-var IconButton=Backbone.Model.extend({defaults:{title:"",icon_class:"",on_click:null,menu_options:null,tooltip_config:{},isMenuButton:true,id:null,href:null,target:null,enabled:true,visible:true}});var IconButtonView=Backbone.View.extend({initialize:function(){this.model.attributes.tooltip_config={placement:"bottom"};this.model.bind("change",this.render,this)},render:function(){this.$el.tooltip("hide");var a=$(Handlebars.partials.iconButton(this.model.toJSON()));a.tooltip(this.model.get("tooltip_config"));this.$el.replaceWith(a);this.setElement(a);return this},events:{click:"click"},click:function(a){if(this.model.attributes.on_click){this.model.attributes.on_click(a);return false}return true}});IconButtonView.templates={iconButton:Handlebars.partials.iconButton};var IconButtonCollection=Backbone.Collection.extend({model:IconButton});var IconButtonMenuView=Backbone.View.extend({tagName:"div",initialize:function(){this.render()},render:function(){var a=this;this.collection.each(function(d){var b=$("<a/>").attr("href","javascript:void(0)").attr("title",d.attributes.title).addClass("icon-button menu-button").addClass(d.attributes.icon_class).appendTo(a.$el).click(d.attributes.on_click);if(d.attributes.tooltip_config){b.tooltip(d.attributes.tooltip_config)}var c=d.get("options");if(c){make_popupmenu(b,c)}});return this}});var create_icon_buttons_menu=function(b,a){if(!a){a={}}var c=new IconButtonCollection(_.map(b,function(d){return new IconButton(_.extend(d,a))}));return new IconButtonMenuView({collection:c})};var Grid=Backbone.Collection.extend({});var GridView=Backbone.View.extend({});var GalaxyPaths=Backbone.Model.extend({defaults:{root_path:"",image_path:""}});
\ No newline at end of file
+var IconButton=Backbone.Model.extend({defaults:{title:"",icon_class:"",on_click:null,menu_options:null,tooltip_config:{},isMenuButton:true,id:null,href:null,target:null,enabled:true,visible:true}});var IconButtonView=Backbone.View.extend({initialize:function(){this.model.attributes.tooltip_config={placement:"bottom"};this.model.bind("change",this.render,this)},render:function(){this.$el.tooltip("hide");var a=$(Handlebars.partials.iconButton(this.model.toJSON()));a.tooltip(this.model.get("tooltip_config"));this.$el.replaceWith(a);this.setElement(a);return this},events:{click:"click"},click:function(a){if(this.model.attributes.on_click){this.model.attributes.on_click(a);return false}return true}});IconButtonView.templates={iconButton:Handlebars.partials.iconButton};var IconButtonCollection=Backbone.Collection.extend({model:IconButton});var IconButtonMenuView=Backbone.View.extend({tagName:"div",initialize:function(){this.render()},render:function(){var a=this;this.collection.each(function(d){var b=$("<a/>").attr("href","javascript:void(0)").attr("title",d.attributes.title).addClass("icon-button menu-button").addClass(d.attributes.icon_class).appendTo(a.$el).click(d.attributes.on_click);if(d.attributes.tooltip_config){b.tooltip(d.attributes.tooltip_config)}var c=d.get("options");if(c){make_popupmenu(b,c)}});return this}});var create_icon_buttons_menu=function(b,a){if(!a){a={}}var c=new IconButtonCollection(_.map(b,function(d){return new IconButton(_.extend(d,a))}));return new IconButtonMenuView({collection:c})};var Grid=Backbone.Collection.extend({});var GridView=Backbone.View.extend({});var GalaxyPaths=Backbone.Model.extend({defaults:{root_path:"",image_path:""}});var PopupMenu=Backbone.View.extend({templates:{wrapper:(function(){var a=['<ul id="<%= id %>-menu" class="dropdown-menu">',"<% if( options.length ){ %>","<% for( var i=0; i<options.length; i++ ){ var option = options[ i ]; %>","<% if( option.divider ){ %>",'<li class="divider"></li>',"<% } else { %>","<% if( option.header ){ %>",'<li class="head"><a href=""javascript:void(0);"><%- option.html %></a></li>',"<% } else { %>","<li><a ",'href="<% print( ( option.href )?( option.href ):( "javascript:void(0);" ) ) %>" ','<% if( option.target ){ %>target="<%= option.target %>" <% } %>','class="popupmenu-option">','<% if( option.checked ){ %><span class="ficon ok"></span><% } %>',"<%- option.html %>","</a></li>","<% } %>","<% } %>","<% } %>","<% } else { %>","<li>No Options.</li>","<% } %>","</ul>"];return _.template(a.join(""))}())},initialize:function(b,a){this.$button=b||$("<div/>");this.options=a||[];var c=this;this.$button.click(function(d){c._renderAndShow(d);return false});this.$button.data("PopupMenu",this);if(!this.templates.wrapper){this.templates.wrapper=Handlebars.templates["template-popupmenu-wrapper"]}},render:function(){var a=this;this.$el.addClass("popmenu-wrapper").css({position:"absolute",display:"none"});this.$el.html(PopupMenu.templates.menu({options:this.options,id:this.$button.attr("id")}));if(this.options.length){this.$el.find("li").each(function(c,b){var f=$(b),e=f.children("a.popupmenu-option"),d=a.options[c].func;if(e.length&&d){e.click(function(g){d(g,a.options[c])})}a.options[c].$li=f})}return this},_getShownPosition:function(b){var c=this.$el.width(),a=b.pageX-c/2;a=Math.min(a,$(document).scrollLeft()+$(window).width()-c-5);a=Math.max(a,$(document).scrollLeft()+5);return{top:b.pageY,left:a}},_renderAndShow:function(a){this.render();this.$el.appendTo("body");this.$el.css(this._getShownPosition(a));this._setUpCloseBehavior();this.$el.show()},_setUpCloseBehavior:function(){var b=this,a=function(c){c.bind("click.close_popup",function(){b.remove();c.unbind("click.close_popup")})};a($(window.document));a($(window.top.document));_.each(window.top.frames,function(c){a($(c.document))})},addItem:function(b,a){a=(a>=0)?(a):(this.options.length);this.options.splice(a,0,b);return this},removeItem:function(a){if(a>=0){this.options.splice(a,1)}return this},findIndexByHtml:function(b){for(var a=0;a<this.options.length;a++){if((_.has(this.options[a],"html"))&&(this.options[a].html===b)){return a}}return null},findItemByHtml:function(a){return this.options[(this.findIndexByHtml(a))]},toString:function(){return"PopupMenu"}});PopupMenu.templates={menu:Handlebars.templates["template-popupmenu-menu"]};PopupMenu.make_popupmenu=function(b,c){var a=[];_.each(c,function(f,d){var e={html:d};if(f===null){e.header=true}else{if(jQuery.type(f)==="function"){e.func=f}}a.push(e)});return new PopupMenu($(b),a)};PopupMenu.convertLinksToOptions=function(c,a){c=$(c);a=a||"a";var b=[];c.find(a).each(function(g,e){var f={},d=$(g);f.html=d.text();if(j){var j=d.attr("href"),k=d.attr("target"),h=d.attr("confirm");f.func=function(){if((h)&&(!confirm(h))){return}var i;switch(k){case"_parent":window.parent.location=j;break;case"_top":window.top.location=j;break;case"demo":if(i===undefined||i.closed){i=window.open(j,k);i.creator=self}break;default:window.location=j}}}b.push(f)});return b};PopupMenu.fromExistingDom=function(d,c,a){d=$(d);c=$(c);var b=PopupMenu.convertLinksToOptions(c,a);c.remove();return new PopupMenu(d,b)};PopupMenu.make_popup_menus=function(c,b,d){c=c||document;b=b||"div[popupmenu]";d=d||function(e,f){return"#"+e.attr("popupmenu")};var a=[];$(c).find(b).each(function(){var e=$(this),f=$(c).find(d(e,c));a.push(PopupMenu.fromDom(f,e));f.addClass("popup")});return a};
\ No newline at end of file
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 static/scripts/packed/templates/compiled/template-popupmenu-menu.js
--- /dev/null
+++ b/static/scripts/packed/templates/compiled/template-popupmenu-menu.js
@@ -0,0 +1,1 @@
+(function(){var b=Handlebars.template,a=Handlebars.templates=Handlebars.templates||{};a["template-popupmenu-menu"]=b(function(f,s,q,l,x){q=q||f.helpers;var r="",i,h,d="function",c=this.escapeExpression,p=this;function o(B,A){var y="",z;y+="\n ";z=B.options;z=q.each.call(B,z,{hash:{},inverse:p.noop,fn:p.program(2,n,A)});if(z||z===0){y+=z}y+="\n";return y}function n(B,A){var y="",z;y+="\n ";z=B.divider;z=q["if"].call(B,z,{hash:{},inverse:p.program(5,k,A),fn:p.program(3,m,A)});if(z||z===0){y+=z}y+="\n ";return y}function m(z,y){return'\n <li class="divider"></li>\n '}function k(B,A){var y="",z;y+="\n ";z=B.header;z=q["if"].call(B,z,{hash:{},inverse:p.program(8,g,A),fn:p.program(6,j,A)});if(z||z===0){y+=z}y+="\n ";return y}function j(C,B){var z="",A,y;z+='\n <li class="head"><a href=""javascript:void(0);">';y=q.html;if(y){A=y.call(C,{hash:{}})}else{A=C.html;A=typeof A===d?A():A}if(A||A===0){z+=A}z+="</a></li>\n ";return z}function g(C,B){var z="",A,y;z+="\n ";z+='\n <li><a href="';A=C.href;A=q["if"].call(C,A,{hash:{},inverse:p.program(11,w,B),fn:p.program(9,e,B)});if(A||A===0){z+=A}z+='"\n ';A=C.href;A=q["if"].call(C,A,{hash:{},inverse:p.noop,fn:p.program(13,v,B)});if(A||A===0){z+=A}z+=' class="popupmenu-option">\n ';A=C.checked;A=q["if"].call(C,A,{hash:{},inverse:p.noop,fn:p.program(15,u,B)});if(A||A===0){z+=A}z+="\n ";y=q.html;if(y){A=y.call(C,{hash:{}})}else{A=C.html;A=typeof A===d?A():A}if(A||A===0){z+=A}z+="\n </a></li>\n ";return z}function e(B,A){var z,y;y=q.href;if(y){z=y.call(B,{hash:{}})}else{z=B.href;z=typeof z===d?z():z}return c(z)}function w(z,y){return"javascript:void(0);"}function v(C,B){var z="",A,y;z+='target="';y=q.target;if(y){A=y.call(C,{hash:{}})}else{A=C.target;A=typeof A===d?A():A}z+=c(A)+'"';return z}function u(z,y){return'<span class="ficon ok"></span>'}function t(z,y){return"\n <li>No Options.</li>\n"}r+='<ul id="';h=q.id;if(h){i=h.call(s,{hash:{}})}else{i=s.id;i=typeof i===d?i():i}r+=c(i)+'-menu" class="dropdown-menu">\n';i=s.options;i=i==null||i===false?i:i.length;i=q["if"].call(s,i,{hash:{},inverse:p.program(17,t,x),fn:p.program(1,o,x)});if(i||i===0){r+=i}r+="\n</ul>";return r})})();
\ No newline at end of file
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 static/scripts/templates/compiled/template-popupmenu-menu.js
--- /dev/null
+++ b/static/scripts/templates/compiled/template-popupmenu-menu.js
@@ -0,0 +1,117 @@
+(function() {
+ var template = Handlebars.template, templates = Handlebars.templates = Handlebars.templates || {};
+templates['template-popupmenu-menu'] = template(function (Handlebars,depth0,helpers,partials,data) {
+ helpers = helpers || Handlebars.helpers;
+ var buffer = "", stack1, foundHelper, functionType="function", escapeExpression=this.escapeExpression, self=this;
+
+function program1(depth0,data) {
+
+ var buffer = "", stack1;
+ buffer += "\n ";
+ stack1 = depth0.options;
+ stack1 = helpers.each.call(depth0, stack1, {hash:{},inverse:self.noop,fn:self.program(2, program2, data)});
+ if(stack1 || stack1 === 0) { buffer += stack1; }
+ buffer += "\n";
+ return buffer;}
+function program2(depth0,data) {
+
+ var buffer = "", stack1;
+ buffer += "\n ";
+ stack1 = depth0.divider;
+ stack1 = helpers['if'].call(depth0, stack1, {hash:{},inverse:self.program(5, program5, data),fn:self.program(3, program3, data)});
+ if(stack1 || stack1 === 0) { buffer += stack1; }
+ buffer += "\n ";
+ return buffer;}
+function program3(depth0,data) {
+
+
+ return "\n <li class=\"divider\"></li>\n ";}
+
+function program5(depth0,data) {
+
+ var buffer = "", stack1;
+ buffer += "\n ";
+ stack1 = depth0.header;
+ stack1 = helpers['if'].call(depth0, stack1, {hash:{},inverse:self.program(8, program8, data),fn:self.program(6, program6, data)});
+ if(stack1 || stack1 === 0) { buffer += stack1; }
+ buffer += "\n ";
+ return buffer;}
+function program6(depth0,data) {
+
+ var buffer = "", stack1, foundHelper;
+ buffer += "\n <li class=\"head\"><a href=\"\"javascript:void(0);\">";
+ foundHelper = helpers.html;
+ if (foundHelper) { stack1 = foundHelper.call(depth0, {hash:{}}); }
+ else { stack1 = depth0.html; stack1 = typeof stack1 === functionType ? stack1() : stack1; }
+ if(stack1 || stack1 === 0) { buffer += stack1; }
+ buffer += "</a></li>\n ";
+ return buffer;}
+
+function program8(depth0,data) {
+
+ var buffer = "", stack1, foundHelper;
+ buffer += "\n ";
+ buffer += "\n <li><a href=\"";
+ stack1 = depth0.href;
+ stack1 = helpers['if'].call(depth0, stack1, {hash:{},inverse:self.program(11, program11, data),fn:self.program(9, program9, data)});
+ if(stack1 || stack1 === 0) { buffer += stack1; }
+ buffer += "\"\n ";
+ stack1 = depth0.href;
+ stack1 = helpers['if'].call(depth0, stack1, {hash:{},inverse:self.noop,fn:self.program(13, program13, data)});
+ if(stack1 || stack1 === 0) { buffer += stack1; }
+ buffer += " class=\"popupmenu-option\">\n ";
+ stack1 = depth0.checked;
+ stack1 = helpers['if'].call(depth0, stack1, {hash:{},inverse:self.noop,fn:self.program(15, program15, data)});
+ if(stack1 || stack1 === 0) { buffer += stack1; }
+ buffer += "\n ";
+ foundHelper = helpers.html;
+ if (foundHelper) { stack1 = foundHelper.call(depth0, {hash:{}}); }
+ else { stack1 = depth0.html; stack1 = typeof stack1 === functionType ? stack1() : stack1; }
+ if(stack1 || stack1 === 0) { buffer += stack1; }
+ buffer += "\n </a></li>\n ";
+ return buffer;}
+function program9(depth0,data) {
+
+ var stack1, foundHelper;
+ foundHelper = helpers.href;
+ if (foundHelper) { stack1 = foundHelper.call(depth0, {hash:{}}); }
+ else { stack1 = depth0.href; stack1 = typeof stack1 === functionType ? stack1() : stack1; }
+ return escapeExpression(stack1);}
+
+function program11(depth0,data) {
+
+
+ return "javascript:void(0);";}
+
+function program13(depth0,data) {
+
+ var buffer = "", stack1, foundHelper;
+ buffer += "target=\"";
+ foundHelper = helpers.target;
+ if (foundHelper) { stack1 = foundHelper.call(depth0, {hash:{}}); }
+ else { stack1 = depth0.target; stack1 = typeof stack1 === functionType ? stack1() : stack1; }
+ buffer += escapeExpression(stack1) + "\"";
+ return buffer;}
+
+function program15(depth0,data) {
+
+
+ return "<span class=\"ficon ok\"></span>";}
+
+function program17(depth0,data) {
+
+
+ return "\n <li>No Options.</li>\n";}
+
+ buffer += "<ul id=\"";
+ foundHelper = helpers.id;
+ if (foundHelper) { stack1 = foundHelper.call(depth0, {hash:{}}); }
+ else { stack1 = depth0.id; stack1 = typeof stack1 === functionType ? stack1() : stack1; }
+ buffer += escapeExpression(stack1) + "-menu\" class=\"dropdown-menu\">\n";
+ stack1 = depth0.options;
+ stack1 = stack1 == null || stack1 === false ? stack1 : stack1.length;
+ stack1 = helpers['if'].call(depth0, stack1, {hash:{},inverse:self.program(17, program17, data),fn:self.program(1, program1, data)});
+ if(stack1 || stack1 === 0) { buffer += stack1; }
+ buffer += "\n</ul>";
+ return buffer;});
+})();
\ No newline at end of file
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 static/scripts/templates/ui-templates.html
--- a/static/scripts/templates/ui-templates.html
+++ b/static/scripts/templates/ui-templates.html
@@ -1,4 +1,4 @@
-<script type="text/template" class="template-history" id="template-user-quotaMeter-quota">
+<script type="text/template" class="template-user" id="template-user-quotaMeter-quota"><div id="quota-meter" class="quota-meter progress"><div id="quota-meter-bar" class="quota-meter-bar bar" style="width: {{quota_percent}}%"></div>
{{! TODO: remove the hardcoded style }}
@@ -8,7 +8,7 @@
</div></script>
-<script type="text/template" class="template-history" id="template-user-quotaMeter-usage">
+<script type="text/template" class="template-user" id="template-user-quotaMeter-usage">
{{! TODO: remove the hardcoded styles }}
<div id="quota-meter" class="quota-meter" style="background-color: transparent"><div id="quota-meter-text" class="quota-meter-text" style="top: 6px; color: white">
@@ -16,3 +16,28 @@
</div></div></script>
+
+<script type="text/template" class="template-ui" id="template-popupmenu-menu">
+<ul id="{{ id }}-menu" class="dropdown-menu">
+{{#if options.length }}
+ {{#each options }}
+ {{#if divider }}
+ <li class="divider"></li>
+ {{else}}
+ {{#if header }}
+ <li class="head"><a href=""javascript:void(0);">{{{ html }}}</a></li>
+ {{else}}
+ {{!NOTE: changed from # to void fn }}
+ <li><a href="{{#if href }}{{ href }}{{else}}javascript:void(0);{{/if}}"
+ {{#if href }}target="{{ target }}"{{/if}} class="popupmenu-option">
+ {{#if checked }}<span class="ficon ok"></span>{{/if}}
+ {{{ html }}}
+ </a></li>
+ {{/if}}
+ {{/if}}
+ {{/each}}
+{{else}}
+ <li>No Options.</li>
+{{/if}}
+</ul>
+</script>
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 templates/base.mako
--- a/templates/base.mako
+++ b/templates/base.mako
@@ -31,11 +31,18 @@
"libs/jquery/jquery",
"libs/json2",
"libs/bootstrap",
- "galaxy.base",
"libs/underscore",
"libs/backbone/backbone",
"libs/backbone/backbone-relational",
"libs/handlebars.runtime",
+ "galaxy.base"
+ )}
+
+ ${h.templates(
+ "template-popupmenu-menu"
+ )}
+
+ ${h.js(
"mvc/ui"
)}
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 templates/base/base_panels.mako
--- a/templates/base/base_panels.mako
+++ b/templates/base/base_panels.mako
@@ -56,9 +56,17 @@
'libs/backbone/backbone',
'libs/backbone/backbone-relational',
'libs/handlebars.runtime',
- 'mvc/ui',
'galaxy.base'
)}
+
+ ${h.templates(
+ "template-popupmenu-menu"
+ )}
+
+ ${h.js(
+ "mvc/ui"
+ )}
+
<script type="text/javascript">
// console protection
window.console = window.console || {
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 templates/root/alternate_history.mako
--- a/templates/root/alternate_history.mako
+++ b/templates/root/alternate_history.mako
@@ -223,10 +223,12 @@
${h.js(
"libs/jquery/jstorage",
"libs/jquery/jquery.autocomplete", "galaxy.autocom_tagging",
- "libs/json2",
+ ##"libs/json2",
##"libs/bootstrap",
- "libs/backbone/backbone-relational",
- "mvc/base-mvc", "mvc/ui"
+ ## I think we can remove some of these
+ ##"libs/backbone/backbone-relational",
+ "mvc/base-mvc",
+ ##"mvc/ui"
)}
${h.templates(
@@ -302,13 +304,9 @@
galaxyPageSetUp();
Galaxy.historyFrame = window;
+ var debugging = ( new PersistantStorage( '__history_panel' ).get( 'debugging' ) || false );
+
// ostensibly, this is the App
- //if( window.console && console.debug ){
- // //if( console.clear ){ console.clear(); }
- // console.pretty = function( o ){ $( '<pre/>' ).text( JSON.stringify( o, null, ' ' ) ).appendTo( 'body' ); }
- // top.storage = jQuery.jStorage
- //}
-
// LOAD INITIAL DATA IN THIS PAGE - since we're already sending it...
// ...use mako to 'bootstrap' the models
var user = ${ get_current_user() },
@@ -325,7 +323,7 @@
var historyPanel = new HistoryPanel({
model : new History( history, hdas ),
urlTemplates : galaxy_paths.attributes,
- //logger : console,
+ logger : ( debugging )?( console ):( null ),
// is page sending in show settings? if so override history's
show_deleted : ${ 'true' if show_deleted == True else ( 'null' if show_deleted == None else 'false' ) },
show_hidden : ${ 'true' if show_hidden == True else ( 'null' if show_hidden == None else 'false' ) }
@@ -336,13 +334,17 @@
//historyPanel = new HistoryPanel({
// model: new History(),
// urlTemplates : galaxy_paths.attributes,
- // logger : console,
+ // logger : ( debugging )?( console ):( null ),
// // is page sending in show settings? if so override history's
// show_deleted : ${ 'true' if show_deleted == True else ( 'null' if show_deleted == None else 'false' ) },
// show_hidden : ${ 'true' if show_hidden == True else ( 'null' if show_hidden == None else 'false' ) }
//});
//historyPanel.model.loadFromApi( history.id );
+ // set it up to be accessible across iframes
+ //TODO:?? mem leak
+ top.Galaxy.currHistoryPanel = historyPanel;
+
// QUOTA METER is a cross-frame ui element (meter in masthead, over quota message in history)
// create it and join them here for now (via events)
@@ -352,6 +354,7 @@
//window.currUser.logger = console;
var quotaMeter = new UserQuotaMeter({
model : currUser,
+ //logger : ( debugging )?( console ):( null ),
el : $( top.document ).find( '.quota-meter-container' )
});
//quotaMeter.logger = console; window.quotaMeter = quotaMeter
@@ -373,9 +376,81 @@
quotaMeter.update()
}, quotaMeter );
- // set it up to be accessible across iframes
- //TODO:?? mem leak
- top.Galaxy.currHistoryPanel = historyPanel;
+
+ //ANOTHER cross-frame element is the history-options-button...
+ // in this case, we need to change the popupmenu options listed to include some functions for this history
+ // these include: current (1 & 2) 'show/hide' delete and hidden functions, and (3) the collapse all option
+ (function(){
+ // don't try this if the history panel is in it's own window
+ if( top.document === window.document ){
+ return;
+ }
+
+ // lots of wtf here...due to infernalframes
+ var $historyButtonWindow = $( top.document ),
+ HISTORY_MENU_BUTTON_ID = 'history-options-button',
+ $historyMenuButton = $historyButtonWindow.find( '#' + HISTORY_MENU_BUTTON_ID ),
+ // jq data in another frame can only be accessed by the jQuery in that frame,
+ // get the jQuery from the top frame (that contains the history-options-button)
+ START_INSERTING_AT_INDEX = 11,
+ COLLAPSE_OPTION_TEXT = _l("Collapse Expanded Datasets"),
+ DELETED_OPTION_TEXT = _l("Include Deleted Datasets"),
+ HIDDEN_OPTION_TEXT = _l("Include Hidden Datasets");
+ windowJQ = $( top )[0].jQuery,
+ popupMenu = ( windowJQ && $historyMenuButton[0] )?( windowJQ.data( $historyMenuButton[0], 'PopupMenu' ) )
+ :( null );
+
+ //console.debug(
+ // '$historyButtonWindow:', $historyButtonWindow,
+ // '$historyMenuButton:', $historyMenuButton,
+ // 'windowJQ:', windowJQ,
+ // 'popupmenu:', popupMenu
+ //);
+ if( !popupMenu ){ return; }
+
+ // since the history frame reloads so often (compared to the main window),
+ // we need to check whether these options are there already before we add them again
+ //NOTE: we use the global here because these remain bound in the main window even if panel refreshes
+ //TODO: too much boilerplate
+ if( popupMenu.findIndexByHtml( COLLAPSE_OPTION_TEXT ) === null ){
+ popupMenu.addItem({
+ html : COLLAPSE_OPTION_TEXT,
+ func : function() {
+ Galaxy.currHistoryPanel.collapseAllHdaBodies();
+ }
+ }, START_INSERTING_AT_INDEX )
+ }
+
+ var deletedOptionIndex = popupMenu.findIndexByHtml( DELETED_OPTION_TEXT );
+ if( deletedOptionIndex === null ){
+ popupMenu.addItem({
+ html : DELETED_OPTION_TEXT,
+ func : function( clickEvent, thisMenuOption ){
+ var show_deleted = Galaxy.currHistoryPanel.toggleShowDeleted();
+ thisMenuOption.checked = show_deleted;
+ }
+ }, START_INSERTING_AT_INDEX + 1 )
+ deletedOptionIndex = START_INSERTING_AT_INDEX + 1;
+ }
+ // whether was there or added, update the checked option to reflect the panel's settings on the panel render
+ popupMenu.options[ deletedOptionIndex ].checked = Galaxy.currHistoryPanel.storage.get( 'show_deleted' );
+
+ var hiddenOptionIndex = popupMenu.findIndexByHtml( HIDDEN_OPTION_TEXT );
+ if( hiddenOptionIndex === null ){
+ popupMenu.addItem({
+ html : HIDDEN_OPTION_TEXT,
+ func : function( clickEvent, thisMenuOption ){
+ var show_hidden = Galaxy.currHistoryPanel.toggleShowHidden();
+ thisMenuOption.checked = show_hidden;
+ }
+ }, START_INSERTING_AT_INDEX + 2 )
+ hiddenOptionIndex = START_INSERTING_AT_INDEX + 2;
+ }
+ // whether was there or added, update the checked option to reflect the panel's settings on the panel render
+ popupMenu.options[ hiddenOptionIndex ].checked = Galaxy.currHistoryPanel.storage.get( 'show_hidden' );
+ })();
+
+ //TODO: both the quota meter and the options-menu stuff need to be moved out when iframes are removed
return;
});
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 templates/root/index.mako
--- a/templates/root/index.mako
+++ b/templates/root/index.mako
@@ -10,7 +10,7 @@
$(function(){
// Init history options.
$("#history-options-button").css( "position", "relative" );
- make_popupmenu( $("#history-options-button"), {
+ var popupmenu = PopupMenu.make_popupmenu( $("#history-options-button"), {
"${_("History Lists")}": null,
"${_("Saved Histories")}": function() {
galaxy_main.location = "${h.url_for( controller='history', action='list')}";
@@ -40,18 +40,6 @@
"${_("Resume Paused Jobs")}": function() {
galaxy_history.location = "${h.url_for( controller='history', action='resume_paused_jobs', current=True)}";
},
- "${_("Collapse Expanded Datasets")}": function() {
- Galaxy.currHistoryPanel.collapseAllHdaBodies();
- //galaxy_history.location = "${h.url_for( controller='root', action='history', show_deleted=True)}";
- },
- "${_("Show/Hide Deleted Datasets")}": function() {
- Galaxy.currHistoryPanel.toggleShowDeleted();
- //galaxy_history.location = "${h.url_for( controller='root', action='history', show_deleted=True)}";
- },
- "${_("Show/Hide Hidden Datasets")}": function() {
- Galaxy.currHistoryPanel.toggleShowHidden();
- //galaxy_history.location = "${h.url_for( controller='root', action='history', show_hidden=True)}";
- },
"${_("Unhide Hidden Datasets")}": function() {
if ( confirm( "Really unhide all hidden datasets?" ) ) {
galaxy_main.location = "${h.url_for( controller='history', action='unhide_datasets', current=True )}";
@@ -83,7 +71,6 @@
galaxy_main.location = "${h.url_for( controller='history', action='import_archive' )}";
}
});
-
});
</script></%def>
diff -r 330f05e523aee275c91f3e5de1177f8eb832d512 -r 6d7e637883b7e0e4c72c08a1269ca422da087661 test/functional/test_history_functions.py
--- a/test/functional/test_history_functions.py
+++ b/test/functional/test_history_functions.py
@@ -14,11 +14,12 @@
name = 'anonymous'
self.new_history( name=name )
global anonymous_history
- anonymous_history = sa_session.query( galaxy.model.History ) \
- .filter( and_( galaxy.model.History.table.c.deleted==False,
- galaxy.model.History.table.c.name==name ) ) \
- .order_by( desc( galaxy.model.History.table.c.create_time ) ) \
- .first()
+ anonymous_history = (
+ sa_session.query( galaxy.model.History )
+ .filter( and_( galaxy.model.History.table.c.deleted==False, galaxy.model.History.table.c.name==name ) )
+ .order_by( desc( galaxy.model.History.table.c.create_time ) )
+ .first()
+ )
assert anonymous_history is not None, "Problem retrieving anonymous_history from database"
# Upload a dataset to anonymous_history so it will be set as the current history after login
self.upload_file( '1.bed', dbkey='hg18' )
@@ -235,27 +236,35 @@
# Check list of histories to make sure shared history3 was cloned
strings_displayed=[ "Clone of '%s' shared by '%s'" % ( history3.name, admin_user.email ) ]
self.view_stored_active_histories( strings_displayed=strings_displayed )
+
def test_035_clone_current_history( self ):
"""Testing cloning the current history"""
# logged in as regular_user1
self.logout()
self.login( email=admin_user.email )
+
# Current history should be history3, add more datasets to history3, then delete them so we can
# test cloning activatable datasets as well as only the active datasets
self.upload_file( '2.bed', dbkey='hg18' )
- hda_2_bed = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
- .filter( and_( galaxy.model.HistoryDatasetAssociation.table.c.history_id==history3.id,
- galaxy.model.HistoryDatasetAssociation.table.c.name=='2.bed' ) ) \
- .first()
+ hda_2_bed = (
+ sa_session.query( galaxy.model.HistoryDatasetAssociation )
+ .filter( and_( galaxy.model.HistoryDatasetAssociation.table.c.history_id==history3.id,
+ galaxy.model.HistoryDatasetAssociation.table.c.name=='2.bed' ) )
+ .first()
+ )
assert hda_2_bed is not None, "Problem retrieving hda_2_bed from database"
self.delete_history_item( str( hda_2_bed.id ) )
+
self.upload_file( '3.bed', dbkey='hg18' )
- hda_3_bed = sa_session.query( galaxy.model.HistoryDatasetAssociation ) \
- .filter( and_( galaxy.model.HistoryDatasetAssociation.table.c.history_id==history3.id,
- galaxy.model.HistoryDatasetAssociation.table.c.name=='3.bed' ) ) \
- .first()
+ hda_3_bed = (
+ sa_session.query( galaxy.model.HistoryDatasetAssociation )
+ .filter( and_( galaxy.model.HistoryDatasetAssociation.table.c.history_id==history3.id,
+ galaxy.model.HistoryDatasetAssociation.table.c.name=='3.bed' ) )
+ .first()
+ )
assert hda_3_bed is not None, "Problem retrieving hda_3_bed from database"
self.delete_history_item( str( hda_3_bed.id ) )
+
# Test cloning activatable datasets
self.clone_history( self.security.encode_id( history3.id ),
'activatable',
@@ -267,6 +276,7 @@
.order_by( desc( galaxy.model.History.table.c.create_time ) ) \
.first()
assert history3_clone2 is not None, "Problem retrieving history3_clone2 from database"
+
# Check list of histories to make sure shared history3 was cloned
self.view_stored_active_histories( strings_displayed=[ "Clone of '%s'" % history3.name ] )
# Switch to the cloned history to make sure activatable datasets were cloned
@@ -307,6 +317,7 @@
raise AssertionError, "Deleted datasets incorrectly included in cloned history history3_clone3"
except:
pass
+
def test_040_sharing_mulitple_histories_with_multiple_users( self ):
"""Testing sharing multiple histories containing only public datasets with multiple users"""
# Logged in as admin_user
https://bitbucket.org/galaxy/galaxy-central/changeset/cba8dbdb8312/
changeset: cba8dbdb8312
user: carlfeberhard
date: 2012-12-07 20:00:51
summary: clean up; pack
affected #: 3 files
diff -r 6d7e637883b7e0e4c72c08a1269ca422da087661 -r cba8dbdb8312dcfa93e0be299fb560c067266064 static/scripts/mvc/history/history-model.js
--- a/static/scripts/mvc/history/history-model.js
+++ b/static/scripts/mvc/history/history-model.js
@@ -66,7 +66,6 @@
//});
//this.bind( 'all', function( event ){
// //this.log( this + '', arguments );
- // console.info( this + '', arguments );
//});
},
diff -r 6d7e637883b7e0e4c72c08a1269ca422da087661 -r cba8dbdb8312dcfa93e0be299fb560c067266064 static/scripts/mvc/ui.js
--- a/static/scripts/mvc/ui.js
+++ b/static/scripts/mvc/ui.js
@@ -190,7 +190,6 @@
// default settings
this.$button = $button || $( '<div/>' );
this.options = options || [];
- //console.debug( this + '.initialize, button:', $button, ', options:', options );
// set up button click -> open menu behavior
var menu = this;
@@ -230,7 +229,6 @@
// sets menu div id to '{{ id }}-menu'
id : this.$button.attr( 'id' )
}));
- //console.debug( this.$el, ':', this.$el.html() );
// set up behavior on each link/anchor elem
if( this.options.length ){
@@ -239,7 +237,6 @@
$anchor = $li.children( 'a.popupmenu-option' ),
menuFunc = menu.options[ i ].func;
- //console.debug( 'setting up behavior:', i, menu.options[ i ], $li, $anchor );
if( $anchor.length && menuFunc ){
$anchor.click( function( event ){
menuFunc( event, menu.options[ i ] );
diff -r 6d7e637883b7e0e4c72c08a1269ca422da087661 -r cba8dbdb8312dcfa93e0be299fb560c067266064 static/scripts/packed/mvc/ui.js
--- a/static/scripts/packed/mvc/ui.js
+++ b/static/scripts/packed/mvc/ui.js
@@ -1,1 +1,1 @@
-var IconButton=Backbone.Model.extend({defaults:{title:"",icon_class:"",on_click:null,menu_options:null,tooltip_config:{},isMenuButton:true,id:null,href:null,target:null,enabled:true,visible:true}});var IconButtonView=Backbone.View.extend({initialize:function(){this.model.attributes.tooltip_config={placement:"bottom"};this.model.bind("change",this.render,this)},render:function(){this.$el.tooltip("hide");var a=$(Handlebars.partials.iconButton(this.model.toJSON()));a.tooltip(this.model.get("tooltip_config"));this.$el.replaceWith(a);this.setElement(a);return this},events:{click:"click"},click:function(a){if(this.model.attributes.on_click){this.model.attributes.on_click(a);return false}return true}});IconButtonView.templates={iconButton:Handlebars.partials.iconButton};var IconButtonCollection=Backbone.Collection.extend({model:IconButton});var IconButtonMenuView=Backbone.View.extend({tagName:"div",initialize:function(){this.render()},render:function(){var a=this;this.collection.each(function(d){var b=$("<a/>").attr("href","javascript:void(0)").attr("title",d.attributes.title).addClass("icon-button menu-button").addClass(d.attributes.icon_class).appendTo(a.$el).click(d.attributes.on_click);if(d.attributes.tooltip_config){b.tooltip(d.attributes.tooltip_config)}var c=d.get("options");if(c){make_popupmenu(b,c)}});return this}});var create_icon_buttons_menu=function(b,a){if(!a){a={}}var c=new IconButtonCollection(_.map(b,function(d){return new IconButton(_.extend(d,a))}));return new IconButtonMenuView({collection:c})};var Grid=Backbone.Collection.extend({});var GridView=Backbone.View.extend({});var GalaxyPaths=Backbone.Model.extend({defaults:{root_path:"",image_path:""}});var PopupMenu=Backbone.View.extend({templates:{wrapper:(function(){var a=['<ul id="<%= id %>-menu" class="dropdown-menu">',"<% if( options.length ){ %>","<% for( var i=0; i<options.length; i++ ){ var option = options[ i ]; %>","<% if( option.divider ){ %>",'<li class="divider"></li>',"<% } else { %>","<% if( option.header ){ %>",'<li class="head"><a href=""javascript:void(0);"><%- option.html %></a></li>',"<% } else { %>","<li><a ",'href="<% print( ( option.href )?( option.href ):( "javascript:void(0);" ) ) %>" ','<% if( option.target ){ %>target="<%= option.target %>" <% } %>','class="popupmenu-option">','<% if( option.checked ){ %><span class="ficon ok"></span><% } %>',"<%- option.html %>","</a></li>","<% } %>","<% } %>","<% } %>","<% } else { %>","<li>No Options.</li>","<% } %>","</ul>"];return _.template(a.join(""))}())},initialize:function(b,a){this.$button=b||$("<div/>");this.options=a||[];var c=this;this.$button.click(function(d){c._renderAndShow(d);return false});this.$button.data("PopupMenu",this);if(!this.templates.wrapper){this.templates.wrapper=Handlebars.templates["template-popupmenu-wrapper"]}},render:function(){var a=this;this.$el.addClass("popmenu-wrapper").css({position:"absolute",display:"none"});this.$el.html(PopupMenu.templates.menu({options:this.options,id:this.$button.attr("id")}));if(this.options.length){this.$el.find("li").each(function(c,b){var f=$(b),e=f.children("a.popupmenu-option"),d=a.options[c].func;if(e.length&&d){e.click(function(g){d(g,a.options[c])})}a.options[c].$li=f})}return this},_getShownPosition:function(b){var c=this.$el.width(),a=b.pageX-c/2;a=Math.min(a,$(document).scrollLeft()+$(window).width()-c-5);a=Math.max(a,$(document).scrollLeft()+5);return{top:b.pageY,left:a}},_renderAndShow:function(a){this.render();this.$el.appendTo("body");this.$el.css(this._getShownPosition(a));this._setUpCloseBehavior();this.$el.show()},_setUpCloseBehavior:function(){var b=this,a=function(c){c.bind("click.close_popup",function(){b.remove();c.unbind("click.close_popup")})};a($(window.document));a($(window.top.document));_.each(window.top.frames,function(c){a($(c.document))})},addItem:function(b,a){a=(a>=0)?(a):(this.options.length);this.options.splice(a,0,b);return this},removeItem:function(a){if(a>=0){this.options.splice(a,1)}return this},findIndexByHtml:function(b){for(var a=0;a<this.options.length;a++){if((_.has(this.options[a],"html"))&&(this.options[a].html===b)){return a}}return null},findItemByHtml:function(a){return this.options[(this.findIndexByHtml(a))]},toString:function(){return"PopupMenu"}});PopupMenu.templates={menu:Handlebars.templates["template-popupmenu-menu"]};PopupMenu.make_popupmenu=function(b,c){var a=[];_.each(c,function(f,d){var e={html:d};if(f===null){e.header=true}else{if(jQuery.type(f)==="function"){e.func=f}}a.push(e)});return new PopupMenu($(b),a)};PopupMenu.convertLinksToOptions=function(c,a){c=$(c);a=a||"a";var b=[];c.find(a).each(function(g,e){var f={},d=$(g);f.html=d.text();if(j){var j=d.attr("href"),k=d.attr("target"),h=d.attr("confirm");f.func=function(){if((h)&&(!confirm(h))){return}var i;switch(k){case"_parent":window.parent.location=j;break;case"_top":window.top.location=j;break;case"demo":if(i===undefined||i.closed){i=window.open(j,k);i.creator=self}break;default:window.location=j}}}b.push(f)});return b};PopupMenu.fromExistingDom=function(d,c,a){d=$(d);c=$(c);var b=PopupMenu.convertLinksToOptions(c,a);c.remove();return new PopupMenu(d,b)};PopupMenu.make_popup_menus=function(c,b,d){c=c||document;b=b||"div[popupmenu]";d=d||function(e,f){return"#"+e.attr("popupmenu")};var a=[];$(c).find(b).each(function(){var e=$(this),f=$(c).find(d(e,c));a.push(PopupMenu.fromDom(f,e));f.addClass("popup")});return a};
\ No newline at end of file
+var IconButton=Backbone.Model.extend({defaults:{title:"",icon_class:"",on_click:null,menu_options:null,tooltip_config:{},isMenuButton:true,id:null,href:null,target:null,enabled:true,visible:true}});var IconButtonView=Backbone.View.extend({initialize:function(){this.model.attributes.tooltip_config={placement:"bottom"};this.model.bind("change",this.render,this)},render:function(){this.$el.tooltip("hide");var a=$(Handlebars.partials.iconButton(this.model.toJSON()));a.tooltip(this.model.get("tooltip_config"));this.$el.replaceWith(a);this.setElement(a);return this},events:{click:"click"},click:function(a){if(this.model.attributes.on_click){this.model.attributes.on_click(a);return false}return true}});IconButtonView.templates={iconButton:Handlebars.partials.iconButton};var IconButtonCollection=Backbone.Collection.extend({model:IconButton});var IconButtonMenuView=Backbone.View.extend({tagName:"div",initialize:function(){this.render()},render:function(){var a=this;this.collection.each(function(d){var b=$("<a/>").attr("href","javascript:void(0)").attr("title",d.attributes.title).addClass("icon-button menu-button").addClass(d.attributes.icon_class).appendTo(a.$el).click(d.attributes.on_click);if(d.attributes.tooltip_config){b.tooltip(d.attributes.tooltip_config)}var c=d.get("options");if(c){make_popupmenu(b,c)}});return this}});var create_icon_buttons_menu=function(b,a){if(!a){a={}}var c=new IconButtonCollection(_.map(b,function(d){return new IconButton(_.extend(d,a))}));return new IconButtonMenuView({collection:c})};var Grid=Backbone.Collection.extend({});var GridView=Backbone.View.extend({});var GalaxyPaths=Backbone.Model.extend({defaults:{root_path:"",image_path:""}});var PopupMenu=Backbone.View.extend({initialize:function(b,a){this.$button=b||$("<div/>");this.options=a||[];var c=this;this.$button.click(function(d){c._renderAndShow(d);return false});this.$button.data("PopupMenu",this);if(!this.templates.wrapper){this.templates.wrapper=Handlebars.templates["template-popupmenu-wrapper"]}},render:function(){var a=this;this.$el.addClass("popmenu-wrapper").css({position:"absolute",display:"none"});this.$el.html(PopupMenu.templates.menu({options:this.options,id:this.$button.attr("id")}));if(this.options.length){this.$el.find("li").each(function(c,b){var f=$(b),e=f.children("a.popupmenu-option"),d=a.options[c].func;if(e.length&&d){e.click(function(g){d(g,a.options[c])})}a.options[c].$li=f})}return this},_getShownPosition:function(b){var c=this.$el.width(),a=b.pageX-c/2;a=Math.min(a,$(document).scrollLeft()+$(window).width()-c-5);a=Math.max(a,$(document).scrollLeft()+5);return{top:b.pageY,left:a}},_renderAndShow:function(a){this.render();this.$el.appendTo("body");this.$el.css(this._getShownPosition(a));this._setUpCloseBehavior();this.$el.show()},_setUpCloseBehavior:function(){var b=this,a=function(c){c.bind("click.close_popup",function(){b.remove();c.unbind("click.close_popup")})};a($(window.document));a($(window.top.document));_.each(window.top.frames,function(c){a($(c.document))})},addItem:function(b,a){a=(a>=0)?(a):(this.options.length);this.options.splice(a,0,b);return this},removeItem:function(a){if(a>=0){this.options.splice(a,1)}return this},findIndexByHtml:function(b){for(var a=0;a<this.options.length;a++){if((_.has(this.options[a],"html"))&&(this.options[a].html===b)){return a}}return null},findItemByHtml:function(a){return this.options[(this.findIndexByHtml(a))]},toString:function(){return"PopupMenu"}});PopupMenu.templates={menu:Handlebars.templates["template-popupmenu-menu"]};PopupMenu.make_popupmenu=function(b,c){var a=[];_.each(c,function(f,d){var e={html:d};if(f===null){e.header=true}else{if(jQuery.type(f)==="function"){e.func=f}}a.push(e)});return new PopupMenu($(b),a)};PopupMenu.convertLinksToOptions=function(c,a){c=$(c);a=a||"a";var b=[];c.find(a).each(function(g,e){var f={},d=$(g);f.html=d.text();if(j){var j=d.attr("href"),k=d.attr("target"),h=d.attr("confirm");f.func=function(){if((h)&&(!confirm(h))){return}var i;switch(k){case"_parent":window.parent.location=j;break;case"_top":window.top.location=j;break;case"demo":if(i===undefined||i.closed){i=window.open(j,k);i.creator=self}break;default:window.location=j}}}b.push(f)});return b};PopupMenu.fromExistingDom=function(d,c,a){d=$(d);c=$(c);var b=PopupMenu.convertLinksToOptions(c,a);c.remove();return new PopupMenu(d,b)};PopupMenu.make_popup_menus=function(c,b,d){c=c||document;b=b||"div[popupmenu]";d=d||function(e,f){return"#"+e.attr("popupmenu")};var a=[];$(c).find(b).each(function(){var e=$(this),f=$(c).find(d(e,c));a.push(PopupMenu.fromDom(f,e));f.addClass("popup")});return a};
\ 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
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/d50bf81b0966/
changeset: d50bf81b0966
user: inithello
date: 2012-12-07 18:04:42
summary: Generate new metadata when repository dependencies have been added or removed.
affected #: 1 file
diff -r 0b3db8ce29d68bf7fe8e2a37699f58c2d9fdbddb -r d50bf81b096669ae82b614b94a606be773943445 lib/galaxy/webapps/community/controllers/common.py
--- a/lib/galaxy/webapps/community/controllers/common.py
+++ b/lib/galaxy/webapps/community/controllers/common.py
@@ -504,6 +504,35 @@
# Reset the tool_data_tables by loading the empty tool_data_table_conf.xml file.
reset_tool_data_tables( trans.app )
return repository, tool, message
+def new_repository_dependency_metadata_required( trans, repository, metadata_dict ):
+ """
+ Compare the last saved metadata for each repository dependency in the repository with the new
+ metadata in metadata_dict to determine if a new repository_metadata table record is required,
+ or if the last saved metadata record can be updated instead.
+ """
+ if 'repository_dependencies' in metadata_dict:
+ repository_metadata = get_latest_repository_metadata( trans, repository.id )
+ if repository_metadata:
+ metadata = repository_metadata.metadata
+ if metadata and 'repository_dependencies' in metadata:
+ saved_repository_dependencies = metadata[ 'repository_dependencies' ][ 'repository_dependencies' ]
+ new_repository_dependencies = metadata_dict[ 'repository_dependencies' ][ 'repository_dependencies' ]
+ # The saved metadata must be a subset of the new metadata.
+ for new_repository_dependency_metadata in new_repository_dependencies:
+ if new_repository_dependency_metadata not in saved_repository_dependencies:
+ return True
+ for saved_repository_dependency_metadata in saved_repository_dependencies:
+ if saved_repository_dependency_metadata not in new_repository_dependencies:
+ return True
+ else:
+ # We have repository metadata that does not include metadata for any repository dependencies in the
+ # repository, so we can update the existing repository metadata.
+ return False
+ else:
+ # There is no saved repository metadata, so we need to create a new repository_metadata table record.
+ return True
+ # The received metadata_dict includes no metadata for repository dependencies, so a new repository_metadata table record is not needed.
+ return False
def new_tool_metadata_required( trans, repository, metadata_dict ):
"""
Compare the last saved metadata for each tool in the repository with the new metadata in metadata_dict to determine if a new repository_metadata
@@ -579,7 +608,9 @@
if metadata_dict:
downloadable = is_downloadable( metadata_dict )
repository_metadata = None
- if new_tool_metadata_required( trans, repository, metadata_dict ) or new_workflow_metadata_required( trans, repository, metadata_dict ):
+ if new_repository_dependency_metadata_required( trans, repository, metadata_dict ) or \
+ new_tool_metadata_required( trans, repository, metadata_dict ) or \
+ new_workflow_metadata_required( trans, repository, metadata_dict ):
# Create a new repository_metadata table row.
repository_metadata = create_or_update_repository_metadata( trans,
encoded_id,
https://bitbucket.org/galaxy/galaxy-central/changeset/330f05e523ae/
changeset: 330f05e523ae
user: inithello
date: 2012-12-07 18:05:43
summary: Tool shed functional tests for repository dependency features. Cleaned up import *s.
affected #: 9 files
diff -r d50bf81b096669ae82b614b94a606be773943445 -r 330f05e523aee275c91f3e5de1177f8eb832d512 test/tool_shed/base/common.py
--- a/test/tool_shed/base/common.py
+++ b/test/tool_shed/base/common.py
@@ -9,7 +9,7 @@
test_user_1_name = 'user1'
new_repository_dependencies_xml = '''<?xml version="1.0"?>
-<repositories>
+<repositories${description}><repository toolshed="${toolshed_url}" name="${repository_name}" owner="${owner}" changeset_revision="${changeset_revision}" /></repositories>
'''
diff -r d50bf81b096669ae82b614b94a606be773943445 -r 330f05e523aee275c91f3e5de1177f8eb832d512 test/tool_shed/base/twilltestcase.py
--- a/test/tool_shed/base/twilltestcase.py
+++ b/test/tool_shed/base/twilltestcase.py
@@ -1,8 +1,7 @@
-from base.twilltestcase import *
-from galaxy.webapps.community.util.hgweb_config import *
-from test_db_util import *
-from common import *
-import string
+import galaxy.webapps.community.util.hgweb_config
+import common, string, os
+from base.twilltestcase import tc, from_json_string, TwillTestCase, security
+from test_db_util import get_repository_metadata_by_repository_id_changeset_revision
from galaxy import eggs
eggs.require('mercurial')
@@ -14,7 +13,7 @@
self.security = security.SecurityHelper( id_secret='changethisinproductiontoo' )
self.history_id = None
self.hgweb_config_dir = os.environ.get( 'TEST_HG_WEB_CONFIG_DIR' )
- self.hgweb_config_manager = HgWebConfigManager()
+ self.hgweb_config_manager = galaxy.webapps.community.util.hgweb_config.HgWebConfigManager()
self.hgweb_config_manager.hgweb_config_dir = self.hgweb_config_dir
self.host = os.environ.get( 'TOOL_SHED_TEST_HOST' )
self.port = os.environ.get( 'TOOL_SHED_TEST_PORT' )
@@ -138,8 +137,12 @@
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_manage_repository_page( self, repository, strings_displayed=[], strings_not_displayed=[] ):
- url = '/repository/manage_repository?id=%s' % self.security.encode_id( repository.id )
+ 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:
+ url = '%s&changeset_revision=%s' % ( base_url, changeset_revision )
+ else:
+ url = base_url
self.visit_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
def display_repository_clone_page( self, owner_name, repository_name, strings_displayed=[], strings_not_displayed=[] ):
@@ -209,14 +212,19 @@
else:
string = string.replace( character, replacement )
return string
- def generate_repository_dependency_xml( self, repository, xml_filename ):
+ def generate_repository_dependency_xml( self, repository, xml_filename, dependency_description='' ):
changeset_revision = self.get_repository_tip( repository )
- template_parser = string.Template( new_repository_dependencies_xml )
+ if dependency_description:
+ description = ' description="%s"' % dependency_description
+ else:
+ description = dependency_description
+ template_parser = string.Template( common.new_repository_dependencies_xml )
repository_dependency_xml = template_parser.safe_substitute( toolshed_url=self.url,
owner=repository.user.username,
repository_name=repository.name,
- changeset_revision=changeset_revision )
- # Save the generated xml to test-data/emboss_5/repository_dependencies.xml.
+ changeset_revision=changeset_revision,
+ description=description )
+ # Save the generated xml to the specified location.
file( xml_filename, 'w' ).write( repository_dependency_xml )
def get_latest_repository_metadata_for_repository( self, repository ):
# TODO: This will not work as expected. Fix it.
@@ -293,6 +301,13 @@
( 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 repository_is_new( self, repository ):
+ repo = hg.repository( ui.ui(), self.get_repo_path( repository ) )
+ tip_ctx = repo.changectx( repo.changelog.tip() )
+ return tip_ctx.rev() < 0
+ def reset_repository_metadata( self, repository ):
+ url = '/repository/reset_all_metadata?id=%s' % self.security.encode_id( repository.id )
+ self.visit_url( url )
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 )
diff -r d50bf81b096669ae82b614b94a606be773943445 -r 330f05e523aee275c91f3e5de1177f8eb832d512 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 *
-from tool_shed.base.test_db_util import *
+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
repository_name = 'filtering'
repository_description = "Galaxy's filtering tool"
@@ -9,14 +9,14 @@
def test_0000_initiate_users( self ):
"""Create necessary user accounts and login as an admin user."""
- self.login( email=test_user_1_email, username=test_user_1_name )
- test_user_1 = get_user( test_user_1_email )
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = 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 )
self.logout()
- self.login( email=admin_email, username=admin_username )
- admin_user = get_user( admin_email )
- assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = 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 )
def test_0005_create_categories( self ):
"""Create categories"""
@@ -33,27 +33,27 @@
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, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
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, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
self.edit_repository_categories( repository, categories_to_add=[ "Text Analysis" ], categories_to_remove=[ "Text Manipulation" ] )
def test_0025_grant_write_access( self ):
'''Grant write access to another user'''
- repository = get_repository_by_name_and_owner( repository_name, admin_username )
- self.grant_write_access( repository, usernames=[ test_user_1_name ] )
- self.revoke_write_access( repository, test_user_1_name )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
+ self.grant_write_access( repository, usernames=[ common.test_user_1_name ] )
+ self.revoke_write_access( repository, common.test_user_1_name )
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, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
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, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
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 )
@@ -61,12 +61,12 @@
self.check_repository_tools_for_changeset_revision( repository, tip )
self.check_repository_metadata( repository, tip_only=False )
self.browse_repository( repository, strings_displayed=[ 'Browse %s revision' % repository.name, '(repository tip)' ] )
- self.display_repository_clone_page( admin_username,
+ self.display_repository_clone_page( common.admin_username,
repository_name,
strings_displayed=[ 'Uploaded filtering 1.1.0', latest_changeset_revision ] )
def test_0040_alter_repository_states( self ):
'''Test toggling the malicious and deprecated repository flags.'''
- repository = get_repository_by_name_and_owner( repository_name, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
self.set_repository_malicious( repository, set_malicious=True, strings_displayed=[ 'The repository tip has been defined as malicious.' ] )
self.set_repository_malicious( repository,
set_malicious=False,
@@ -82,7 +82,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, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
self.display_repository_file_contents( repository=repository,
filename='filtering.xml',
filepath=None,
@@ -90,7 +90,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, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
self.upload_file( repository,
'filtering/filtering.txt',
commit_message="Uploaded filtering.txt",
@@ -99,7 +99,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, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
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',
@@ -109,14 +109,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, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
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, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
tip = self.get_repository_tip( repository )
self.check_for_valid_tools( repository )
strings_displayed = self.get_repository_metadata_revisions( repository ).append( 'Select a revision' )
@@ -126,7 +126,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, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
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.
@@ -134,13 +134,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, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
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, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
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 d50bf81b096669ae82b614b94a606be773943445 -r 330f05e523aee275c91f3e5de1177f8eb832d512 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 *
-from tool_shed.base.test_db_util import *
+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
repository_name = 'freebayes'
repository_description = "Galaxy's freebayes tool"
@@ -10,8 +10,8 @@
def test_0000_create_or_login_admin_user( self ):
"""Create necessary user accounts and login as an admin user."""
self.logout()
- self.login( email=admin_email, username=admin_username )
- admin_user = get_user( admin_email )
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = 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 )
def test_0005_create_category( self ):
@@ -24,7 +24,7 @@
repository_long_description=repository_long_description,
categories=[ 'SNP Analysis' ],
strings_displayed=[] )
- repository = get_repository_by_name_and_owner( repository_name, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
self.upload_file( repository,
'freebayes/freebayes.xml',
valid_tools_only=False,
@@ -37,7 +37,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, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
self.upload_file( repository,
'freebayes/tool_data_table_conf.xml.sample',
valid_tools_only=False,
@@ -50,27 +50,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, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
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, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
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, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
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, admin_username )
+ repository = get_repository_by_name_and_owner( repository_name, common.admin_username )
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 d50bf81b096669ae82b614b94a606be773943445 -r 330f05e523aee275c91f3e5de1177f8eb832d512 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,11 +1,11 @@
-from tool_shed.base.twilltestcase import *
-from tool_shed.base.test_db_util import *
+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
datatypes_repository_name = 'emboss_datatypes'
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_5'
+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'
@@ -14,56 +14,56 @@
def test_0000_initiate_users( self ):
"""Create necessary user accounts and login as an admin user."""
self.logout()
- self.login( email=admin_email, username=admin_username )
- admin_user = get_user( admin_email )
- assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = 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 )
self.logout()
- self.login( email=test_user_1_email, username=test_user_1_name )
- test_user_1 = get_user( test_user_1_email )
- assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % regular_email
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = 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 )
def test_0005_create_category( self ):
"""Create Sequence Analysis category"""
self.logout()
- self.login( email=admin_email, username=admin_username )
+ self.login( email=common.admin_email, username=common.admin_username )
self.create_category( 'Sequence Analysis', 'Tools for performing Protein and DNA/RNA analysis' )
def test_0010_create_emboss_datatypes_repository_and_upload_tarball( self ):
'''Create and populate the emboss_datatypes repository.'''
self.logout()
- self.login( email=test_user_1_email, username=test_user_1_name )
+ 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=[ 'Sequence Analysis' ],
strings_displayed=[] )
- repository = get_repository_by_name_and_owner( datatypes_repository_name, test_user_1_name )
+ repository = 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, test_user_1_name )
+ repository = 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 repository.'''
+ '''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=[ 'Text Manipulation' ],
strings_displayed=[] )
- repository = get_repository_by_name_and_owner( emboss_repository_name, test_user_1_name )
- self.upload_file( repository, 'emboss/5/emboss.tar', commit_message='Uploaded emboss_5.tar' )
+ repository = 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, test_user_1_name )
- datatypes_repository = get_repository_by_name_and_owner( datatypes_repository_name, test_user_1_name )
+ 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 )
self.generate_repository_dependency_xml( datatypes_repository, self.get_filename( 'emboss/5/repository_dependencies.xml' ) )
self.upload_file( repository, 'emboss/5/repository_dependencies.xml', 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, test_user_1_name )
- datatypes_repository = get_repository_by_name_and_owner( datatypes_repository_name, test_user_1_name )
+ 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 )
changeset_revision = self.get_repository_tip( datatypes_repository )
- strings_displayed = [ datatypes_repository_name, test_user_1_name, changeset_revision, 'Repository dependencies' ]
+ 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_0035_cleanup( self ):
'''Clean up generated test data.'''
diff -r d50bf81b096669ae82b614b94a606be773943445 -r 330f05e523aee275c91f3e5de1177f8eb832d512 test/tool_shed/functional/test_0030_repository_dependency_revisions.py
--- /dev/null
+++ b/test/tool_shed/functional/test_0030_repository_dependency_revisions.py
@@ -0,0 +1,134 @@
+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
+
+datatypes_repository_name = 'emboss_datatypes'
+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'
+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 TestRepositoryDependencyRevisions( ShedTwillTestCase ):
+ '''Test dependencies on different revisions of a repository.'''
+ '''
+ create repository emboss_5_0030
+ create repository emboss_6_0030
+ create repository emboss_datatypes if necessary
+ create repository emboss
+ emboss_5 has repository_dependency.xml file that defines emboss_datatypes
+ emboss_6 has repository_dependency.xml file that defines emboss_datatypes
+ get information to create repository dependency imformation for emboss
+ emboss depends on emboss_5
+ then emboss depends on emboss_6
+ verify per-changeset dependencies
+ '''
+ def test_0000_initiate_users( self ):
+ """Create necessary user accounts."""
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = 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 )
+ 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 )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % regular_email
+ test_user_1_private_role = get_private_role( test_user_1 )
+ def test_0005_create_repositories( self ):
+ '''Create the emboss_5_0030, emboss_6_0030, emboss_datatypes, and emboss repositories and populate the emboss_datatypes repository.'''
+ emboss_5_repository = 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=[ 'Sequence Analysis' ],
+ strings_displayed=[] )
+ emboss_5_repository = 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 )
+ if emboss_6_repository is None:
+ self.create_repository( emboss_6_repository_name,
+ emboss_repository_description,
+ repository_long_description=emboss_repository_long_description,
+ categories=[ 'Sequence Analysis' ],
+ strings_displayed=[] )
+ emboss_6_repository = 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 )
+ if datatypes_repository is None:
+ self.create_repository( datatypes_repository_name,
+ datatypes_repository_description,
+ repository_long_description=datatypes_repository_long_description,
+ categories=[ 'Sequence Analysis' ],
+ strings_displayed=[] )
+ datatypes_repository = 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 )
+ if emboss_repository is None:
+ self.create_repository( emboss_repository_name,
+ emboss_repository_description,
+ repository_long_description=emboss_repository_long_description,
+ categories=[ 'Sequence Analysis' ],
+ 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.' )
+ def test_0010_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 )
+ self.generate_repository_dependency_xml( datatypes_repository, self.get_filename( 'emboss/repository_dependencies.xml' ) )
+ emboss_5_repository = get_repository_by_name_and_owner( emboss_5_repository_name, common.test_user_1_name )
+ self.upload_file( emboss_5_repository, 'emboss/repository_dependencies.xml', commit_message='Uploaded repository_depepndencies.xml.' )
+ def test_0015_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 )
+ self.upload_file( emboss_6_repository, 'emboss/repository_dependencies.xml', commit_message='Uploaded repository_depepndencies.xml.' )
+ def test_0020_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 )
+ self.generate_repository_dependency_xml( emboss_5_repository,
+ self.get_filename( 'emboss/5/repository_dependencies.xml' ),
+ dependency_description='Emboss requires the Emboss 5 repository.' )
+ self.upload_file( emboss_repository,
+ 'emboss/5/repository_dependencies.xml',
+ commit_message='Uploaded dependency configuration specifying emboss_5' )
+ def test_0025_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 )
+ self.generate_repository_dependency_xml( emboss_6_repository,
+ self.get_filename( 'emboss/6/repository_dependencies.xml' ),
+ dependency_description='Emboss requires the Emboss 6 repository.' )
+ self.upload_file( emboss_repository,
+ 'emboss/6/repository_dependencies.xml',
+ commit_message='Uploaded dependency configuration specifying emboss_6' )
+ def test_0030_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 )
+ # Reset emboss metadata to pick up the repository dependency changes.
+# self.reset_repository_metadata( repository )
+ 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_tip = self.get_repository_tip( datatypes_repository )
+ # Iterate through all metadata revisions and check for repository dependencies.
+ for metadata, changeset_revision in repository_metadata:
+ repository_dependency_metadata = metadata[ 'repository_dependencies' ][ 'repository_dependencies' ][ 0 ]
+ # Remove the tool shed URL, because that's not displayed on the page (yet?)
+ repository_dependency_metadata.pop( repository_dependency_metadata.index( self.url ) )
+ # Add the dependency description and datatypes repository details to the strings to check.
+ repository_dependency_metadata.extend( [ metadata[ 'repository_dependencies' ][ 'description' ],
+ datatypes_repository_name,
+ datatypes_repository.user.username,
+ datatypes_tip ] )
+ self.display_manage_repository_page( repository,
+ changeset_revision=changeset_revision,
+ strings_displayed=[ str( metadata ) for metadata in repository_dependency_metadata ] )
+ def test_0035_cleanup( self ):
+ '''Clean up generated repository dependency XML files.'''
+ for filename in [ 'emboss/5/repository_dependencies.xml', 'emboss/6/repository_dependencies.xml', 'emboss/repository_dependencies.xml' ]:
+ if os.path.exists( self.get_filename( filename ) ):
+ os.remove( self.get_filename( filename ) )
diff -r d50bf81b096669ae82b614b94a606be773943445 -r 330f05e523aee275c91f3e5de1177f8eb832d512 test/tool_shed/test_data/emboss/5/emboss.tar
Binary file test/tool_shed/test_data/emboss/5/emboss.tar has changed
diff -r d50bf81b096669ae82b614b94a606be773943445 -r 330f05e523aee275c91f3e5de1177f8eb832d512 test/tool_shed/test_data/emboss/6/emboss.tar
Binary file test/tool_shed/test_data/emboss/6/emboss.tar has changed
diff -r d50bf81b096669ae82b614b94a606be773943445 -r 330f05e523aee275c91f3e5de1177f8eb832d512 test/tool_shed/test_data/emboss/emboss.tar
Binary file test/tool_shed/test_data/emboss/emboss.tar has changed
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
07 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/0b3db8ce29d6/
changeset: 0b3db8ce29d6
user: jgoecks
date: 2012-12-07 17:46:03
summary: Visualization framework enhancements: (a) refactor orphan vars and functions into mixins; (b) remove overly-qualified model references; (c) add support for multiple data types, gracefully falling back if a converter is not available; and (d) add bigwig as an index datatype for BAM.
affected #: 6 files
diff -r 6591b6ebfb4ea56118941deef03855412c2c00fd -r 0b3db8ce29d68bf7fe8e2a37699f58c2d9fdbddb lib/galaxy/datatypes/binary.py
--- a/lib/galaxy/datatypes/binary.py
+++ b/lib/galaxy/datatypes/binary.py
@@ -239,7 +239,7 @@
except:
return "Binary bam alignments file (%s)" % ( data.nice_size( dataset.get_size() ) )
def get_track_type( self ):
- return "ReadTrack", {"data": "bai", "index": "summary_tree"}
+ return "ReadTrack", { "data": "bai", "index": [ "bigwig", "summary_tree" ] }
Binary.register_sniffable_binary_format("bam", "bam", Bam)
diff -r 6591b6ebfb4ea56118941deef03855412c2c00fd -r 0b3db8ce29d68bf7fe8e2a37699f58c2d9fdbddb lib/galaxy/model/__init__.py
--- a/lib/galaxy/model/__init__.py
+++ b/lib/galaxy/model/__init__.py
@@ -872,6 +872,16 @@
PAUSED = 'paused',
SETTING_METADATA = 'setting_metadata',
FAILED_METADATA = 'failed_metadata' )
+
+ conversion_messages = Bunch( PENDING = "pending",
+ NO_DATA = "no data",
+ NO_CHROMOSOME = "no chromosome",
+ NO_CONVERTER = "no converter",
+ NO_TOOL = "no tool",
+ DATA = "data",
+ ERROR = "error",
+ OK = "ok" )
+
permitted_actions = get_permitted_actions( filter='DATASET' )
file_path = "/tmp/"
object_store = None # This get initialized in mapping.py (method init) by app.py
@@ -996,6 +1006,7 @@
class DatasetInstance( object ):
"""A base class for all 'dataset instances', HDAs, LDAs, etc"""
states = Dataset.states
+ conversion_messages = Dataset.conversion_messages
permitted_actions = Dataset.permitted_actions
def __init__( self, id=None, hid=None, name=None, info=None, blurb=None, peek=None, tool_version=None, extension=None,
dbkey=None, metadata=None, history=None, dataset=None, deleted=False, designation=None,
@@ -1170,9 +1181,9 @@
if dep_dataset is None:
# None means converter is running first time
return None
- elif dep_dataset.state == trans.app.model.Job.states.ERROR:
+ elif dep_dataset.state == Job.states.ERROR:
raise ConverterDependencyException("A dependency (%s) was in an error state." % dependency)
- elif dep_dataset.state != trans.app.model.Job.states.OK:
+ elif dep_dataset.state != Job.states.OK:
# Pending
return None
deps[dependency] = dep_dataset
@@ -1196,12 +1207,11 @@
for name, value in self.metadata.items():
# HACK: MetadataFile objects do not have a type/ext, so need to use metadata name
# to determine type.
- if dataset_ext == 'bai' and name == 'bam_index' and isinstance( value, trans.app.model.MetadataFile ):
+ if dataset_ext == 'bai' and name == 'bam_index' and isinstance( value, MetadataFile ):
# HACK: MetadataFile objects cannot be used by tools, so return
# a fake HDA that points to metadata file.
- fake_dataset = trans.app.model.Dataset( state=trans.app.model.Dataset.states.OK,
- external_filename=value.file_name )
- fake_hda = trans.app.model.HistoryDatasetAssociation( dataset=fake_dataset )
+ fake_dataset = Dataset( state=Dataset.states.OK, external_filename=value.file_name )
+ fake_hda = HistoryDatasetAssociation( dataset=fake_dataset )
return fake_hda
def clear_associated_files( self, metadata_safe = False, purge = False ):
raise 'Unimplemented'
@@ -1311,16 +1321,26 @@
track_type, data_sources = self.datatype.get_track_type()
data_sources_dict = {}
msg = None
- for source_type, data_source in data_sources.iteritems():
+ for source_type, source_list in data_sources.iteritems():
+ data_source = None
if source_type == "data_standalone":
# Nothing to do.
msg = None
+ data_source = source_list
else:
# Convert.
- msg = self.convert_dataset( trans, data_source )
+ if isinstance( source_list, str ):
+ source_list = [ source_list ]
+
+ # Loop through sources until viable one is found.
+ for source in source_list:
+ msg = self.convert_dataset( trans, source )
+ if msg == self.conversion_messages.PENDING:
+ data_source = source
+ break
# Store msg.
- data_sources_dict[ source_type ] = { "name" : data_source, "message": msg }
+ data_sources_dict[ source_type ] = { "name": data_source, "message": msg }
return data_sources_dict
@@ -1331,35 +1351,23 @@
was converted successfully.
"""
- # FIXME: copied from controller.py
- messages = Bunch(
- PENDING = "pending",
- NO_DATA = "no data",
- NO_CHROMOSOME = "no chromosome",
- NO_CONVERTER = "no converter",
- NO_TOOL = "no tool",
- DATA = "data",
- ERROR = "error",
- OK = "ok"
- )
-
# Get converted dataset; this will start the conversion if necessary.
try:
converted_dataset = self.get_converted_dataset( trans, target_type )
except NoConverterException:
- return messages.NO_CONVERTER
+ return self.conversion_messages.NO_CONVERTER
except ConverterDependencyException, dep_error:
- return { 'kind': messages.ERROR, 'message': dep_error.value }
+ return { 'kind': self.conversion_messages.ERROR, 'message': dep_error.value }
# Check dataset state and return any messages.
msg = None
- if converted_dataset and converted_dataset.state == trans.app.model.Dataset.states.ERROR:
- job_id = trans.sa_session.query( trans.app.model.JobToOutputDatasetAssociation ) \
+ if converted_dataset and converted_dataset.state == Dataset.states.ERROR:
+ job_id = trans.sa_session.query( JobToOutputDatasetAssociation ) \
.filter_by( dataset_id=converted_dataset.id ).first().job_id
- job = trans.sa_session.query( trans.app.model.Job ).get( job_id )
- msg = { 'kind': messages.ERROR, 'message': job.stderr }
- elif not converted_dataset or converted_dataset.state != trans.app.model.Dataset.states.OK:
- msg = messages.PENDING
+ job = trans.sa_session.query( Job ).get( job_id )
+ msg = { 'kind': self.conversion_messages.ERROR, 'message': job.stderr }
+ elif not converted_dataset or converted_dataset.state != Dataset.states.OK:
+ msg = self.conversion_messages.PENDING
return msg
@@ -2414,7 +2422,7 @@
elif not trans.app.config.smtp_server:
comments = "Email notification failed as SMTP server not set in config file"
if comments:
- event = trans.app.model.RequestEvent( self, self.state, comments )
+ event = RequestEvent( self, self.state, comments )
trans.sa_session.add( event )
trans.sa_session.flush()
return comments
diff -r 6591b6ebfb4ea56118941deef03855412c2c00fd -r 0b3db8ce29d68bf7fe8e2a37699f58c2d9fdbddb lib/galaxy/visualization/data_providers/registry.py
--- a/lib/galaxy/visualization/data_providers/registry.py
+++ b/lib/galaxy/visualization/data_providers/registry.py
@@ -1,6 +1,9 @@
from galaxy.visualization.data_providers.basic import ColumnDataProvider
-from galaxy.visualization.data_providers.genome import *
+from galaxy.visualization.data_providers import genome
+from galaxy.model import NoConverterException
from galaxy.visualization.data_providers.phyloviz import PhylovizDataProvider
+from galaxy.datatypes.tabular import Tabular, Vcf
+from galaxy.datatypes.interval import Interval, ENCODEPeak, ChromatinInteractions, Gtf, Gff, Bed
from galaxy.datatypes.xml import Phyloxml
from galaxy.datatypes.data import Newick, Nexus
@@ -15,20 +18,20 @@
# is original dataset type.
self.dataset_type_name_to_data_provider = {
"tabix": {
- Vcf: VcfTabixDataProvider,
- Bed: BedTabixDataProvider,
- Gtf: GtfTabixDataProvider,
- ENCODEPeak: ENCODEPeakTabixDataProvider,
- Interval: IntervalTabixDataProvider,
- ChromatinInteractions: ChromatinInteractionsTabixDataProvider,
- "default" : TabixDataProvider
+ Vcf: genome.VcfTabixDataProvider,
+ Bed: genome.BedTabixDataProvider,
+ Gtf: genome.GtfTabixDataProvider,
+ ENCODEPeak: genome.ENCODEPeakTabixDataProvider,
+ Interval: genome.IntervalTabixDataProvider,
+ ChromatinInteractions: genome.ChromatinInteractionsTabixDataProvider,
+ "default" : genome.TabixDataProvider
},
- "interval_index": IntervalIndexDataProvider,
- "bai": BamDataProvider,
- "bam": SamDataProvider,
- "summary_tree": SummaryTreeDataProvider,
- "bigwig": BigWigDataProvider,
- "bigbed": BigBedDataProvider
+ "interval_index": genome.IntervalIndexDataProvider,
+ "bai": genome.BamDataProvider,
+ "bam": genome.SamDataProvider,
+ "summary_tree": genome.SummaryTreeDataProvider,
+ "bigwig": genome.BigWigDataProvider,
+ "bigbed": genome.BigBedDataProvider
}
def get_data_provider( self, trans, name=None, source='data', raw=False, original_dataset=None ):
@@ -41,15 +44,15 @@
if raw:
# Working with raw data.
if isinstance( original_dataset.datatype, Gff ):
- data_provider_class = RawGFFDataProvider
+ data_provider_class = genome.RawGFFDataProvider
elif isinstance( original_dataset.datatype, Bed ):
- data_provider_class = RawBedDataProvider
+ data_provider_class = genome.RawBedDataProvider
elif isinstance( original_dataset.datatype, Vcf ):
- data_provider_class = RawVcfDataProvider
+ data_provider_class = genome.RawVcfDataProvider
elif isinstance( original_dataset.datatype, Tabular ):
- data_provider_class = ColumnDataProvider
+ data_provider_class = genome.ColumnDataProvider
elif isinstance( original_dataset.datatype, ( Nexus, Newick, Phyloxml ) ):
- data_provider_class = PhylovizDataProvider
+ data_provider_class = genome.PhylovizDataProvider
data_provider = data_provider_class( original_dataset=original_dataset )
@@ -87,10 +90,20 @@
# Get data provider mapping and data provider.
_ , data_provider_mapping = original_dataset.datatype.get_track_type()
if 'data_standalone' in data_provider_mapping:
- data_provider_name = data_provider_mapping[ 'data_standalone' ]
+ data_provider = self.get_data_provider( trans,
+ name=data_provider_mapping[ 'data_standalone' ],
+ original_dataset=original_dataset )
else:
- data_provider_name = data_provider_mapping[ source ]
-
- data_provider = self.get_data_provider( trans, name=data_provider_name, original_dataset=original_dataset )
+ source_list = data_provider_mapping[ source ]
+ if isinstance( source_list, str ):
+ source_list = [ source_list ]
+
+ # Find a valid data provider in the source list.
+ for source in source_list:
+ try:
+ data_provider = self.get_data_provider( trans, name=source, original_dataset=original_dataset )
+ break
+ except NoConverterException:
+ pass
return data_provider
\ No newline at end of file
diff -r 6591b6ebfb4ea56118941deef03855412c2c00fd -r 0b3db8ce29d68bf7fe8e2a37699f58c2d9fdbddb lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py
+++ b/lib/galaxy/web/base/controller.py
@@ -190,37 +190,6 @@
# -- Mixins for working with Galaxy objects. --
#
-# Message strings returned to browser
-messages = Bunch(
- PENDING = "pending",
- NO_DATA = "no data",
- NO_CHROMOSOME = "no chromosome",
- NO_CONVERTER = "no converter",
- NO_TOOL = "no tool",
- DATA = "data",
- ERROR = "error",
- OK = "ok"
-)
-
-def get_highest_priority_msg( message_list ):
- """
- Returns highest priority message from a list of messages.
- """
- return_message = None
-
- # For now, priority is: job error (dict), no converter, pending.
- for message in message_list:
- if message is not None:
- if isinstance(message, dict):
- return_message = message
- break
- elif message == messages.NO_CONVERTER:
- return_message = message
- elif return_message == None and message == messages.PENDING:
- return_message = message
- return return_message
-
-
class SharableItemSecurityMixin:
""" Mixin for handling security for sharable items. """
def security_check( self, trans, item, check_ownership=False, check_accessible=False ):
@@ -313,11 +282,11 @@
Returns a message if dataset is not ready to be used in visualization.
"""
if not dataset:
- return messages.NO_DATA
+ return dataset.conversion_messages.NO_DATA
if dataset.state == trans.app.model.Job.states.ERROR:
- return messages.ERROR
+ return dataset.conversion_messages.ERROR
if dataset.state != trans.app.model.Job.states.OK:
- return messages.PENDING
+ return dataset.conversion_messages.PENDING
return None
@@ -624,7 +593,7 @@
# If there are no messages (messages indicate data is not ready/available), get data.
messages_list = [ data_source_dict[ 'message' ] for data_source_dict in data_sources.values() ]
- message = get_highest_priority_msg( messages_list )
+ message = self._get_highest_priority_msg( messages_list )
if message:
rval = message
else:
@@ -646,6 +615,27 @@
return rval
+ # FIXME: this method probably belongs down in the model.Dataset class.
+ def _get_highest_priority_msg( self, message_list ):
+ """
+ Returns highest priority message from a list of messages.
+ """
+ return_message = None
+
+ # For now, priority is: job error (dict), no converter, pending.
+ for message in message_list:
+ if message is not None:
+ if isinstance(message, dict):
+ return_message = message
+ break
+ elif message == "no converter":
+ return_message = message
+ elif return_message == None and message == "pending":
+ return_message = message
+ return return_message
+
+
+
class UsesStoredWorkflowMixin( SharableItemSecurityMixin ):
""" Mixin for controllers that use StoredWorkflow objects. """
def get_stored_workflow( self, trans, id, check_ownership=True, check_accessible=False ):
diff -r 6591b6ebfb4ea56118941deef03855412c2c00fd -r 0b3db8ce29d68bf7fe8e2a37699f58c2d9fdbddb lib/galaxy/webapps/galaxy/api/datasets.py
--- a/lib/galaxy/webapps/galaxy/api/datasets.py
+++ b/lib/galaxy/webapps/galaxy/api/datasets.py
@@ -4,7 +4,7 @@
import logging, os, string, shutil, urllib, re, socket
from galaxy import util, datatypes, jobs, web, util
from galaxy.visualization.data_providers.genome import FeatureLocationIndexDataProvider
-from galaxy.web.base.controller import BaseAPIController, UsesVisualizationMixin, get_highest_priority_msg, messages
+from galaxy.web.base.controller import BaseAPIController, UsesVisualizationMixin
from galaxy.web.framework.helpers import is_true
log = logging.getLogger( __name__ )
@@ -64,7 +64,7 @@
msg = self.check_dataset_state( trans, dataset )
if not msg:
- msg = messages.DATA
+ msg = dataset.conversion_messages.DATA
return msg
@@ -80,7 +80,7 @@
# Get datasources and check for messages (which indicate errors). Retry if flag is set.
data_sources = dataset.get_datasources( trans )
messages_list = [ data_source_dict[ 'message' ] for data_source_dict in data_sources.values() ]
- msg = get_highest_priority_msg( messages_list )
+ msg = self._get_highest_priority_msg( messages_list )
if msg:
if retry:
# Clear datasources and then try again.
@@ -92,12 +92,12 @@
# If there is a chrom, check for data on the chrom.
if chrom:
data_provider_registry = trans.app.data_provider_registry
- data_provider = trans.app.data_provider_registry.get_data_provider( trans, original_dataset= dataset, source='index' )
+ data_provider = trans.app.data_provider_registry.get_data_provider( trans, original_dataset=dataset, source='index' )
if not data_provider.has_data( chrom ):
- return messages.NO_DATA
+ return dataset.conversion_messages.NO_DATA
# Have data if we get here
- return { "status": messages.DATA, "valid_chroms": None }
+ return { "status": dataset.conversion_messages.DATA, "valid_chroms": None }
def _search_features( self, trans, dataset, query ):
"""
@@ -121,17 +121,17 @@
# Parameter check.
if not chrom:
- return messages.NO_DATA
+ return dataset.conversion_messages.NO_DATA
# Dataset check.
msg = self.check_dataset_state( trans, dataset )
if msg:
return msg
- # Get datasources and check for messages.
+ # Get datasources and check for essages.
data_sources = dataset.get_datasources( trans )
messages_list = [ data_source_dict[ 'message' ] for data_source_dict in data_sources.values() ]
- return_message = get_highest_priority_msg( messages_list )
+ return_message = self._get_highest_priority_msg( messages_list )
if return_message:
return return_message
diff -r 6591b6ebfb4ea56118941deef03855412c2c00fd -r 0b3db8ce29d68bf7fe8e2a37699f58c2d9fdbddb lib/galaxy/webapps/galaxy/api/tools.py
--- a/lib/galaxy/webapps/galaxy/api/tools.py
+++ b/lib/galaxy/webapps/galaxy/api/tools.py
@@ -1,5 +1,5 @@
from galaxy import web, util
-from galaxy.web.base.controller import BaseAPIController, UsesHistoryDatasetAssociationMixin, UsesVisualizationMixin, messages, get_highest_priority_msg
+from galaxy.web.base.controller import BaseAPIController, UsesHistoryDatasetAssociationMixin, UsesVisualizationMixin
from galaxy.visualization.genome.visual_analytics import get_dataset_job
from galaxy.visualization.genomes import GenomeRegion
from galaxy.util.json import to_json_string, from_json_string
@@ -57,7 +57,7 @@
tool_id = payload[ 'tool_id' ]
tool = trans.app.toolbox.get_tool( tool_id )
if not tool:
- return { "message": { "type": "error", "text" : messages.NO_TOOL } }
+ return { "message": { "type": "error", "text" : trans.app.model.Dataset.conversion_messages.NO_TOOL } }
# Set running history from payload parameters.
# History not set correctly as part of this API call for
@@ -123,7 +123,7 @@
#
tool = trans.app.toolbox.get_tool( tool_id )
if not tool:
- return messages.NO_TOOL
+ return trans.app.model.Dataset.conversion_messages.NO_TOOL
# HACK: add run button so that tool.handle_input will run tool.
kwargs['runtool_btn'] = 'Execute'
@@ -199,7 +199,7 @@
original_job = get_dataset_job( original_dataset )
tool = trans.app.toolbox.get_tool( original_job.tool_id )
if not tool:
- return messages.NO_TOOL
+ return trans.app.model.Dataset.conversion_messages.NO_TOOL
tool_params = dict( [ ( p.name, p.value ) for p in original_job.parameters ] )
# TODO: rather than set new inputs using dict of json'ed value, unpack parameters and set using set_param_value below.
@@ -226,7 +226,7 @@
messages_list.append( msg )
# Return any messages generated during conversions.
- return_message = get_highest_priority_msg( messages_list )
+ return_message = self._get_highest_priority_msg( messages_list )
if return_message:
return to_json_string( return_message )
@@ -290,7 +290,7 @@
break
if not success:
- return messages.ERROR
+ return trans.app.model.Dataset.conversion_messages.ERROR
#
# Set input datasets for tool. If running on regions, extract and use subset
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/6591b6ebfb4e/
changeset: 6591b6ebfb4e
user: jgoecks
date: 2012-12-07 16:33:39
summary: Converter enhancements: (a) add bam to bigwig converter; (b) update datatypes.conf.sample to include new converter (disabled by default and documented with requirements) and remove unneeded dependency for bam to summary tree converter; and (c) remove deprecated page tags from bedgraph to bigwig converter.
affected #: 3 files
diff -r 8305907fa2312da14cf4d500fba1675a169b5517 -r 6591b6ebfb4ea56118941deef03855412c2c00fd datatypes_conf.xml.sample
--- a/datatypes_conf.xml.sample
+++ b/datatypes_conf.xml.sample
@@ -7,7 +7,12 @@
<datatype extension="fli" type="galaxy.datatypes.tabular:FeatureLocationIndex" display_in_upload="false"/><datatype extension="bam" type="galaxy.datatypes.binary:Bam" mimetype="application/octet-stream" display_in_upload="true"><converter file="bam_to_bai.xml" target_datatype="bai"/>
- <converter file="bam_to_summary_tree_converter.xml" target_datatype="summary_tree" depends_on="bai"/>
+ <converter file="bam_to_summary_tree_converter.xml" target_datatype="summary_tree"/>
+ <!--
+ Caution: (a) this converter requires bedtools to be installed and (b) it is very memory intensive and
+ is not recommended for most laptops/desktops.
+ <converter file="bam_to_bigwig_converter.xml" target_datatype="bigwig"/>
+ --><display file="ucsc/bam.xml" /><display file="ensembl/ensembl_bam.xml" /><display file="igv/bam.xml" />
diff -r 8305907fa2312da14cf4d500fba1675a169b5517 -r 6591b6ebfb4ea56118941deef03855412c2c00fd lib/galaxy/datatypes/converters/bam_to_bigwig_converter.xml
--- /dev/null
+++ b/lib/galaxy/datatypes/converters/bam_to_bigwig_converter.xml
@@ -0,0 +1,14 @@
+<tool id="CONVERTER_bam_to_bigwig_0" name="Convert BAM to BigWig" version="1.0.0" hidden="true">
+ <!-- <description>__NOT_USED_CURRENTLY_FOR_CONVERTERS__</description> -->
+ <command>
+ bedtools genomecov -bg -split -ibam $input -g $chromInfo | wigToBigWig stdin $chromInfo $output
+ </command>
+ <inputs>
+ <param format="bam" name="input" type="data" label="Choose BAM file"/>
+ </inputs>
+ <outputs>
+ <data format="bigwig" name="output"/>
+ </outputs>
+ <help>
+ </help>
+</tool>
diff -r 8305907fa2312da14cf4d500fba1675a169b5517 -r 6591b6ebfb4ea56118941deef03855412c2c00fd lib/galaxy/datatypes/converters/bedgraph_to_bigwig_converter.xml
--- a/lib/galaxy/datatypes/converters/bedgraph_to_bigwig_converter.xml
+++ b/lib/galaxy/datatypes/converters/bedgraph_to_bigwig_converter.xml
@@ -2,9 +2,7 @@
<!-- Used internally to generate track indexes --><command>grep -v "^track" $input | wigToBigWig -clip stdin $chromInfo $output</command><inputs>
- <page><param format="bedgraph" name="input" type="data" label="Choose wiggle"/>
- </page></inputs><outputs><data format="bigwig" name="output"/>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/be37937a0b5b/
changeset: be37937a0b5b
user: jgoecks
date: 2012-12-07 16:15:48
summary: Add needed import.
affected #: 1 file
diff -r ad6d34f4decb896e65d988cdd71a09f3fad62722 -r be37937a0b5b05c6047720758bf330087c099e6c lib/galaxy/webapps/galaxy/api/datasets.py
--- a/lib/galaxy/webapps/galaxy/api/datasets.py
+++ b/lib/galaxy/webapps/galaxy/api/datasets.py
@@ -3,6 +3,7 @@
"""
import logging, os, string, shutil, urllib, re, socket
from galaxy import util, datatypes, jobs, web, util
+from galaxy.visualization.data_providers.genome import FeatureLocationIndexDataProvider
from galaxy.web.base.controller import BaseAPIController, UsesVisualizationMixin, get_highest_priority_msg, messages
from galaxy.web.framework.helpers import is_true
https://bitbucket.org/galaxy/galaxy-central/changeset/8305907fa231/
changeset: 8305907fa231
user: jgoecks
date: 2012-12-07 16:18:50
summary: Fixes for bam_to_summary_tree converter: (a) remove deprecated page tags and (b) use bai from metadata rather than from dependency injection.
affected #: 1 file
diff -r be37937a0b5b05c6047720758bf330087c099e6c -r 8305907fa2312da14cf4d500fba1675a169b5517 lib/galaxy/datatypes/converters/bam_to_summary_tree_converter.xml
--- a/lib/galaxy/datatypes/converters/bam_to_summary_tree_converter.xml
+++ b/lib/galaxy/datatypes/converters/bam_to_summary_tree_converter.xml
@@ -1,11 +1,10 @@
<tool id="CONVERTER_bam_to_summary_tree_0" name="Convert BAM to Summary Tree" version="1.0.0" hidden="true">
-<!-- <description>__NOT_USED_CURRENTLY_FOR_CONVERTERS__</description> -->
- <command interpreter="python">sam_or_bam_to_summary_tree_converter.py --bam $input1 $bai $output1</command>
+ <!-- <description>__NOT_USED_CURRENTLY_FOR_CONVERTERS__</description> -->
+ <command interpreter="python">
+ sam_or_bam_to_summary_tree_converter.py --bam $input1 $input1.metadata.bam_index $output1
+ </command><inputs>
- <page>
- <param format="bam" name="input1" type="data" label="Choose BAM file"/>
- <param format="bai" name="bai" type="data" label="BAI index file"/>
- </page>
+ <param format="bam" name="input1" type="data" label="Choose BAM file"/></inputs><outputs><data format="summary_tree" name="output1"/>
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: fix to trackster links when dbkey is empty; pack_scripts
by Bitbucket 06 Dec '12
by Bitbucket 06 Dec '12
06 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/ad6d34f4decb/
changeset: ad6d34f4decb
user: carlfeberhard
date: 2012-12-06 23:34:18
summary: history panel: fix to trackster links when dbkey is empty; pack_scripts
affected #: 2 files
diff -r 75e427a748d0b3e89ccdf246f22499c2f44d9e2a -r ad6d34f4decb896e65d988cdd71a09f3fad62722 static/scripts/mvc/dataset/hda-edit.js
--- a/static/scripts/mvc/dataset/hda-edit.js
+++ b/static/scripts/mvc/dataset/hda-edit.js
@@ -189,6 +189,8 @@
dataset_id: this.model.get( 'id' ),
hda_ldda: 'hda'
};
+ // Add dbkey to params if it exists.
+ if( dbkey ){ params.dbkey = dbkey; }
if( !( this.model.hasData() )
|| !( visualizations && visualizations.length )
@@ -209,8 +211,6 @@
//TODO: make this more concise
// map a function to each visualization in the icon's attributes
// create a popupmenu from that map
- // Add dbkey to params if it exists.
- if( dbkey ){ params.dbkey = dbkey; }
/** @inner */
function create_viz_action( visualization ) {
@@ -513,10 +513,13 @@
//TODO: should be imported from trackster.js
function create_trackster_action_fn(vis_url, dataset_params, dbkey) {
return function() {
- var params = {};
- if (dbkey) { params.dbkey = dbkey; }
+ var listTracksParams = {};
+ if (dbkey){
+ // list_tracks seems to use 'f-dbkey' (??)
+ listTracksParams[ 'f-dbkey' ] = dbkey;
+ }
$.ajax({
- url: vis_url + '/list_tracks?f-' + $.param(params),
+ url: vis_url + '/list_tracks?' + $.param( listTracksParams ),
dataType: "html",
error: function() { alert( _l( "Could not add this dataset to browser" ) + '.' ); },
success: function(table_html) {
diff -r 75e427a748d0b3e89ccdf246f22499c2f44d9e2a -r ad6d34f4decb896e65d988cdd71a09f3fad62722 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(!(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");if(c){g.dbkey=c}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.dbkey=b}$.ajax({url:a+"/list_tracks?f-"+$.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={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
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: Fixes for handling repository dependencies in the tool shed.
by Bitbucket 06 Dec '12
by Bitbucket 06 Dec '12
06 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/75e427a748d0/
changeset: 75e427a748d0
user: greg
date: 2012-12-06 23:00:54
summary: Fixes for handling repository dependencies in the tool shed.
affected #: 2 files
diff -r 7b791a48be76604324f23445293d55948f789dde -r 75e427a748d0b3e89ccdf246f22499c2f44d9e2a lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -1200,7 +1200,6 @@
if 'description' not in all_repository_dependencies:
description = repository_dependencies_dict.get( 'description', None )
all_repository_dependencies[ 'description' ] = description
-
# The next key of interest in repository_dependencies_dict is 'repository_dependencies', which is a list of tuples.
repository_dependencies_tups = repository_dependencies_dict[ 'repository_dependencies' ]
for repository_dependency in repository_dependencies_tups:
@@ -1231,6 +1230,7 @@
else:
# Insert this repository_dependency.
all_repository_dependencies[ repository_dependencies_root_key ] = [ repository_dependency ]
+ handled.append( repository_dependency )
if tool_shed_is_this_tool_shed( tool_shed ):
# The repository is in the current tool shed.
required_repository = get_repository_by_name_and_owner( trans, name, owner )
diff -r 7b791a48be76604324f23445293d55948f789dde -r 75e427a748d0b3e89ccdf246f22499c2f44d9e2a lib/galaxy/webapps/community/util/container_util.py
--- a/lib/galaxy/webapps/community/util/container_util.py
+++ b/lib/galaxy/webapps/community/util/container_util.py
@@ -36,7 +36,14 @@
listified_repository_dependency = repository_dependency.listify
for contained_repository_dependency in self.repository_dependencies:
if contained_repository_dependency.listify == listified_repository_dependency:
- self.repository_dependencies.remove( contained_repository_dependency )
+ self.repository_dependencies.remove( contained_repository_dependency )
+ def to_repository_dependency( self, repository_dependency_id ):
+ toolshed, name, owner, changeset_revision = self.key.split( STRSEP )
+ return RepositoryDependency( id=repository_dependency_id,
+ toolshed=toolshed,
+ repository_name=name,
+ repository_owner=owner,
+ changeset_revision=changeset_revision )
class Datatype( object ):
"""Datatype object"""
@@ -199,36 +206,45 @@
# Create the Repository dependencies folder and add it to the root folder.
repository_dependencies_folder_key = repository_dependencies[ 'root_key' ]
repository_dependencies_folder = Folder( id=folder_id, key=repository_dependencies_folder_key, label=label, parent=repository_dependencies_root_folder )
- # The received repository_dependencies is a dictionary with a single 'description' key, and one or more repository_dependency keys.
+ del repository_dependencies[ 'root_key' ]
+ # The received repository_dependencies is a dictionary with keys: 'root_key', 'description', and one or more repository_dependency keys.
# We want the description value associated with the repository_dependencies_folder.
repository_dependencies_folder.description = repository_dependencies.get( 'description', None )
repository_dependencies_root_folder.folders.append( repository_dependencies_folder )
+ del repository_dependencies[ 'description' ]
+ # The remaining keys in repository_dependencies should all be folders.
+ folder_keys = repository_dependencies.keys()
+ # If repository_dependencies_folder_key is an entry in repository_dependencies, process it first.
+ if repository_dependencies_folder_key in repository_dependencies:
+ val = repository_dependencies[ repository_dependencies_folder_key ]
+ repository_dependencies_folder, folder_id, repository_dependency_id = handle_repository_dependencies_entry( repository_dependencies_root_folder,
+ repository_dependencies_folder,
+ repository_dependencies_folder_key,
+ folder_keys,
+ folder_id,
+ repository_dependency_id,
+ repository_name,
+ repository_owner,
+ changeset_revision,
+ repository_dependencies_folder_key,
+ val )
+ del repository_dependencies[ repository_dependencies_folder_key ]
for key, val in repository_dependencies.items():
- if key in [ 'root_key', 'description' ]:
- continue
- # Only create a new folder object if necessary.
- folder = get_folder( repository_dependencies_root_folder, key )
- if not folder:
- # Create a new folder.
- folder_id += 1
- label = generate_repository_dependencies_folder_label_from_key( repository_name, repository_owner, changeset_revision, key )
- folder = Folder( id=folder_id, key=key, label=label, parent=repository_dependencies_folder )
- for repository_dependency_tup in val:
- toolshed, name, owner, changeset_revision = repository_dependency_tup
- # Create a new repository_dependency.
- repository_dependency_id += 1
- repository_dependency = RepositoryDependency( id=repository_dependency_id,
- toolshed=toolshed,
- repository_name=name,
- repository_owner=owner,
- changeset_revision=changeset_revision )
- # Insert the repository_dependency into the folder.
- folder.repository_dependencies.append( repository_dependency )
- if not get_folder( repository_dependencies_folder, key ):
- # Insert the folder into the list.
- repository_dependencies_folder.folders.append( folder )
+ repository_dependencies_folder, folder_id, repository_dependency_id = handle_repository_dependencies_entry( repository_dependencies_root_folder,
+ repository_dependencies_folder,
+ repository_dependencies_folder_key,
+ folder_keys,
+ folder_id,
+ repository_dependency_id,
+ repository_name,
+ repository_owner,
+ changeset_revision,
+ key,
+ val )
+ # Cast empty folders to be repository dependencies.
+ repository_dependencies_folder, repository_dependency_id = cast_empty_repository_dependency_folders( repository_dependencies_folder,
+ repository_dependency_id )
# Remove repository_dependencies that are also folders, and coerce empty folders into repository dependencies.
- prune_repository_dependencies( repository_dependencies_folder, repository_dependencies_folder )
else:
repository_dependencies_root_folder = None
return folder_id, repository_dependencies_root_folder
@@ -360,13 +376,23 @@
else:
workflows_root_folder = None
return folder_id, workflows_root_folder
+def cast_empty_repository_dependency_folders( folder, repository_dependency_id ):
+ if not folder.folders and not folder.repository_dependencies:
+ repository_dependency_id += 1
+ repository_dependency = folder.to_repository_dependency( repository_dependency_id )
+ if not folder.parent.contains_repository_dependency( repository_dependency ):
+ folder.parent.repository_dependencies.append( repository_dependency )
+ folder.parent.folders.remove( folder )
+ for sub_folder in folder.folders:
+ return cast_empty_repository_dependency_folders( sub_folder, repository_dependency_id )
+ return folder, repository_dependency_id
def generate_repository_dependencies_folder_label_from_key( repository_name, repository_owner, changeset_revision, key ):
"""Return a repository dependency label based on the repository dependency key."""
if key_is_current_repositorys_key( repository_name, repository_owner, changeset_revision, key ):
label = 'Repository dependencies'
else:
- toolshed_base_url, name, owner, revision = get_components_from_key( key )
- label = "Repository <b>%s</b> revision <b>%s</b> owned by <b>%s</b>" % ( name, revision, owner )
+ #toolshed_base_url, name, owner, revision = get_components_from_key( key )
+ label = "Repository <b>%s</b> revision <b>%s</b> owned by <b>%s</b>" % ( repository_name, changeset_revision, repository_owner )
return label
def generate_repository_dependencies_key_for_repository( toolshed_base_url, repository_name, repository_owner, changeset_revision ):
# FIXME: assumes tool shed is current tool shed since repository dependencies across tool sheds is not yet supported.
@@ -391,25 +417,61 @@
repository_owner = items[ 2 ]
changeset_revision = items[ 3 ]
return toolshed_base_url, repository_name, repository_owner, changeset_revision
-def is_folder( folder_keys, toolshed_base_url, repository_name, repository_owner, changeset_revision ):
- key = '%s%s%s%s%s%s%s' % ( toolshed_base_url, STRSEP, repository_name, STRSEP, repository_owner, STRSEP, changeset_revision )
+def handle_repository_dependencies_entry( repository_dependencies_root_folder, repository_dependencies_folder, repository_dependencies_folder_key,
+ folder_keys, folder_id, repository_dependency_id, repository_name, repository_owner, changeset_revision,
+ key, val ):
+ # Only create a new folder object if necessary.
+ folder = get_folder( repository_dependencies_root_folder, key )
+ if not folder:
+ folder_id += 1
+ label = generate_repository_dependencies_folder_label_from_key( repository_name, repository_owner, changeset_revision, key )
+ folder = Folder( id=folder_id, key=key, label=label, parent=repository_dependencies_folder )
+ for repository_dependency_tup in val:
+ toolshed, name, owner, changeset_revision = repository_dependency_tup
+ if is_root_repository( repository_dependencies_folder_key, toolshed, name, owner ):
+ # Do not include repository dependencies that point to a revision within the same repository.
+ continue
+ if is_or_should_be_folder( folder_keys, toolshed, name, owner, changeset_revision ):
+ check_folder_key = generate_repository_dependencies_key_for_repository( toolshed, name, owner, changeset_revision )
+ if get_folder( repository_dependencies_root_folder, check_folder_key ):
+ continue
+ else:
+ # Create a new folder, which may be populated later.
+ folder_id += 1
+ label = generate_repository_dependencies_folder_label_from_key( name, owner, changeset_revision, key )
+ sub_folder = Folder( id=folder_id, key=check_folder_key, label=label, parent=repository_dependencies_folder )
+ folder.folders.append( sub_folder )
+ else:
+ repository_dependency_id += 1
+ repository_dependency = RepositoryDependency( id=repository_dependency_id,
+ toolshed=toolshed,
+ repository_name=name,
+ repository_owner=owner,
+ changeset_revision=changeset_revision )
+ # Insert the repository_dependency into the folder.
+ folder.repository_dependencies.append( repository_dependency )
+ if not get_folder( repository_dependencies_folder, folder.key ):
+ if folder.folders:
+ # Insert the folder into the list.
+ repository_dependencies_folder.folders.append( folder )
+ return repository_dependencies_folder, folder_id, repository_dependency_id
+def is_or_should_be_folder( folder_keys, toolshed, repository_name, repository_owner, changeset_revision ):
+ key = '%s%s%s%s%s%s%s' % ( toolshed, STRSEP, repository_name, STRSEP, repository_owner, STRSEP, changeset_revision )
return key in folder_keys
+def is_root_repository( repository_dependencies_folder_key, toolshed, repository_name, repository_owner ):
+ # Return True if a repository dependency points to a revision within it's own repository.
+ repository_dependencies_folder_tup = repository_dependencies_folder_key.split( STRSEP )
+ rdf_toolshed, rdf_repository_name, rdf_repository_owner, rdf_changeset_revision = repository_dependencies_folder_tup
+ return rdf_toolshed == toolshed and rdf_repository_name == repository_name and rdf_repository_owner == repository_owner
def key_is_current_repositorys_key( repository_name, repository_owner, changeset_revision, key ):
toolshed_base_url, key_name, key_owner, key_changeset_revision = get_components_from_key( key )
return repository_name == key_name and repository_owner == key_owner and changeset_revision == key_changeset_revision
-def prune_folder( folder, repository_dependency, key ):
- if get_folder( folder, key ):
- folder.remove_repository_dependency( repository_dependency )
+def print_folders( pad, folder ):
+ # For debugging...
+ pad_str = ''
+ for i in range( 1, pad ):
+ pad_str += ' '
+ print '%s%s' % ( pad_str, folder.key )
for sub_folder in folder.folders:
- prune_folder( sub_folder, repository_dependency, key )
-def prune_repository_dependencies( folder, root_folder ):
- """Remove repository_dependencies that are also folders, and coerce empty folders into repository dependencies."""
- remove_repository_dependencies( folder, root_folder )
- for sub_folder in folder.folders:
- prune_repository_dependencies( sub_folder, root_folder )
-def remove_repository_dependencies( folder, root_folder ):
- for repository_dependency in folder.repository_dependencies:
- toolshed, name, owner, changeset_revision = repository_dependency.listify
- key = generate_repository_dependencies_key_for_repository( toolshed, name, owner, changeset_revision )
- prune_folder( root_folder, repository_dependency, key )
+ print_folders( pad+5, sub_folder )
\ 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: carlfeberhard: history panel: fix download popup for uploaded files with meta files (bam) by moving url rendering from initialize to render; pack scripts
by Bitbucket 06 Dec '12
by Bitbucket 06 Dec '12
06 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/7b791a48be76/
changeset: 7b791a48be76
user: carlfeberhard
date: 2012-12-06 22:33:18
summary: history panel: fix download popup for uploaded files with meta files (bam) by moving url rendering from initialize to render; pack scripts
affected #: 5 files
diff -r 78a3508c456296bd7bd578f5c8dd121d7206fef8 -r 7b791a48be76604324f23445293d55948f789dde static/scripts/mvc/dataset/hda-base.js
--- a/static/scripts/mvc/dataset/hda-base.js
+++ b/static/scripts/mvc/dataset/hda-base.js
@@ -35,12 +35,9 @@
this._render_showParamsButton
];
- // render urlTemplates (gen. provided by GalaxyPaths) to urls
- //TODO:?? render urls here or in render()?
+ // cache urlTemplates (gen. provided by GalaxyPaths) to urls
if( !attributes.urlTemplates ){ throw( 'HDAView needs urlTemplates on initialize' ); }
- /** web controller urls for functions relating to this hda. These
- * are rendered from urlTemplates using the model data. */
- this.urls = this._renderUrls( attributes.urlTemplates, this.model.toJSON() );
+ this.urlTemplates = attributes.urlTemplates;
/** is the body of this hda view expanded/not. */
this.expanded = attributes.expanded || false;
@@ -52,6 +49,61 @@
//}, this );
},
+ // ......................................................................... RENDER MAIN
+ /** Render this HDA, set up ui.
+ * @fires rendered:ready when rendered and NO running HDAs
+ * @fires rendered when rendered and running HDAs
+ * @fires rendered:initial on first render with running HDAs
+ * @fires rendered:initial:ready when first rendered and NO running HDAs
+ * @returns {Object} this HDABaseView
+ */
+ render : function(){
+ var view = this,
+ id = this.model.get( 'id' ),
+ state = this.model.get( 'state' ),
+ itemWrapper = $( '<div/>' ).attr( 'id', 'historyItem-' + id ),
+ initialRender = ( this.$el.children().size() === 0 );
+
+ this.$el.attr( 'id', 'historyItemContainer-' + id );
+
+ /** web controller urls for functions relating to this hda.
+ * These are rendered from urlTemplates using the model data. */
+ this.urls = this._renderUrls( this.urlTemplates, this.model.toJSON() );
+
+ itemWrapper
+ .addClass( 'historyItemWrapper' ).addClass( 'historyItem' )
+ .addClass( 'historyItem-' + state );
+
+ itemWrapper.append( this._render_warnings() );
+ itemWrapper.append( this._render_titleBar() );
+ this.body = $( this._render_body() );
+ itemWrapper.append( this.body );
+
+ //TODO: move to own function: setUpBehaviours
+ // we can potentially skip this step and call popupmenu directly on the download button
+ make_popup_menus( itemWrapper );
+
+ // set up canned behavior on children (bootstrap, popupmenus, editable_text, etc.)
+ itemWrapper.find( '.tooltip' ).tooltip({ placement : 'bottom' });
+
+ // transition...
+ this.$el.fadeOut( 'fast', function(){
+ view.$el.children().remove();
+ view.$el.append( itemWrapper ).fadeIn( 'fast', function(){
+ view.log( view + ' rendered:', view.$el );
+
+ var renderedEventName = 'rendered';
+ if( initialRender ){
+ renderedEventName += ':initial';
+ } else if( view.model.inReadyState() ){
+ renderedEventName += ':ready';
+ }
+ view.trigger( renderedEventName );
+ });
+ });
+ return this;
+ },
+
/** render the urls for this hda using the model data and the url templates from initialize.
* @param {Object} urlTemplates a map (or nested map) of underscore templates (currently, anyhoo)
* @param {Object} modelJson data from the model
@@ -71,6 +123,7 @@
//TODO: should be a better (gen.) way to handle this case
if( urlKey === 'meta_download' ){
urls[ urlKey ] = hdaView._renderMetaDownloadUrls( urlTemplateOrObj, modelJson );
+
} else {
try {
urls[ urlKey ] = _.template( urlTemplateOrObj, modelJson );
@@ -100,57 +153,6 @@
});
},
- // ......................................................................... RENDER MAIN
- /** Render this HDA, set up ui.
- * @fires rendered:ready when rendered and NO running HDAs
- * @fires rendered when rendered and running HDAs
- * @fires rendered:initial on first render with running HDAs
- * @fires rendered:initial:ready when first rendered and NO running HDAs
- * @returns {Object} this HDABaseView
- */
- render : function(){
- var view = this,
- id = this.model.get( 'id' ),
- state = this.model.get( 'state' ),
- itemWrapper = $( '<div/>' ).attr( 'id', 'historyItem-' + id ),
- initialRender = ( this.$el.children().size() === 0 );
-
- this.$el.attr( 'id', 'historyItemContainer-' + id );
-
- itemWrapper
- .addClass( 'historyItemWrapper' ).addClass( 'historyItem' )
- .addClass( 'historyItem-' + state );
-
- itemWrapper.append( this._render_warnings() );
- itemWrapper.append( this._render_titleBar() );
- this.body = $( this._render_body() );
- itemWrapper.append( this.body );
-
- //TODO: move to own function: setUpBehaviours
- // we can potentially skip this step and call popupmenu directly on the download button
- make_popup_menus( itemWrapper );
-
- // set up canned behavior on children (bootstrap, popupmenus, editable_text, etc.)
- itemWrapper.find( '.tooltip' ).tooltip({ placement : 'bottom' });
-
- // transition...
- this.$el.fadeOut( 'fast', function(){
- view.$el.children().remove();
- view.$el.append( itemWrapper ).fadeIn( 'fast', function(){
- view.log( view + ' rendered:', view.$el );
-
- var renderedEventName = 'rendered';
- if( initialRender ){
- renderedEventName += ':initial';
- } else if( view.model.inReadyState() ){
- renderedEventName += ':ready';
- }
- view.trigger( renderedEventName );
- });
- });
- return this;
- },
-
// ................................................................................ RENDER titlebar
/** Render any hda warnings including: is deleted, is purged, is hidden.
* (including links to further actions (undelete, etc.))
diff -r 78a3508c456296bd7bd578f5c8dd121d7206fef8 -r 7b791a48be76604324f23445293d55948f789dde 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){this.log(this+".initialize:",a);this.defaultPrimaryActionButtonRenderers=[this._render_showParamsButton];if(!a.urlTemplates){throw ("HDAView needs urlTemplates on initialize")}this.urls=this._renderUrls(a.urlTemplates,this.model.toJSON());this.expanded=a.expanded||false;this.model.bind("change",this.render,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{c[f]=_.template(e,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: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);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},_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.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 "'+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"))})}},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){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.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
diff -r 78a3508c456296bd7bd578f5c8dd121d7206fef8 -r 7b791a48be76604324f23445293d55948f789dde static/scripts/packed/mvc/dataset/hda-model.js
--- a/static/scripts/packed/mvc/dataset/hda-model.js
+++ b/static/scripts/packed/mvc/dataset/hda-model.js
@@ -1,1 +1,1 @@
-var HistoryDatasetAssociation=BaseModel.extend(LoggableMixin).extend({defaults:{history_id:null,model_class:"HistoryDatasetAssociation",hid:0,id:null,name:"",state:"",data_type:null,file_size:0,meta_files:[],misc_blurb:"",misc_info:"",deleted:false,purged:false,visible:false,accessible:false},urlRoot:"api/histories/",url:function(){return"api/histories/"+this.get("history_id")+"/contents/"+this.get("id")},initialize:function(){this.log(this+".initialize",this.attributes);this.log("\tparent history_id: "+this.get("history_id"));if(!this.get("accessible")){this.set("state",HistoryDatasetAssociation.STATES.NOT_VIEWABLE)}this.on("change:state",function(b,a){this.log(this+" has changed state:",b,a);if(this.inReadyState()){this.trigger("state:ready",this.get("id"),a,this.previous("state"),b)}})},isDeletedOrPurged:function(){return(this.get("deleted")||this.get("purged"))},isVisible:function(b,c){var a=true;if((!b)&&(this.get("deleted")||this.get("purged"))){a=false}if((!c)&&(!this.get("visible"))){a=false}return a},inReadyState:function(){var a=this.get("state");return((a===HistoryDatasetAssociation.STATES.NEW)||(a===HistoryDatasetAssociation.STATES.OK)||(a===HistoryDatasetAssociation.STATES.EMPTY)||(a===HistoryDatasetAssociation.STATES.FAILED_METADATA)||(a===HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(a===HistoryDatasetAssociation.STATES.DISCARDED)||(a===HistoryDatasetAssociation.STATES.ERROR))},hasData:function(){return(this.get("file_size")>0)},toString:function(){var a=this.get("id")||"";if(this.get("name")){a+=':"'+this.get("name")+'"'}return"HistoryDatasetAssociation("+a+")"}});HistoryDatasetAssociation.STATES={UPLOAD:"upload",QUEUED:"queued",PAUSED:"paused",RUNNING:"running",SETTING_METADATA:"setting_metadata",NEW:"new",EMPTY:"empty",OK:"ok",FAILED_METADATA:"failed_metadata",NOT_VIEWABLE:"noPermission",DISCARDED:"discarded",ERROR:"error"};var HDACollection=Backbone.Collection.extend(LoggableMixin).extend({model:HistoryDatasetAssociation,initialize:function(){},ids:function(){return this.map(function(a){return a.id})},getVisible:function(a,b){return this.filter(function(c){return c.isVisible(a,b)})},getStateLists:function(){var a={};_.each(_.values(HistoryDatasetAssociation.STATES),function(b){a[b]=[]});this.each(function(b){a[b.get("state")].push(b.get("id"))});return a},running:function(){var a=[];this.each(function(b){if(!b.inReadyState()){a.push(b.get("id"))}});return a},update:function(a){this.log(this+"update:",a);if(!(a&&a.length)){return}var b=this;_.each(a,function(e,c){var d=b.get(e);d.fetch()})},toString:function(){return("HDACollection("+this.ids().join(",")+")")}});
\ No newline at end of file
+var HistoryDatasetAssociation=BaseModel.extend(LoggableMixin).extend({defaults:{history_id:null,model_class:"HistoryDatasetAssociation",hid:0,id:null,name:"(unnamed dataset)",state:"ok",data_type:null,file_size:0,file_ext:"",meta_files:[],misc_blurb:"",misc_info:"",deleted:false,purged:false,visible:false,accessible:true},urlRoot:"api/histories/",url:function(){return"api/histories/"+this.get("history_id")+"/contents/"+this.get("id")},initialize:function(){this.log(this+".initialize",this.attributes);this.log("\tparent history_id: "+this.get("history_id"));if(!this.get("accessible")){this.set("state",HistoryDatasetAssociation.STATES.NOT_VIEWABLE)}this.on("change:state",function(b,a){this.log(this+" has changed state:",b,a);if(this.inReadyState()){this.trigger("state:ready",this.get("id"),a,this.previous("state"),b)}})},isDeletedOrPurged:function(){return(this.get("deleted")||this.get("purged"))},isVisible:function(b,c){var a=true;if((!b)&&(this.get("deleted")||this.get("purged"))){a=false}if((!c)&&(!this.get("visible"))){a=false}return a},inReadyState:function(){var a=this.get("state");return((a===HistoryDatasetAssociation.STATES.NEW)||(a===HistoryDatasetAssociation.STATES.OK)||(a===HistoryDatasetAssociation.STATES.EMPTY)||(a===HistoryDatasetAssociation.STATES.FAILED_METADATA)||(a===HistoryDatasetAssociation.STATES.NOT_VIEWABLE)||(a===HistoryDatasetAssociation.STATES.DISCARDED)||(a===HistoryDatasetAssociation.STATES.ERROR))},hasData:function(){return(this.get("file_size")>0)},toString:function(){var a=this.get("id")||"";if(this.get("name")){a+=':"'+this.get("name")+'"'}return"HistoryDatasetAssociation("+a+")"}});HistoryDatasetAssociation.STATES={UPLOAD:"upload",QUEUED:"queued",PAUSED:"paused",RUNNING:"running",SETTING_METADATA:"setting_metadata",NEW:"new",EMPTY:"empty",OK:"ok",FAILED_METADATA:"failed_metadata",NOT_VIEWABLE:"noPermission",DISCARDED:"discarded",ERROR:"error"};var HDACollection=Backbone.Collection.extend(LoggableMixin).extend({model:HistoryDatasetAssociation,initialize:function(){},ids:function(){return this.map(function(a){return a.id})},hidToCollectionIndex:function(a){if(!a){return this.models.length}var d=this.models.length-1;for(var b=d;b>=0;b--){var c=this.at(b).get("hid");if(c==a){return b}if(c<a){return b+1}}return null},getVisible:function(a,b){return this.filter(function(c){return c.isVisible(a,b)})},getStateLists:function(){var a={};_.each(_.values(HistoryDatasetAssociation.STATES),function(b){a[b]=[]});this.each(function(b){a[b.get("state")].push(b.get("id"))});return a},running:function(){var a=[];this.each(function(b){if(!b.inReadyState()){a.push(b.get("id"))}});return a},update:function(a){this.log(this+"update:",a);if(!(a&&a.length)){return[]}var c=this,b=null;_.each(a,function(f,d){var e=c.get(f);if(e){e.fetch();b.push(e)}});return b},toString:function(){return("HDACollection()")}});
\ No newline at end of file
diff -r 78a3508c456296bd7bd578f5c8dd121d7206fef8 -r 7b791a48be76604324f23445293d55948f789dde static/scripts/packed/mvc/history/history-model.js
--- a/static/scripts/packed/mvc/history/history-model.js
+++ b/static/scripts/packed/mvc/history/history-model.js
@@ -1,1 +1,1 @@
-var History=BaseModel.extend(LoggableMixin).extend({defaults:{id:"",name:"",state:"",diskSize:0,deleted:false,annotation:null,message:null},urlRoot:"api/histories/",url:function(){return"api/histories/"+this.get("id")},initialize:function(a,b){this.log(this+".initialize:",a,b);this.hdas=new HDACollection();if(b&&b.length){this.hdas.reset(b);this.checkForUpdates()}},loadFromApi:function(a,c){var b=this;b.attributes.id=a;jQuery.when(jQuery.ajax("api/users/current"),b.fetch()).then(function(e,d){b.attributes.user=e[0];b.trigger("loaded:user",e[0]);b.trigger("loaded",d[0])}).then(function(){jQuery.ajax(b.url()+"/contents?"+jQuery.param({ids:b.hdaIdsFromStateIds().join(",")})).success(function(d){b.hdas.reset(d);b.checkForUpdates();b.trigger("loaded:hdas",d);if(c){callback(b)}})})},hdaIdsFromStateIds:function(){return _.reduce(_.values(this.get("state_ids")),function(b,a){return b.concat(a)})},checkForUpdates:function(a){if(this.hdas.running().length){this.stateUpdater()}else{this.trigger("ready")}return this},stateUpdater:function(){var c=this,a=this.get("state"),b=this.get("state_ids");jQuery.ajax("api/histories/"+this.get("id")).success(function(d){c.set(d);c.log("current history state:",c.get("state"),"(was)",a,"new size:",c.get("nice_size"));var e=[];_.each(_.keys(d.state_ids),function(g){var f=_.difference(d.state_ids[g],b[g]);e=e.concat(f)});if(e.length){c.hdas.update(e)}if((c.get("state")===HistoryDatasetAssociation.STATES.RUNNING)||(c.get("state")===HistoryDatasetAssociation.STATES.QUEUED)){setTimeout(function(){c.stateUpdater()},4000)}else{c.trigger("ready")}}).error(function(f,d,e){if(!((f.readyState===0)&&(f.status===0))){alert(_l("Error getting history updates from the server.")+"\n"+e)}})},toString:function(){var a=(this.get("name"))?(","+this.get("name")):("");return"History("+this.get("id")+a+")"}});var HistoryCollection=Backbone.Collection.extend(LoggableMixin).extend({model:History,urlRoot:"api/histories"});
\ No newline at end of file
+var History=BaseModel.extend(LoggableMixin).extend({defaults:{id:"",name:"",state:"",diskSize:0,deleted:false,annotation:null,message:null},urlRoot:"api/histories/",url:function(){return"api/histories/"+this.get("id")},initialize:function(a,b){this.log(this+".initialize:",a,b);this.hdas=new HDACollection();if(b&&b.length){this.hdas.reset(b);this.checkForUpdates()}},loadFromApi:function(a,c){var b=this;b.attributes.id=a;jQuery.when(jQuery.ajax("api/users/current"),b.fetch()).then(function(e,d){b.attributes.user=e[0];b.trigger("loaded:user",e[0]);b.trigger("loaded",d[0])}).then(function(){jQuery.ajax(b.url()+"/contents?"+jQuery.param({ids:b.hdaIdsFromStateIds().join(",")})).success(function(d){b.hdas.reset(d);b.checkForUpdates();b.trigger("loaded:hdas",d);if(c){callback(b)}})})},hdaIdsFromStateIds:function(){return _.reduce(_.values(this.get("state_ids")),function(b,a){return b.concat(a)})},checkForUpdates:function(a){if(this.hdas.running().length){this.stateUpdater()}else{this.trigger("ready")}return this},stateUpdater:function(){var c=this,a=this.get("state"),b=this.get("state_ids");jQuery.ajax("api/histories/"+this.get("id")).success(function(d){c.set(d);c.log("current history state:",c.get("state"),"(was)",a,"new size:",c.get("nice_size"));var e=[];_.each(_.keys(d.state_ids),function(g){var f=_.difference(d.state_ids[g],b[g]);e=e.concat(f)});if(e.length){c.updateHdas(e)}if((c.get("state")===HistoryDatasetAssociation.STATES.RUNNING)||(c.get("state")===HistoryDatasetAssociation.STATES.QUEUED)){setTimeout(function(){c.stateUpdater()},History.UPDATE_DELAY)}else{c.trigger("ready")}}).error(function(f,d,e){if(!((f.readyState===0)&&(f.status===0))){alert(_l("Error getting history updates from the server.")+"\n"+e)}})},updateHdas:function(b){var a=this;jQuery.ajax({url:this.url()+"/contents?"+jQuery.param({ids:b.join(",")}),error:function(f,c,d){var e="ERROR updating hdas from api history contents:";a.log(e,b,f,c,d);alert(e+b.join(","))},success:function(d,c,f){a.log(a+".updateHdas, success:",d,c,f);var e=[];_.each(d,function(h,i){var g=a.hdas.get(h.id);if(g){a.log("found existing model in list for id "+h.id+", updating...:");g.set(h)}else{a.log("NO existing model for id "+h.id+", creating...:");modelsToAdd.push(h)}});if(e.length){a.addHdas(e)}}})},addHdas:function(a){var b=this;_.each(a,function(c,d){var e=b.hdas.hidToCollectionIndex(c.hid);c.history_id=b.get("id");b.hdas.add(new HistoryDatasetAssociation(c),{at:e})})},toString:function(){var a=(this.get("name"))?(","+this.get("name")):("");return"History("+this.get("id")+a+")"}});History.UPDATE_DELAY=4000;var HistoryCollection=Backbone.Collection.extend(LoggableMixin).extend({model:History,urlRoot:"api/histories"});
\ No newline at end of file
diff -r 78a3508c456296bd7bd578f5c8dd121d7206fef8 -r 7b791a48be76604324f23445293d55948f789dde static/scripts/packed/mvc/history/history-panel.js
--- a/static/scripts/packed/mvc/history/history-panel.js
+++ b/static/scripts/packed/mvc/history/history-panel.js
@@ -1,1 +1,1 @@
-var HistoryPanel=BaseView.extend(LoggableMixin).extend({el:"body.historyPage",HDAView:HDAEditView,events:{"click #history-tag":"loadAndDisplayTags"},initialize:function(a){this.log(this+".initialize:",a);if(!a.urlTemplates){throw (this+" needs urlTemplates on initialize")}if(!a.urlTemplates.history){throw (this+" needs urlTemplates.history on initialize")}if(!a.urlTemplates.hda){throw (this+" needs urlTemplates.hda on initialize")}this.urlTemplates=a.urlTemplates.history;this.hdaUrlTemplates=a.urlTemplates.hda;this._setUpWebStorage(a.initiallyExpanded,a.show_deleted,a.show_hidden);this.model.bind("change:nice_size",this.updateHistoryDiskSize,this);this.model.hdas.bind("add",this.add,this);this.model.hdas.bind("reset",this.addAll,this);this.hdaViews={};this.urls={}},_setUpWebStorage:function(b,a,c){this.storage=new PersistantStorage("HistoryView."+this.model.get("id"),{expandedHdas:{},show_deleted:false,show_hidden:false});this.log("this.storage:",this.storage.get());if(b){this.storage.set("exandedHdas",b)}if((a===true)||(a===false)){this.storage.set("show_deleted",a)}if((c===true)||(c===false)){this.storage.set("show_hidden",c)}this.show_deleted=this.storage.get("show_deleted");this.show_hidden=this.storage.get("show_hidden");this.log("(init'd) this.storage:",this.storage.get())},add:function(a){},addAll:function(){this.render()},render:function(){var b=this,d=b.toString()+".set-up",c=$("<div/>"),a=this.model.toJSON(),e=(this.$el.children().size()===0);a.urls=this._renderUrls(a);c.append(HistoryPanel.templates.historyPanel(a));c.find(".tooltip").tooltip({placement:"bottom"});if(!this.model.hdas.length||!this.renderItems(c.find("#"+this.model.get("id")+"-datasets"))){c.find("#emptyHistoryMessage").show()}$(b).queue(d,function(f){b.$el.fadeOut("fast",function(){f()})});$(b).queue(d,function(f){b.$el.html("");b.$el.append(c.children());b.$el.fadeIn("fast",function(){f()})});$(b).queue(d,function(f){this.log(b+" rendered:",b.$el);b._setUpBehaviours();if(e){b.trigger("rendered:initial")}else{b.trigger("rendered")}f()});$(b).dequeue(d);return this},_renderUrls:function(a){var b=this;b.urls={};_.each(this.urlTemplates,function(d,c){b.urls[c]=_.template(d,a)});return b.urls},renderItems:function(b){this.hdaViews={};var a=this,c=this.model.hdas.getVisible(this.storage.get("show_deleted"),this.storage.get("show_hidden"));_.each(c,function(f){var e=f.get("id"),d=a.storage.get("expandedHdas").get(e);a.hdaViews[e]=new a.HDAView({model:f,expanded:d,urlTemplates:a.hdaUrlTemplates});a._setUpHdaListeners(a.hdaViews[e]);b.prepend(a.hdaViews[e].render().$el)});return c.length},_setUpHdaListeners:function(b){var a=this;b.bind("body-expanded",function(c){a.storage.get("expandedHdas").set(c,true)});b.bind("body-collapsed",function(c){a.storage.get("expandedHdas").deleteKey(c)})},_setUpBehaviours:function(){if(!(this.model.get("user")&&this.model.get("user").email)){return}var a=this.$("#history-annotation-area");this.$("#history-annotate").click(function(){if(a.is(":hidden")){a.slideDown("fast")}else{a.slideUp("fast")}return false});async_save_text("history-name-container","history-name",this.urls.rename,"new_name",18);async_save_text("history-annotation-container","history-annotation",this.urls.annotate,"new_annotation",18,true,4)},updateHistoryDiskSize:function(){this.$el.find("#history-size").text(this.model.get("nice_size"))},showQuotaMessage:function(){var a=this.$el.find("#quota-message-container");if(a.is(":hidden")){a.slideDown("fast")}},hideQuotaMessage:function(){var a=this.$el.find("#quota-message-container");if(!a.is(":hidden")){a.slideUp("fast")}},toggleShowDeleted:function(){this.storage.set("show_deleted",!this.storage.get("show_deleted"));this.render()},toggleShowHidden:function(){this.storage.set("show_hidden",!this.storage.get("show_hidden"));this.render()},collapseAllHdaBodies:function(){_.each(this.hdaViews,function(a){a.toggleBodyVisibility(null,false)});this.storage.set("expandedHdas",{})},loadAndDisplayTags:function(c){this.log(this+".loadAndDisplayTags",c);var d=this.$el.find("#history-tag-area"),b=d.find(".tag-elt");this.log("\t tagArea",d," tagElt",b);if(d.is(":hidden")){if(!jQuery.trim(b.html())){var a=this;$.ajax({url:a.urls.tag,error:function(){alert(_l("Tagging failed"))},success:function(e){b.html(e);b.find(".tooltip").tooltip();d.slideDown("fast")}})}else{d.slideDown("fast")}}else{d.slideUp("fast")}return false},toString:function(){var a=this.model.get("name")||"";return"HistoryPanel("+a+")"}});HistoryPanel.templates={historyPanel:Handlebars.templates["template-history-historyPanel"]};
\ No newline at end of file
+var HistoryPanel=BaseView.extend(LoggableMixin).extend({el:"body.historyPage",HDAView:HDAEditView,events:{"click #history-tag":"loadAndDisplayTags"},initialize:function(a){this.log(this+".initialize:",a);if(!a.urlTemplates){throw (this+" needs urlTemplates on initialize")}if(!a.urlTemplates.history){throw (this+" needs urlTemplates.history on initialize")}if(!a.urlTemplates.hda){throw (this+" needs urlTemplates.hda on initialize")}this.urlTemplates=a.urlTemplates.history;this.hdaUrlTemplates=a.urlTemplates.hda;this._setUpWebStorage(a.initiallyExpanded,a.show_deleted,a.show_hidden);this.model.bind("change:nice_size",this.updateHistoryDiskSize,this);this.model.hdas.bind("add",this.add,this);this.model.hdas.bind("reset",this.addAll,this);this.model.hdas.bind("change:state",function(c,d,b){if((c.inReadyState())&&(!c.get("visible"))&&(!this.storage.get("show_hidden"))){this.removeHda(c)}},this);this.hdaViews={};this.urls={}},_setUpWebStorage:function(b,a,c){this.storage=new PersistantStorage("HistoryView."+this.model.get("id"),{expandedHdas:{},show_deleted:false,show_hidden:false});this.log("this.storage:",this.storage.get());if(b){this.storage.set("exandedHdas",b)}if((a===true)||(a===false)){this.storage.set("show_deleted",a)}if((c===true)||(c===false)){this.storage.set("show_hidden",c)}this.show_deleted=this.storage.get("show_deleted");this.show_hidden=this.storage.get("show_hidden");this.log("(init'd) this.storage:",this.storage.get())},add:function(a){this.render()},addAll:function(){this.render()},removeHda:function(a,c){var b=this.hdaViews[a.get("id")];b.$el.fadeOut("fast",function(){b.$el.remove();if(c){c()}});this.model.hdas.remove(a)},render:function(){var b=this,d=b.toString()+".set-up",c=$("<div/>"),a=this.model.toJSON(),e=(this.$el.children().size()===0);a.urls=this._renderUrls(a);c.append(HistoryPanel.templates.historyPanel(a));c.find(".tooltip").tooltip({placement:"bottom"});if(!this.model.hdas.length||!this.renderItems(c.find("#"+this.model.get("id")+"-datasets"))){c.find("#emptyHistoryMessage").show()}$(b).queue(d,function(f){b.$el.fadeOut("fast",function(){f()})});$(b).queue(d,function(f){b.$el.html("");b.$el.append(c.children());b.$el.fadeIn("fast",function(){f()})});$(b).queue(d,function(f){this.log(b+" rendered:",b.$el);b._setUpBehaviours();if(e){b.trigger("rendered:initial")}else{b.trigger("rendered")}f()});$(b).dequeue(d);return this},_renderUrls:function(a){var b=this;b.urls={};_.each(this.urlTemplates,function(d,c){b.urls[c]=_.template(d,a)});return b.urls},renderItems:function(b){this.hdaViews={};var a=this,c=this.model.hdas.getVisible(this.storage.get("show_deleted"),this.storage.get("show_hidden"));_.each(c,function(f){var e=f.get("id"),d=a.storage.get("expandedHdas").get(e);a.hdaViews[e]=new a.HDAView({model:f,expanded:d,urlTemplates:a.hdaUrlTemplates});a._setUpHdaListeners(a.hdaViews[e]);b.prepend(a.hdaViews[e].render().$el)});return c.length},_setUpHdaListeners:function(b){var a=this;b.bind("body-expanded",function(c){a.storage.get("expandedHdas").set(c,true)});b.bind("body-collapsed",function(c){a.storage.get("expandedHdas").deleteKey(c)})},_setUpBehaviours:function(){if(!(this.model.get("user")&&this.model.get("user").email)){return}var a=this.$("#history-annotation-area");this.$("#history-annotate").click(function(){if(a.is(":hidden")){a.slideDown("fast")}else{a.slideUp("fast")}return false});async_save_text("history-name-container","history-name",this.urls.rename,"new_name",18);async_save_text("history-annotation-container","history-annotation",this.urls.annotate,"new_annotation",18,true,4)},updateHistoryDiskSize:function(){this.$el.find("#history-size").text(this.model.get("nice_size"))},showQuotaMessage:function(){var a=this.$el.find("#quota-message-container");if(a.is(":hidden")){a.slideDown("fast")}},hideQuotaMessage:function(){var a=this.$el.find("#quota-message-container");if(!a.is(":hidden")){a.slideUp("fast")}},toggleShowDeleted:function(){this.storage.set("show_deleted",!this.storage.get("show_deleted"));this.render()},toggleShowHidden:function(){this.storage.set("show_hidden",!this.storage.get("show_hidden"));this.render()},collapseAllHdaBodies:function(){_.each(this.hdaViews,function(a){a.toggleBodyVisibility(null,false)});this.storage.set("expandedHdas",{})},loadAndDisplayTags:function(c){this.log(this+".loadAndDisplayTags",c);var d=this.$el.find("#history-tag-area"),b=d.find(".tag-elt");this.log("\t tagArea",d," tagElt",b);if(d.is(":hidden")){if(!jQuery.trim(b.html())){var a=this;$.ajax({url:a.urls.tag,error:function(){alert(_l("Tagging failed"))},success:function(e){b.html(e);b.find(".tooltip").tooltip();d.slideDown("fast")}})}else{d.slideDown("fast")}}else{d.slideUp("fast")}return false},toString:function(){var a=this.model.get("name")||"";return"HistoryPanel("+a+")"}});HistoryPanel.templates={historyPanel:Handlebars.templates["template-history-historyPanel"]};
\ 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
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/801e7cf8227f/
changeset: 801e7cf8227f
user: dan
date: 2012-12-06 22:26:02
summary: Fix for text area formbuilder when None is provided for size.
affected #: 1 file
diff -r 449f0ed92b4621093d2e1b38dee5894f2a9b959e -r 801e7cf8227fd2b9294a6140d0580b3c78f705fe lib/galaxy/web/form_builder.py
--- a/lib/galaxy/web/form_builder.py
+++ b/lib/galaxy/web/form_builder.py
@@ -67,8 +67,10 @@
>>> print TextArea( "bins", size="4x5", value="default" ).get_html()
<textarea name="bins" rows="4" cols="5">default</textarea>
"""
- def __init__( self, name, size="5x25", value=None ):
+ _DEFAULT_SIZE = "5x25"
+ def __init__( self, name, size=None, value=None ):
self.name = name
+ size = size or self._DEFAULT_SIZE
self.size = size.split("x")
self.rows = int(self.size[0])
self.cols = int(self.size[-1])
https://bitbucket.org/galaxy/galaxy-central/changeset/78a3508c4562/
changeset: 78a3508c4562
user: dan
date: 2012-12-06 22:26:02
summary: Fix for error reporting link due to client-side history change (id is now encoded id).
affected #: 1 file
diff -r 801e7cf8227fd2b9294a6140d0580b3c78f705fe -r 78a3508c456296bd7bd578f5c8dd121d7206fef8 lib/galaxy/webapps/galaxy/controllers/dataset.py
--- a/lib/galaxy/webapps/galaxy/controllers/dataset.py
+++ b/lib/galaxy/webapps/galaxy/controllers/dataset.py
@@ -168,7 +168,12 @@
@web.expose
def errors( self, trans, id ):
- hda = trans.sa_session.query( model.HistoryDatasetAssociation ).get( id )
+ try:
+ hda = trans.sa_session.query( model.HistoryDatasetAssociation ).get( id )
+ except:
+ hda = None
+ if not hda:
+ hda = trans.sa_session.query( model.HistoryDatasetAssociation ).get( trans.security.decode_id( id ) )
if not hda or not self._can_access_dataset( trans, hda ):
return trans.show_error_message( "Either this dataset does not exist or you do not have permission to access it." )
return trans.fill_template( "dataset/errors.mako", hda=hda )
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: When creating a new visualization for a dataset, default to dataset's dbkey.
by Bitbucket 06 Dec '12
by Bitbucket 06 Dec '12
06 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/449f0ed92b46/
changeset: 449f0ed92b46
user: jgoecks
date: 2012-12-06 22:13:56
summary: When creating a new visualization for a dataset, default to dataset's dbkey.
affected #: 1 file
diff -r e20afb791a6685c40440743a5973ff17ba90e875 -r 449f0ed92b4621093d2e1b38dee5894f2a9b959e lib/galaxy/webapps/galaxy/controllers/visualization.py
--- a/lib/galaxy/webapps/galaxy/controllers/visualization.py
+++ b/lib/galaxy/webapps/galaxy/controllers/visualization.py
@@ -691,25 +691,33 @@
Display browser for the visualization denoted by id and add the datasets listed in `dataset_ids`.
"""
+ # Get dataset to add.
+ new_dataset_id = kwargs.get( "dataset_id", None )
+
# Set up new browser if no id provided.
if not id:
+ # Use dbkey from dataset to be added or from incoming parameter.
+ dbkey = None
+ if new_dataset_id:
+ dbkey = self.get_dataset( trans, new_dataset_id ).dbkey
+ if dbkey == '?':
+ dbkey = kwargs.get( "dbkey", None )
+
return trans.fill_template( "tracks/browser.mako", config={},
- add_dataset=kwargs.get("dataset_id", None),
- default_dbkey=kwargs.get("dbkey", None) )
+ add_dataset=new_dataset_id,
+ default_dbkey=dbkey )
# Display saved visualization.
vis = self.get_visualization( trans, id, check_ownership=False, check_accessible=True )
viz_config = self.get_visualization_config( trans, vis )
- # Get new dataset if specified.
- new_dataset = kwargs.get("dataset_id", None)
'''
FIXME:
if new_dataset is not None:
if trans.security.decode_id(new_dataset) in [ d["dataset_id"] for d in viz_config.get("tracks") ]:
new_dataset = None # Already in browser, so don't add
'''
- return trans.fill_template( 'tracks/browser.mako', config=viz_config, add_dataset=new_dataset )
+ return trans.fill_template( 'tracks/browser.mako', config=viz_config, add_dataset=new_dataset_id )
@web.expose
def circster( self, trans, id=None, hda_ldda=None, dataset_id=None, dbkey=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: jgoecks: Add needed imports that went away after removing 'import *'
by Bitbucket 06 Dec '12
by Bitbucket 06 Dec '12
06 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/e20afb791a66/
changeset: e20afb791a66
user: jgoecks
date: 2012-12-06 20:38:49
summary: Add needed imports that went away after removing 'import *'
affected #: 2 files
diff -r c0b5edcce53c541c8eaf3a2f80390c84b1f721fb -r e20afb791a6685c40440743a5973ff17ba90e875 lib/galaxy/webapps/galaxy/controllers/page.py
--- a/lib/galaxy/webapps/galaxy/controllers/page.py
+++ b/lib/galaxy/webapps/galaxy/controllers/page.py
@@ -1,4 +1,4 @@
-from sqlalchemy import desc
+from sqlalchemy import desc, and_
from galaxy import model, web
from galaxy.web import error, url_for
from galaxy.model.item_attrs import UsesAnnotations, UsesItemRatings
diff -r c0b5edcce53c541c8eaf3a2f80390c84b1f721fb -r e20afb791a6685c40440743a5973ff17ba90e875 lib/galaxy/webapps/galaxy/controllers/visualization.py
--- a/lib/galaxy/webapps/galaxy/controllers/visualization.py
+++ b/lib/galaxy/webapps/galaxy/controllers/visualization.py
@@ -1,10 +1,11 @@
from __future__ import absolute_import
-from sqlalchemy import desc
+from sqlalchemy import desc, or_, and_
from galaxy import model, web
from galaxy.model.item_attrs import UsesAnnotations, UsesItemRatings
from galaxy.web.base.controller import BaseUIController, SharableMixin, UsesVisualizationMixin
from galaxy.web.framework.helpers import time_ago, grids, iff
+from galaxy.util.json import from_json_string
from galaxy.util.sanitize_html import sanitize_html
from galaxy.visualization.genomes import decode_dbkey
from galaxy.visualization.genome.visual_analytics import get_dataset_job
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 care in handling information retrieved from the tool shed by Galaxy.
by Bitbucket 06 Dec '12
by Bitbucket 06 Dec '12
06 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/c0b5edcce53c/
changeset: c0b5edcce53c
user: greg
date: 2012-12-06 15:38:14
summary: Add care in handling information retrieved from the tool shed by Galaxy.
affected #: 1 file
diff -r 9cf72c86ee4f37c9035cdc30912b4f33a0f6b3bb -r c0b5edcce53c541c8eaf3a2f80390c84b1f721fb 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
@@ -1099,7 +1099,12 @@
filtered_repo_info_dicts = []
for repo_info_dict in repo_info_dicts:
for name, repo_info_tuple in repo_info_dict.items():
- description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = repo_info_tuple
+ # 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
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.
@@ -1208,7 +1213,11 @@
repo_info_dict = repo_info_dicts[ 0 ]
name = repo_info_dict.keys()[ 0 ]
repo_info_tuple = repo_info_dict[ name ]
- description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = repo_info_tuple
+ 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
url = url_join( tool_shed_url,
'repository/get_readme_files?name=%s&owner=%s&changeset_revision=%s' % \
( name, repository_owner, changeset_revision ) )
@@ -1396,7 +1405,11 @@
# Handle case where the repository was previously installed using an older changeset_revsion, but later the repository was updated
# in the tool shed and now we're trying to install the latest changeset revision of the same repository instead of updating the one
# that was previously installed. We'll look in the database instead of on disk since the repository may be uninstalled.
- description, repository_clone_url, changeset_revision, ctx_rev, repository_owner, repository_dependencies, tool_dependencies = repo_info_tuple
+ 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
tool_shed = 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.
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: A few fixes for retriveingdictionary entries and a few enhancements to the tool shed containers.
by Bitbucket 05 Dec '12
by Bitbucket 05 Dec '12
05 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/9cf72c86ee4f/
changeset: 9cf72c86ee4f
user: greg
date: 2012-12-06 00:14:10
summary: A few fixes for retriveingdictionary entries and a few enhancements to the tool shed containers.
affected #: 3 files
diff -r 75a97c971d36599955f67384b6f36ca73a80dd2e -r 9cf72c86ee4f37c9035cdc30912b4f33a0f6b3bb lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -819,7 +819,6 @@
"""Generate a repository dependencies dictionary based on valid information defined in the received repository_dependencies_config."""
repository_dependencies_tups = []
error_message = ''
- config_file_name = strip_path( repository_dependencies_config )
try:
# Make sure we're looking at a valid repository_dependencies.xml file.
tree = util.parse_xml( repository_dependencies_config )
@@ -838,15 +837,13 @@
changeset_revision = repository_elem.attrib[ 'changeset_revision' ]
user = None
repository = None
- # Repository dependencies are currentlhy supported only within a single tool shed.
if tool_shed_is_this_tool_shed( toolshed ):
try:
user = sa_session.query( app.model.User ) \
.filter( app.model.User.table.c.username == owner ) \
.one()
except Exception, e:
- error_message = "Invalid owner %s defined for repository %s in config file %s. " % ( owner, name, config_file_name )
- error_message += "Repository dependencies will be ignored."
+ error_message = "Invalid owner %s defined for repository %s. Repository dependencies will be ignored." % ( owner, name )
log.debug( error_message )
return metadata_dict, error_message
if user:
@@ -856,8 +853,7 @@
app.model.Repository.table.c.user_id == user.id ) ) \
.first()
except:
- error_message = "Invalid name %s or owner %s defined for repository in config file %s. " % ( name, owner, config_file_name )
- error_message += "Repository dependencies will be ignored."
+ error_message = "Invalid name %s or owner %s defined for repository. Repository dependencies will be ignored." % ( name, owner )
log.debug( error_message )
return metadata_dict, error_message
if repository:
@@ -865,16 +861,19 @@
if repository_dependencies_tup not in repository_dependencies_tups:
repository_dependencies_tups.append( repository_dependencies_tup )
else:
- error_message = "Invalid name %s or owner %s defined for repository in config file %s. " % ( name, owner, config_file_name )
- error_message += "Repository dependencies will be ignored."
+ error_message = "Invalid name %s or owner %s defined for repository. Repository dependencies will be ignored." % ( name, owner )
log.debug( error_message )
return metadata_dict, error_message
else:
- # We have an invalid repository owner defined for an entry in repository_dependencies.xml.
- config_file_name = strip_path( repository_dependencies_config )
- error_message = "Invalid username %s defined for owner of repository %s in config file %s. Repository dependencies will be ignored." % ( owner, name, config_file_name )
+ error_message = "Invalid owner %s defined for owner of repository %s. Repository dependencies will be ignored." % ( owner, name )
log.debug( error_message )
- return metadata_dict, error_message
+ return metadata_dict, error_message
+ else:
+ # Repository dependencies are currentlhy supported within a single tool shed.
+ error_message = "Invalid tool shed %s defined for repository %s. " % ( toolshed, name )
+ error_message += "Repository dependencies are currently supported within a single tool shed, so your definition will be ignored."
+ log.debug( error_message )
+ return metadata_dict, error_message
if repository_dependencies_tups:
repository_dependencies_dict = dict( description=root.get( 'description' ),
repository_dependencies=repository_dependencies_tups )
diff -r 75a97c971d36599955f67384b6f36ca73a80dd2e -r 9cf72c86ee4f37c9035cdc30912b4f33a0f6b3bb lib/galaxy/webapps/community/util/container_util.py
--- a/lib/galaxy/webapps/community/util/container_util.py
+++ b/lib/galaxy/webapps/community/util/container_util.py
@@ -7,10 +7,11 @@
class Folder( object ):
"""Container object."""
- def __init__( self, id=None, key=None, label=None ):
+ def __init__( self, id=None, key=None, label=None, parent=None ):
self.id = id
self.key = key
self.label = label
+ self.parent = parent
self.description = None
self.datatypes = []
self.folders = []
@@ -25,8 +26,18 @@
if folder == contained_folder:
return index, contained_folder
return 0, None
+ def contains_repository_dependency( self, repository_dependency ):
+ listified_repository_dependency = repository_dependency.listify
+ for contained_repository_dependency in self.repository_dependencies:
+ if contained_repository_dependency.listify == listified_repository_dependency:
+ return True
+ return False
def remove_repository_dependency( self, repository_dependency ):
- self.repository_dependencies.remove( repository_dependency )
+ listified_repository_dependency = repository_dependency.listify
+ for contained_repository_dependency in self.repository_dependencies:
+ if contained_repository_dependency.listify == listified_repository_dependency:
+ self.repository_dependencies.remove( contained_repository_dependency )
+
class Datatype( object ):
"""Datatype object"""
def __init__( self, id=None, extension=None, type=None, mimetype=None, subclass=None ):
@@ -102,9 +113,9 @@
if datatypes:
datatype_id = 0
folder_id += 1
- datatypes_root_folder = Folder( id=folder_id, key='root', label='root' )
+ datatypes_root_folder = Folder( id=folder_id, key='root', label='root', parent=None )
folder_id += 1
- folder = Folder( id=folder_id, key='datatypes', label=label )
+ folder = Folder( id=folder_id, key='datatypes', label=label, parent=datatypes_root_folder )
datatypes_root_folder.folders.append( folder )
# Insert a header row.
datatype_id += 1
@@ -131,9 +142,9 @@
if invalid_tool_configs:
invalid_tool_id = 0
folder_id += 1
- invalid_tools_root_folder = Folder( id=folder_id, key='root', label='root' )
+ invalid_tools_root_folder = Folder( id=folder_id, key='root', label='root', parent=None )
folder_id += 1
- folder = Folder( id=folder_id, key='invalid_tools', label=label )
+ folder = Folder( id=folder_id, key='invalid_tools', label=label, parent=invalid_tools_root_folder )
invalid_tools_root_folder.folders.append( folder )
for invalid_tool_config in invalid_tool_configs:
invalid_tool_id += 1
@@ -155,24 +166,22 @@
multiple_readme_files = len( readme_files_dict ) > 1
readme_id = 0
folder_id += 1
- readme_files_root_folder = Folder( id=folder_id, key='root', label='root' )
+ readme_files_root_folder = Folder( id=folder_id, key='root', label='root', parent=None )
if multiple_readme_files:
folder_id += 1
- readme_files_folder = Folder( id=folder_id, key='readme_files', label=label )
+ readme_files_folder = Folder( id=folder_id, key='readme_files', label=label, parent=readme_files_root_folder )
readme_files_root_folder.folders.append( readme_files_folder )
for readme_file_name, readme_file_text in readme_files_dict.items():
readme_id += 1
- readme = ReadMe( id=readme_id,
- name=readme_file_name,
- text=readme_file_text )
+ readme = ReadMe( id=readme_id, name=readme_file_name, text=readme_file_text )
if multiple_readme_files:
folder_id += 1
- folder = Folder( id=folder_id, key=readme.name, label=readme.name )
+ folder = Folder( id=folder_id, key=readme.name, label=readme.name, parent=readme_files_folder )
folder.readme_files.append( readme )
readme_files_folder.folders.append( folder )
else:
folder_id += 1
- readme_files_folder = Folder( id=folder_id, key='readme_files', label=readme.name )
+ readme_files_folder = Folder( id=folder_id, key='readme_files', label=readme.name, parent=readme_files_root_folder )
readme_files_folder.readme_files.append( readme )
readme_files_root_folder.folders.append( readme_files_folder )
else:
@@ -185,11 +194,11 @@
repository_dependency_id = 0
folder_id += 1
# Create the root folder.
- repository_dependencies_root_folder = Folder( id=folder_id, key='root', label='root' )
+ repository_dependencies_root_folder = Folder( id=folder_id, key='root', label='root', parent=None )
folder_id += 1
# Create the Repository dependencies folder and add it to the root folder.
repository_dependencies_folder_key = repository_dependencies[ 'root_key' ]
- repository_dependencies_folder = Folder( id=folder_id, key=repository_dependencies_folder_key, label=label )
+ repository_dependencies_folder = Folder( id=folder_id, key=repository_dependencies_folder_key, label=label, parent=repository_dependencies_root_folder )
# The received repository_dependencies is a dictionary with a single 'description' key, and one or more repository_dependency keys.
# We want the description value associated with the repository_dependencies_folder.
repository_dependencies_folder.description = repository_dependencies.get( 'description', None )
@@ -203,7 +212,7 @@
# Create a new folder.
folder_id += 1
label = generate_repository_dependencies_folder_label_from_key( repository_name, repository_owner, changeset_revision, key )
- folder = Folder( id=folder_id, key=key, label=label )
+ folder = Folder( id=folder_id, key=key, label=label, parent=repository_dependencies_folder )
for repository_dependency_tup in val:
toolshed, name, owner, changeset_revision = repository_dependency_tup
# Create a new repository_dependency.
@@ -218,8 +227,8 @@
if not get_folder( repository_dependencies_folder, key ):
# Insert the folder into the list.
repository_dependencies_folder.folders.append( folder )
- # Remove repository_dependencies that are also folders.
- remove_unwanted_repository_dependencies( repository_dependencies_folder )
+ # Remove repository_dependencies that are also folders, and coerce empty folders into repository dependencies.
+ prune_repository_dependencies( repository_dependencies_folder, repository_dependencies_folder )
else:
repository_dependencies_root_folder = None
return folder_id, repository_dependencies_root_folder
@@ -228,9 +237,9 @@
if tool_dicts:
tool_id = 0
folder_id += 1
- tools_root_folder = Folder( id=folder_id, key='root', label='root' )
+ tools_root_folder = Folder( id=folder_id, key='root', label='root', parent=None )
folder_id += 1
- folder = Folder( id=folder_id, key='tools', label=label )
+ folder = Folder( id=folder_id, key='tools', label=label, parent=tools_root_folder )
tools_root_folder.folders.append( folder )
# Insert a header row.
tool_id += 1
@@ -272,9 +281,9 @@
if tool_dependencies:
tool_dependency_id = 0
folder_id += 1
- tool_dependencies_root_folder = Folder( id=folder_id, key='root', label='root' )
+ tool_dependencies_root_folder = Folder( id=folder_id, key='root', label='root', parent=None )
folder_id += 1
- folder = Folder( id=folder_id, key='tool_dependencies', label=label )
+ folder = Folder( id=folder_id, key='tool_dependencies', label=label, parent=tool_dependencies_root_folder )
tool_dependencies_root_folder.folders.append( folder )
# Insert a header row.
tool_dependency_id += 1
@@ -320,9 +329,9 @@
if workflows:
workflow_id = 0
folder_id += 1
- workflows_root_folder = Folder( id=folder_id, key='root', label='root' )
+ workflows_root_folder = Folder( id=folder_id, key='root', label='root', parent=None )
folder_id += 1
- folder = Folder( id=folder_id, key='workflows', label=label )
+ folder = Folder( id=folder_id, key='workflows', label=label, parent=workflows_root_folder )
workflows_root_folder.folders.append( folder )
# Insert a header row.
workflow_id += 1
@@ -388,10 +397,19 @@
def key_is_current_repositorys_key( repository_name, repository_owner, changeset_revision, key ):
toolshed_base_url, key_name, key_owner, key_changeset_revision = get_components_from_key( key )
return repository_name == key_name and repository_owner == key_owner and changeset_revision == key_changeset_revision
-def remove_unwanted_repository_dependencies( folder ):
+def prune_folder( folder, repository_dependency, key ):
+ if get_folder( folder, key ):
+ folder.remove_repository_dependency( repository_dependency )
+ for sub_folder in folder.folders:
+ prune_folder( sub_folder, repository_dependency, key )
+def prune_repository_dependencies( folder, root_folder ):
+ """Remove repository_dependencies that are also folders, and coerce empty folders into repository dependencies."""
+ remove_repository_dependencies( folder, root_folder )
+ for sub_folder in folder.folders:
+ prune_repository_dependencies( sub_folder, root_folder )
+def remove_repository_dependencies( folder, root_folder ):
for repository_dependency in folder.repository_dependencies:
toolshed, name, owner, changeset_revision = repository_dependency.listify
key = generate_repository_dependencies_key_for_repository( toolshed, name, owner, changeset_revision )
- if get_folder( folder, key ):
- folder.remove_repository_dependency( repository_dependency )
+ prune_folder( root_folder, repository_dependency, key )
\ No newline at end of file
diff -r 75a97c971d36599955f67384b6f36ca73a80dd2e -r 9cf72c86ee4f37c9035cdc30912b4f33a0f6b3bb 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
@@ -1066,10 +1066,10 @@
raw_text = response.read()
response.close()
repo_information_dict = from_json_string( raw_text )
- includes_tools = util.string_as_bool( repo_information_dict[ 'includes_tools' ] )
- includes_repository_dependencies = util.string_as_bool( repo_information_dict[ 'includes_repository_dependencies' ] )
- includes_tool_dependencies = util.string_as_bool( repo_information_dict[ 'includes_tool_dependencies' ] )
- encoded_repo_info_dicts = util.listify( repo_information_dict[ 'repo_info_dicts' ] )
+ includes_tools = util.string_as_bool( repo_information_dict.get( 'includes_tools', False ) )
+ 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 ]
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 ) ):
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
05 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/75a97c971d36/
changeset: 75a97c971d36
user: natefoo
date: 2012-12-05 23:50:23
summary: Allow matching in tool_handlers and tool_runners on toolshed guid, toolshed guid minus version, and based (old) id. Matching occurs in that order (more specific IDs override less specific ones).
affected #: 1 file
diff -r 42a6e3f82c0d2c5ec5bd4af1fca3bac125ffe9c9 -r 75a97c971d36599955f67384b6f36ca73a80dd2e lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -993,17 +993,24 @@
else:
self.parallelism = None
# Set job handler(s). Each handler is a dict with 'url' and, optionally, 'params'.
- self_id = self.id.lower()
+ self_ids = [ self.id.lower() ]
+ if self.old_id != self.id:
+ # Handle toolshed guids
+ self_ids = [ self.id.lower(), self.id.lower().rsplit('/',1)[0], self.old_id.lower() ]
self.job_handlers = [ { "name" : name } for name in self.app.config.default_job_handlers ]
# Set custom handler(s) if they're defined.
- if self_id in self.app.config.tool_handlers:
- self.job_handlers = self.app.config.tool_handlers[ self_id ]
+ for self_id in self_ids:
+ if self_id in self.app.config.tool_handlers:
+ self.job_handlers = self.app.config.tool_handlers[ self_id ]
+ break
# Set job runner(s). Each runner is a dict with 'url' and, optionally, 'params'.
# Set job runner to the cluster default
self.job_runners = [ { "url" : self.app.config.default_cluster_job_runner } ]
# Set custom runner(s) if they're defined.
- if self_id in self.app.config.tool_runners:
- self.job_runners = self.app.config.tool_runners[ self_id ]
+ for self_id in self_ids:
+ if self_id in self.app.config.tool_runners:
+ self.job_runners = self.app.config.tool_runners[ self_id ]
+ break
# Is this a 'hidden' tool (hidden in tool menu)
self.hidden = util.xml_text(root, "hidden")
if self.hidden: self.hidden = util.string_as_bool(self.hidden)
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/8ea1787b037b/
changeset: 8ea1787b037b
user: inithello
date: 2012-12-05 20:36:20
summary: More tool shed functional test enhancements.
affected #: 21 files
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/base/common.py
--- /dev/null
+++ b/test/tool_shed/base/common.py
@@ -0,0 +1,15 @@
+admin_user = None
+admin_user_private_role = None
+admin_email = 'test(a)bx.psu.edu'
+admin_username = 'admin-user'
+
+test_user_1 = None
+test_user_1_private_role = None
+test_user_1_email = 'test-1(a)bx.psu.edu'
+test_user_1_name = 'user1'
+
+new_repository_dependencies_xml = '''<?xml version="1.0"?>
+<repositories>
+ <repository toolshed="${toolshed_url}" name="${repository_name}" owner="${owner}" changeset_revision="${changeset_revision}" />
+</repositories>
+'''
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/base/twilltestcase.py
--- a/test/tool_shed/base/twilltestcase.py
+++ b/test/tool_shed/base/twilltestcase.py
@@ -1,6 +1,7 @@
from base.twilltestcase import *
from galaxy.webapps.community.util.hgweb_config import *
from test_db_util import *
+from common import *
import string
from galaxy import eggs
@@ -137,6 +138,10 @@
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_manage_repository_page( self, repository, strings_displayed=[], strings_not_displayed=[] ):
+ url = '/repository/manage_repository?id=%s' % self.security.encode_id( repository.id )
+ self.visit_url( url )
+ self.check_for_strings( strings_displayed, strings_not_displayed )
def display_repository_clone_page( self, owner_name, repository_name, strings_displayed=[], strings_not_displayed=[] ):
url = '/repos/%s/%s' % ( owner_name, repository_name )
self.visit_url( url )
@@ -204,6 +209,15 @@
else:
string = string.replace( character, replacement )
return string
+ def generate_repository_dependency_xml( self, repository, xml_filename ):
+ changeset_revision = self.get_repository_tip( repository )
+ template_parser = string.Template( new_repository_dependencies_xml )
+ repository_dependency_xml = template_parser.safe_substitute( toolshed_url=self.url,
+ owner=repository.user.username,
+ repository_name=repository.name,
+ changeset_revision=changeset_revision )
+ # Save the generated xml to test-data/emboss_5/repository_dependencies.xml.
+ file( xml_filename, 'w' ).write( repository_dependency_xml )
def get_latest_repository_metadata_for_repository( self, repository ):
# TODO: This will not work as expected. Fix it.
return repository.metadata_revisions[ 0 ]
@@ -279,10 +293,6 @@
( 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 display_manage_repository_page( self, repository, strings_displayed=[], strings_not_displayed=[] ):
- url = '/repository/manage_repository?id=%s' % self.security.encode_id( repository.id )
- self.visit_url( url )
- self.check_for_strings( strings_displayed, strings_not_displayed )
def revoke_write_access( self, repository, username ):
url = '/repository/manage_repository?user_access_button=Remove&id=%s&remove_auth=%s' % \
( self.security.encode_id( repository.id ), username )
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 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,16 +1,6 @@
from tool_shed.base.twilltestcase import *
from tool_shed.base.test_db_util import *
-admin_user = None
-admin_user_private_role = None
-admin_email = 'test(a)bx.psu.edu'
-admin_username = 'admin-user'
-
-test_user_1 = None
-test_user_1_private_role = None
-test_user_1_email = 'test-1(a)bx.psu.edu'
-test_user_1_name = 'user1'
-
repository_name = 'filtering'
repository_description = "Galaxy's filtering tool"
repository_long_description = "Long description of Galaxy's filtering tool"
@@ -60,7 +50,7 @@
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, admin_username )
- self.upload_file( repository, 'filtering_1.1.0.tar', commit_message="Uploaded filtering 1.1.0" )
+ 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, admin_username )
@@ -102,7 +92,7 @@
'''Upload filtering.txt file associated with tool version 1.1.0.'''
repository = get_repository_by_name_and_owner( repository_name, admin_username )
self.upload_file( repository,
- 'filtering.txt',
+ 'filtering/filtering.txt',
commit_message="Uploaded filtering.txt",
uncompress_file='No',
remove_repo_files_not_in_tar='No' )
@@ -110,7 +100,7 @@
def test_0055_upload_filtering_test_data( self ):
'''Upload filtering test data.'''
repository = get_repository_by_name_and_owner( repository_name, admin_username )
- self.upload_file( repository, 'filtering_test_data.tar', commit_message="Uploaded filtering test data", remove_repo_files_not_in_tar='No' )
+ 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',
filepath='test-data',
@@ -121,7 +111,7 @@
'''Upload filtering version 2.2.0'''
repository = get_repository_by_name_and_owner( repository_name, admin_username )
self.upload_file( repository,
- 'filtering_2.2.0.tar',
+ '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 ):
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 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,16 +1,6 @@
from tool_shed.base.twilltestcase import *
from tool_shed.base.test_db_util import *
-admin_user = None
-admin_user_private_role = None
-admin_email = 'test(a)bx.psu.edu'
-admin_username = 'admin-user'
-
-test_user_1 = None
-test_user_1_private_role = None
-test_user_1_email = 'test-1(a)bx.psu.edu'
-test_user_1_name = 'user1'
-
repository_name = 'freebayes'
repository_description = "Galaxy's freebayes tool"
repository_long_description = "Long description of Galaxy's freebayes tool"
@@ -24,11 +14,11 @@
admin_user = get_user( 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 )
- def test_0005_create_categories( self ):
- """Create categories"""
+ def test_0005_create_category( self ):
+ """Create SNP Analysis category."""
self.create_category( 'SNP Analysis', 'Tools for single nucleotide polymorphism data such as WGA' )
- def test_0005_create_freebayes_repository_and_upload_tool_xml( self ):
- '''Upload freebayes.xml without tool_data_table_conf.xml.sample. This should result in an error and invalid tool.'''
+ 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.create_repository( repository_name,
repository_description,
repository_long_description=repository_long_description,
@@ -45,38 +35,42 @@
self.check_repository_invalid_tools_for_changeset_revision( repository,
tip,
strings_displayed=[ 'requires an entry', 'tool_data_table_conf.xml' ] )
- def test_0010_upload_missing_tool_data_table_conf_file( self ):
+ 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, admin_username )
self.upload_file( repository,
'freebayes/tool_data_table_conf.xml.sample',
+ valid_tools_only=False,
strings_displayed=[],
commit_message='Uploaded the tool data table sample file.' )
- def test_0015_upload_missing_sample_loc_file( self ):
+ self.display_manage_repository_page( repository, strings_displayed=[ 'Invalid tools' ], strings_not_displayed=[ 'Valid tools' ] )
+ tip = self.get_repository_tip( repository )
+ self.check_repository_invalid_tools_for_changeset_revision( repository,
+ tip,
+ strings_displayed=[ 'refers to a file', 'sam_fa_indices.loc' ] )
+ def test_0020_upload_missing_sample_loc_file( self ):
'''Upload the missing sam_fa_indices.loc.sample file to the repository.'''
- # Freebayes does not generate an error when the loc file is missing.
- # TODO: Generate a test case for that situation.
repository = get_repository_by_name_and_owner( repository_name, admin_username )
self.upload_file( repository,
'freebayes/sam_fa_indices.loc.sample',
strings_displayed=[],
commit_message='Uploaded tool data table .loc file.' )
- def test_0020_upload_invalid_tool_dependency_xml( self ):
+ 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, admin_username )
self.upload_file( repository,
- os.path.join( 'freebayes', 'invalid_deps', 'tool_dependencies.xml' ),
+ 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_0025_upload_valid_tool_dependency_xml( self ):
+ 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, admin_username )
self.upload_file( repository,
os.path.join( 'freebayes', 'tool_dependencies.xml' ),
commit_message='Uploaded valid tool dependency XML.' )
- def test_0030_verify_tool_dependencies( self ):
+ 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, admin_username )
self.display_manage_repository_page( repository,
- strings_displayed=[ 'freebayes', '0.9.4_9696d0ce8a9', 'samtools', '0.1.18', 'Valid tools' ],
- strings_not_displayed=[ 'Invalid tools' ] )
+ strings_displayed=[ 'freebayes', '0.9.4_9696d0ce8a9', 'samtools', '0.1.18', 'Valid tools' ],
+ strings_not_displayed=[ 'Invalid tools' ] )
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/functional/test_0020_basic_repository_dependencies.py
--- /dev/null
+++ b/test/tool_shed/functional/test_0020_basic_repository_dependencies.py
@@ -0,0 +1,71 @@
+from tool_shed.base.twilltestcase import *
+from tool_shed.base.test_db_util import *
+
+datatypes_repository_name = 'emboss_datatypes'
+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_5'
+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 TestBasicRepositoryDependencies( ShedTwillTestCase ):
+ '''Testing emboss 5 with repository dependencies.'''
+ def test_0000_initiate_users( self ):
+ """Create necessary user accounts and login as an admin user."""
+ self.logout()
+ self.login( email=admin_email, username=admin_username )
+ admin_user = get_user( 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 )
+ self.logout()
+ self.login( email=test_user_1_email, username=test_user_1_name )
+ test_user_1 = get_user( test_user_1_email )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % regular_email
+ test_user_1_private_role = get_private_role( test_user_1 )
+ def test_0005_create_category( self ):
+ """Create Sequence Analysis category"""
+ self.logout()
+ self.login( email=admin_email, username=admin_username )
+ self.create_category( 'Sequence Analysis', 'Tools for performing Protein and DNA/RNA analysis' )
+ def test_0010_create_emboss_datatypes_repository_and_upload_tarball( self ):
+ '''Create and populate the emboss_datatypes repository.'''
+ self.logout()
+ self.login( email=test_user_1_email, username=test_user_1_name )
+ self.create_repository( datatypes_repository_name,
+ datatypes_repository_description,
+ repository_long_description=datatypes_repository_long_description,
+ categories=[ 'Sequence Analysis' ],
+ strings_displayed=[] )
+ repository = get_repository_by_name_and_owner( datatypes_repository_name, 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, 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 repository.'''
+ self.create_repository( emboss_repository_name,
+ emboss_repository_description,
+ repository_long_description=emboss_repository_long_description,
+ categories=[ 'Text Manipulation' ],
+ strings_displayed=[] )
+ repository = get_repository_by_name_and_owner( emboss_repository_name, test_user_1_name )
+ self.upload_file( repository, 'emboss/5/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, test_user_1_name )
+ datatypes_repository = get_repository_by_name_and_owner( datatypes_repository_name, test_user_1_name )
+ self.generate_repository_dependency_xml( datatypes_repository, self.get_filename( 'emboss/5/repository_dependencies.xml' ) )
+ self.upload_file( repository, 'emboss/5/repository_dependencies.xml', 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, test_user_1_name )
+ datatypes_repository = get_repository_by_name_and_owner( datatypes_repository_name, test_user_1_name )
+ changeset_revision = self.get_repository_tip( datatypes_repository )
+ strings_displayed = [ datatypes_repository_name, test_user_1_name, changeset_revision, 'Repository dependencies' ]
+ self.display_manage_repository_page( repository, strings_displayed=strings_displayed )
+ def test_0035_cleanup( self ):
+ '''Clean up generated test data.'''
+ if os.path.exists( self.get_filename( 'emboss/5/repository_dependencies.xml' ) ):
+ os.remove( self.get_filename( 'emboss/5/repository_dependencies.xml' ) )
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/functional/test_0020_emboss_repository_dependencies.py
--- a/test/tool_shed/functional/test_0020_emboss_repository_dependencies.py
+++ /dev/null
@@ -1,95 +0,0 @@
-from tool_shed.base.twilltestcase import *
-from tool_shed.base.test_db_util import *
-
-admin_user = None
-admin_user_private_role = None
-admin_email = 'test(a)bx.psu.edu'
-admin_username = 'admin-user'
-
-test_user_1 = None
-test_user_1_private_role = None
-test_user_1_email = 'test-1(a)bx.psu.edu'
-test_user_1_name = 'user1'
-
-datatypes_repository_name = 'emboss_datatypes'
-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_5'
-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'
-
-new_repository_dependencies_xml = '''<?xml version="1.0"?>
-<repositories>
- <repository toolshed="${toolshed_url}" name="${repository_name}" owner="${owner}" changeset_revision="${changeset_revision}" />
-</repositories>
-'''
-
-class TestEmbossRepositoryDependencies( ShedTwillTestCase ):
- '''Testing emboss 5 with repository dependencies.'''
- def test_0000_initiate_users( self ):
- """Create necessary user accounts and login as an admin user."""
- self.logout()
- self.login( email=admin_email, username=admin_username )
- admin_user = get_user( 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 )
- self.logout()
- self.login( email=test_user_1_email, username=test_user_1_name )
- test_user_1 = get_user( test_user_1_email )
- assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % regular_email
- test_user_1_private_role = get_private_role( test_user_1 )
- def test_0005_create_categories( self ):
- """Create categories"""
- self.logout()
- self.login( email=admin_email, username=admin_username )
- self.create_category( 'Sequence Analysis', 'Tools for performing Protein and DNA/RNA analysis' )
- def test_0010_create_emboss_datatypes_repository_and_upload_tarball( self ):
- '''Create the emboss_datatypes repository and upload the tarball.'''
- self.logout()
- self.login( email=test_user_1_email, username=test_user_1_name )
- self.create_repository( datatypes_repository_name,
- datatypes_repository_description,
- repository_long_description=datatypes_repository_long_description,
- categories=[ 'Sequence Analysis' ],
- strings_displayed=[] )
- repository = get_repository_by_name_and_owner( datatypes_repository_name, test_user_1_name )
- self.upload_file( repository,
- 'emboss_5/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, test_user_1_name )
- self.display_manage_repository_page( repository, strings_displayed=[ 'Datatypes', 'equicktandem', 'hennig86', 'vectorstrip' ] )
- def test_0020_generate_repository_dependencies_xml( self ):
- '''Generate the repository_dependencies.xml file for the emboss_5 repository.'''
- datatypes_repository = get_repository_by_name_and_owner( datatypes_repository_name, test_user_1_name )
- changeset_revision = self.get_repository_tip( datatypes_repository )
- template_parser = string.Template( new_repository_dependencies_xml )
- repository_dependency_xml = template_parser.safe_substitute( toolshed_url=self.url,
- owner=test_user_1_name,
- repository_name=datatypes_repository.name,
- changeset_revision=changeset_revision )
- # Save the generated xml to test-data/emboss_5/repository_dependencies.xml.
- file( self.get_filename( 'emboss_5/repository_dependencies.xml' ), 'w' ).write( repository_dependency_xml )
- def test_0025_create_emboss_5_repository_and_upload_files( self ):
- '''Create the emboss_5 repository and upload a tool tarball, then generate and upload repository_dependencies.xml.'''
- self.create_repository( emboss_repository_name,
- emboss_repository_description,
- repository_long_description=emboss_repository_long_description,
- categories=[ 'Text Manipulation' ],
- strings_displayed=[] )
- repository = get_repository_by_name_and_owner( emboss_repository_name, test_user_1_name )
- self.upload_file( repository, 'emboss_5/emboss_5.tar', commit_message='Uploaded emboss_5.tar' )
- self.upload_file( repository, 'emboss_5/repository_dependencies.xml', 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, test_user_1_name )
- datatypes_repository = get_repository_by_name_and_owner( datatypes_repository_name, test_user_1_name )
- changeset_revision = self.get_repository_tip( datatypes_repository )
- strings_displayed = [ datatypes_repository_name, test_user_1_name, changeset_revision, 'Repository dependencies' ]
- self.display_manage_repository_page( repository, strings_displayed=strings_displayed )
- def test_0035_cleanup( self ):
- '''Clean up generated test data.'''
- if os.path.exists( self.get_filename( 'emboss_5/repository_dependencies.xml' ) ):
- os.remove( self.get_filename( 'emboss_5/repository_dependencies.xml' ) )
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/emboss/5/emboss.tar
Binary file test/tool_shed/test_data/emboss/5/emboss.tar has changed
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/emboss/6/emboss.tar
Binary file test/tool_shed/test_data/emboss/6/emboss.tar has changed
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/emboss/datatypes/datatypes_conf.xml
--- /dev/null
+++ b/test/tool_shed/test_data/emboss/datatypes/datatypes_conf.xml
@@ -0,0 +1,101 @@
+<?xml version="1.0"?>
+<datatypes>
+ <registration>
+ <datatype extension="acedb" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="asn1" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="btwisted" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="cai" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="charge" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="checktrans" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="chips" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="clustal" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="codata" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="codcmp" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="coderet" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="compseq" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="cpgplot" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="cpgreport" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="cusp" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="cut" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="dan" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="dbmotif" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="diffseq" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="digest" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="dreg" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="einverted" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="embl" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="epestfind" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="equicktandem" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="est2genome" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="etandem" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="excel" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="feattable" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="fitch" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="freak" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="fuzznuc" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="fuzzpro" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="fuzztran" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="garnier" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="gcg" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="geecee" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="genbank" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="helixturnhelix" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="hennig86" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="hmoment" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="ig" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="isochore" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="jackknifer" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="jackknifernon" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="markx0" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="markx1" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="markx10" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="markx2" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="markx3" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="match" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="mega" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="meganon" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="motif" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="msf" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="nametable" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="ncbi" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="needle" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="newcpgreport" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="newcpgseek" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="nexus" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="nexusnon" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="noreturn" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="pair" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="palindrome" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="pepcoil" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="pepinfo" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="pepstats" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="phylip" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="phylipnon" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="pir" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="polydot" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="preg" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="prettyseq" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="primersearch" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="regions" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="score" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="selex" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="seqtable" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="showfeat" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="showorf" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="simple" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="sixpack" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="srs" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="srspair" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="staden" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="strider" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="supermatcher" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="swiss" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="syco" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="table" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="tagseq" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="textsearch" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="vectorstrip" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="wobble" type="galaxy.datatypes.data:Text" subclass="True"/>
+ <datatype extension="wordcount" type="galaxy.datatypes.data:Text" subclass="True"/>
+ </registration>
+</datatypes>
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/emboss_5/datatypes_conf.xml
--- a/test/tool_shed/test_data/emboss_5/datatypes_conf.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<?xml version="1.0"?>
-<datatypes>
- <registration>
- <datatype extension="acedb" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="asn1" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="btwisted" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="cai" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="charge" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="checktrans" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="chips" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="clustal" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="codata" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="codcmp" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="coderet" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="compseq" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="cpgplot" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="cpgreport" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="cusp" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="cut" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="dan" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="dbmotif" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="diffseq" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="digest" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="dreg" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="einverted" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="embl" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="epestfind" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="equicktandem" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="est2genome" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="etandem" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="excel" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="feattable" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="fitch" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="freak" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="fuzznuc" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="fuzzpro" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="fuzztran" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="garnier" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="gcg" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="geecee" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="genbank" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="helixturnhelix" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="hennig86" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="hmoment" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="ig" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="isochore" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="jackknifer" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="jackknifernon" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="markx0" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="markx1" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="markx10" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="markx2" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="markx3" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="match" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="mega" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="meganon" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="motif" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="msf" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="nametable" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="ncbi" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="needle" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="newcpgreport" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="newcpgseek" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="nexus" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="nexusnon" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="noreturn" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="pair" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="palindrome" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="pepcoil" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="pepinfo" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="pepstats" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="phylip" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="phylipnon" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="pir" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="polydot" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="preg" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="prettyseq" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="primersearch" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="regions" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="score" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="selex" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="seqtable" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="showfeat" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="showorf" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="simple" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="sixpack" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="srs" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="srspair" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="staden" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="strider" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="supermatcher" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="swiss" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="syco" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="table" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="tagseq" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="textsearch" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="vectorstrip" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="wobble" type="galaxy.datatypes.data:Text" subclass="True"/>
- <datatype extension="wordcount" type="galaxy.datatypes.data:Text" subclass="True"/>
- </registration>
-</datatypes>
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/emboss_5/emboss_5.tar
Binary file test/tool_shed/test_data/emboss_5/emboss_5.tar has changed
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/filtering.txt
--- a/test/tool_shed/test_data/filtering.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-Readme file for filtering 1.1.0
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/filtering/filtering.txt
--- /dev/null
+++ b/test/tool_shed/test_data/filtering/filtering.txt
@@ -0,0 +1,1 @@
+Readme file for filtering 1.1.0
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/filtering/filtering_1.1.0.tar
Binary file test/tool_shed/test_data/filtering/filtering_1.1.0.tar has changed
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/filtering/filtering_2.2.0.tar
Binary file test/tool_shed/test_data/filtering/filtering_2.2.0.tar has changed
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/filtering/filtering_test_data.tar
Binary file test/tool_shed/test_data/filtering/filtering_test_data.tar has changed
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/filtering_1.1.0.tar
Binary file test/tool_shed/test_data/filtering_1.1.0.tar has changed
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/filtering_2.2.0.tar
Binary file test/tool_shed/test_data/filtering_2.2.0.tar has changed
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/filtering_test_data.tar
Binary file test/tool_shed/test_data/filtering_test_data.tar has changed
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/freebayes/invalid_deps/tool_dependencies.xml
--- a/test/tool_shed/test_data/freebayes/invalid_deps/tool_dependencies.xml
+++ /dev/null
@@ -1,46 +0,0 @@
-<?xml version="1.0"?>
-<tool_dependency>
- <package name="freebayes" version="0.9.5">
- <install version="1.0">
- <actions>
- <action type="shell_command">git clone --recursive git://github.com/ekg/freebayes.git</action>
- <action type="shell_command">git reset --hard 9696d0ce8a962f7bb61c4791be5ce44312b81cf8</action>
- <action type="shell_command">make</action>
- <action type="move_directory_files">
- <source_directory>bin</source_directory>
- <destination_directory>$INSTALL_DIR/bin</destination_directory>
- </action>
- <action type="set_environment">
- <environment_variable name="PATH" action="prepend_to">$INSTALL_DIR/bin</environment_variable>
- </action>
- </actions>
- </install>
- <readme>
-FreeBayes requires g++ and the standard C and C++ development libraries.
-Additionally, cmake is required for building the BamTools API.
- </readme>
- </package>
- <package name="samtools" version="0.2.15">
- <install version="1.0">
- <actions>
- <action type="download_by_url">http://sourceforge.net/projects/samtools/files/samtools/0.1.18/samtools-0.1…</action>
- <action type="shell_command">sed -i .bak -e 's/-lcurses/-lncurses/g' Makefile</action>
- <action type="shell_command">make</action>
- <action type="move_file">
- <source>samtools</source>
- <destination>$INSTALL_DIR/bin</destination>
- </action>
- <action type="move_file">
- <source>misc/maq2sam-long</source>
- <destination>$INSTALL_DIR/bin</destination>
- </action>
- <action type="set_environment">
- <environment_variable name="PATH" action="prepend_to">$INSTALL_DIR/bin</environment_variable>
- </action>
- </actions>
- </install>
- <readme>
-Compiling SAMtools requires the ncurses and zlib development libraries.
- </readme>
- </package>
-</tool_dependency>
diff -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 test/tool_shed/test_data/freebayes/invalid_tool_dependencies/tool_dependencies.xml
--- /dev/null
+++ b/test/tool_shed/test_data/freebayes/invalid_tool_dependencies/tool_dependencies.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0"?>
+<tool_dependency>
+ <package name="freebayes" version="0.9.5">
+ <install version="1.0">
+ <actions>
+ <action type="shell_command">git clone --recursive git://github.com/ekg/freebayes.git</action>
+ <action type="shell_command">git reset --hard 9696d0ce8a962f7bb61c4791be5ce44312b81cf8</action>
+ <action type="shell_command">make</action>
+ <action type="move_directory_files">
+ <source_directory>bin</source_directory>
+ <destination_directory>$INSTALL_DIR/bin</destination_directory>
+ </action>
+ <action type="set_environment">
+ <environment_variable name="PATH" action="prepend_to">$INSTALL_DIR/bin</environment_variable>
+ </action>
+ </actions>
+ </install>
+ <readme>
+FreeBayes requires g++ and the standard C and C++ development libraries.
+Additionally, cmake is required for building the BamTools API.
+ </readme>
+ </package>
+ <package name="samtools" version="0.2.15">
+ <install version="1.0">
+ <actions>
+ <action type="download_by_url">http://sourceforge.net/projects/samtools/files/samtools/0.1.18/samtools-0.1…</action>
+ <action type="shell_command">sed -i .bak -e 's/-lcurses/-lncurses/g' Makefile</action>
+ <action type="shell_command">make</action>
+ <action type="move_file">
+ <source>samtools</source>
+ <destination>$INSTALL_DIR/bin</destination>
+ </action>
+ <action type="move_file">
+ <source>misc/maq2sam-long</source>
+ <destination>$INSTALL_DIR/bin</destination>
+ </action>
+ <action type="set_environment">
+ <environment_variable name="PATH" action="prepend_to">$INSTALL_DIR/bin</environment_variable>
+ </action>
+ </actions>
+ </install>
+ <readme>
+Compiling SAMtools requires the ncurses and zlib development libraries.
+ </readme>
+ </package>
+</tool_dependency>
https://bitbucket.org/galaxy/galaxy-central/changeset/42a6e3f82c0d/
changeset: 42a6e3f82c0d
user: inithello
date: 2012-12-05 20:37:48
summary: Fix error in tool xml dynamic options parsing.
affected #: 1 file
diff -r 8ea1787b037bf957535d39ab1c834a241bb2a5e5 -r 42a6e3f82c0d2c5ec5bd4af1fca3bac125ffe9c9 lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -8,6 +8,7 @@
from galaxy.webapps.community.util.container_util import *
from galaxy.datatypes.checkers import *
from galaxy.model.orm import *
+from galaxy.tools.parameters import dynamic_options
from galaxy import eggs
import pkg_resources
@@ -249,7 +250,7 @@
if isinstance( input_param, parameters.basic.SelectToolParameter ) and input_param.is_dynamic:
# If the tool refers to .loc files or requires an entry in the tool_data_table_conf.xml, make sure all requirements exist.
options = input_param.dynamic_options or input_param.options
- if options:
+ if options and isinstance( options, dynamic_options.DynamicOptions ):
if options.tool_data_table or options.missing_tool_data_table_name:
# Make sure the repository contains a tool_data_table_conf.xml.sample file.
sample_tool_data_table_conf = get_config_from_disk( 'tool_data_table_conf.xml.sample', repo_dir )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Handle invalid repository dependency definitions.
by Bitbucket 05 Dec '12
by Bitbucket 05 Dec '12
05 Dec '12
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/changeset/1b6819e4598d/
changeset: 1b6819e4598d
user: greg
date: 2012-12-05 17:46:36
summary: Handle invalid repository dependency definitions.
affected #: 2 files
diff -r 1b8fd73e2a5464fd2caab261dbf10017f119185d -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -618,7 +618,7 @@
message = ''
if not displaying_invalid_tool:
if metadata_dict:
- message += "Metadata was defined for some items in revision '%s'. " % str( repository.tip( trans.app ) )
+ message += "Metadata may have been defined for some items in revision '%s'. " % str( repository.tip( trans.app ) )
message += "Correct the following problems if necessary and reset metadata.%s" % new_line
else:
message += "Metadata cannot be defined for revision '%s' so this revision cannot be automatically " % str( repository.tip( trans.app ) )
@@ -719,7 +719,9 @@
# See if we have a repository dependencies defined.
if name == 'repository_dependencies.xml':
path_to_repository_dependencies_config = os.path.join( root, name )
- metadata_dict = generate_repository_dependency_metadata( path_to_repository_dependencies_config, metadata_dict )
+ metadata_dict, error_message = generate_repository_dependency_metadata( app, path_to_repository_dependencies_config, metadata_dict )
+ if error_message:
+ invalid_file_tups.append( ( name, error_message ) )
# See if we have one or more READ_ME files.
elif name.lower() in readme_file_names:
relative_path_to_readme = get_relative_path_to_repository_file( root,
@@ -812,29 +814,71 @@
if requirements_dict:
tool_dependencies_dict[ dependency_key ] = requirements_dict
return tool_dependencies_dict
-def generate_repository_dependency_metadata( repository_dependencies_config, metadata_dict ):
+def generate_repository_dependency_metadata( app, repository_dependencies_config, metadata_dict ):
+ """Generate a repository dependencies dictionary based on valid information defined in the received repository_dependencies_config."""
repository_dependencies_tups = []
+ error_message = ''
+ config_file_name = strip_path( repository_dependencies_config )
try:
# Make sure we're looking at a valid repository_dependencies.xml file.
tree = util.parse_xml( repository_dependencies_config )
root = tree.getroot()
is_valid = root.tag == 'repositories'
except Exception, e:
- log.debug( "Error parsing %s, exception: %s" % ( repository_dependencies_config, str( e ) ) )
+ error_message = "Error parsing %s, exception: %s" % ( repository_dependencies_config, str( e ) )
+ log.debug( error_message )
is_valid = False
if is_valid:
+ sa_session = app.model.context.current
for repository_elem in root.findall( 'repository' ):
- repository_dependencies_tup = ( repository_elem.attrib[ 'toolshed' ],
- repository_elem.attrib[ 'name' ],
- repository_elem.attrib[ 'owner'],
- repository_elem.attrib[ 'changeset_revision' ] )
- if repository_dependencies_tup not in repository_dependencies_tups:
- repository_dependencies_tups.append( repository_dependencies_tup )
+ toolshed = repository_elem.attrib[ 'toolshed' ]
+ name = repository_elem.attrib[ 'name' ]
+ owner = repository_elem.attrib[ 'owner']
+ changeset_revision = repository_elem.attrib[ 'changeset_revision' ]
+ user = None
+ repository = None
+ # Repository dependencies are currentlhy supported only within a single tool shed.
+ if tool_shed_is_this_tool_shed( toolshed ):
+ try:
+ user = sa_session.query( app.model.User ) \
+ .filter( app.model.User.table.c.username == owner ) \
+ .one()
+ except Exception, e:
+ error_message = "Invalid owner %s defined for repository %s in config file %s. " % ( owner, name, config_file_name )
+ error_message += "Repository dependencies will be ignored."
+ log.debug( error_message )
+ return metadata_dict, error_message
+ if user:
+ try:
+ repository = sa_session.query( app.model.Repository ) \
+ .filter( and_( app.model.Repository.table.c.name == name,
+ app.model.Repository.table.c.user_id == user.id ) ) \
+ .first()
+ except:
+ error_message = "Invalid name %s or owner %s defined for repository in config file %s. " % ( name, owner, config_file_name )
+ error_message += "Repository dependencies will be ignored."
+ log.debug( error_message )
+ return metadata_dict, error_message
+ if repository:
+ repository_dependencies_tup = ( toolshed, name, owner, changeset_revision )
+ if repository_dependencies_tup not in repository_dependencies_tups:
+ repository_dependencies_tups.append( repository_dependencies_tup )
+ else:
+ error_message = "Invalid name %s or owner %s defined for repository in config file %s. " % ( name, owner, config_file_name )
+ error_message += "Repository dependencies will be ignored."
+ log.debug( error_message )
+ return metadata_dict, error_message
+ else:
+ # We have an invalid repository owner defined for an entry in repository_dependencies.xml.
+ config_file_name = strip_path( repository_dependencies_config )
+ error_message = "Invalid username %s defined for owner of repository %s in config file %s. Repository dependencies will be ignored." % ( owner, name, config_file_name )
+ log.debug( error_message )
+ return metadata_dict, error_message
if repository_dependencies_tups:
repository_dependencies_dict = dict( description=root.get( 'description' ),
repository_dependencies=repository_dependencies_tups )
metadata_dict[ 'repository_dependencies' ] = repository_dependencies_dict
- return metadata_dict
+ return metadata_dict, error_message
def generate_tool_dependency_metadata( app, repository, tool_dependencies_config, metadata_dict, original_repository_metadata=None ):
"""
If the combination of name, version and type of each element is defined in the <requirement> tag for at least one tool in the repository,
diff -r 1b8fd73e2a5464fd2caab261dbf10017f119185d -r 1b6819e4598ddcc685cd8ab69667e2d8d7d952f0 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
@@ -38,7 +38,7 @@
self.upload_file( repository,
'freebayes/freebayes.xml',
valid_tools_only=False,
- strings_displayed=[ 'Metadata was defined', 'This file requires an entry', 'tool_data_table_conf' ],
+ strings_displayed=[ 'Metadata may have been defined', 'This file requires an entry', 'tool_data_table_conf' ],
commit_message='Uploaded the tool xml.' )
self.display_manage_repository_page( repository, strings_displayed=[ 'Invalid tools' ], strings_not_displayed=[ 'Valid tools' ] )
tip = self.get_repository_tip( 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