galaxy-commits
Threads by month
- ----- 2026 -----
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 15302 discussions
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/ed0e437ce0d6/
Changeset: ed0e437ce0d6
User: dannon
Date: 2013-10-25 06:43:55
Summary: Missing tempfile import in dataproviders/external.
Affected #: 1 file
diff -r 5a259fa8aabb4d977c5ed091d1658b9674d0e67c -r ed0e437ce0d6663ce247161a32287e2de977d226 lib/galaxy/datatypes/dataproviders/external.py
--- a/lib/galaxy/datatypes/dataproviders/external.py
+++ b/lib/galaxy/datatypes/dataproviders/external.py
@@ -3,12 +3,12 @@
or not in a file.
"""
+import base
+import gzip
+import line
import subprocess
+import tempfile
import urllib, urllib2
-import gzip
-
-import base
-import line
_TODO = """
YAGNI: ftp, image, cryptos, sockets
https://bitbucket.org/galaxy/galaxy-central/commits/d57971b60b8d/
Changeset: d57971b60b8d
User: dannon
Date: 2013-10-25 06:57:53
Summary: Bugfix/cleanup in reports/workflows module -- was using workflow_id instead of stored_workflow_id
Affected #: 1 file
diff -r ed0e437ce0d6663ce247161a32287e2de977d226 -r d57971b60b8d907c33bf4dfc1bba2432baaf96e9 lib/galaxy/webapps/reports/controllers/workflows.py
--- a/lib/galaxy/webapps/reports/controllers/workflows.py
+++ b/lib/galaxy/webapps/reports/controllers/workflows.py
@@ -1,34 +1,40 @@
-import calendar, operator, os, socket
-from datetime import datetime, date, timedelta
-from time import mktime, strftime, localtime
+import calendar
+from datetime import date, timedelta
+from galaxy import eggs
+from galaxy import model, util
+from galaxy.model.orm import and_
from galaxy.web.base.controller import BaseUIController, web
-from galaxy import model, util
-from galaxy.web.framework.helpers import time_ago, iff, grids
-from galaxy.model.orm import and_, not_, or_
-import pkg_resources
-pkg_resources.require( "SQLAlchemy >= 0.4" )
+from galaxy.web.framework.helpers import grids
+eggs.require( "SQLAlchemy >= 0.4" )
import sqlalchemy as sa
+
import logging
log = logging.getLogger( __name__ )
+
class SpecifiedDateListGrid( grids.Grid ):
+
class WorkflowNameColumn( grids.TextColumn ):
def get_value( self, trans, grid, stored_workflow ):
return stored_workflow.name
+
class CreateTimeColumn( grids.DateTimeColumn ):
def get_value( self, trans, grid, stored_workflow ):
return stored_workflow.create_time
+
class UserColumn( grids.TextColumn ):
def get_value( self, trans, grid, stored_workflow ):
if stored_workflow.user:
return stored_workflow.user.email
return 'unknown'
+
class EmailColumn( grids.GridColumn ):
def filter( self, trans, user, query, column_filter ):
if column_filter == 'All':
return query
return query.filter( and_( model.StoredWorkflow.table.c.user_id == model.User.table.c.id,
model.User.table.c.email == column_filter ) )
+
class SpecifiedDateColumn( grids.GridColumn ):
def filter( self, trans, user, query, column_filter ):
if column_filter == 'All':
@@ -94,6 +100,7 @@
.join( model.User ) \
.enable_eagerloads( False )
+
class Workflows( BaseUIController ):
specified_date_list_grid = SpecifiedDateListGrid()
@@ -120,7 +127,7 @@
**kwd ) )
elif operation == "user_per_month":
stored_workflow_id = kwd.get( 'id', None )
- workflow = get_workflow( trans, workflow_id )
+ workflow = get_workflow( trans, stored_workflow_id )
if workflow.user:
kwd[ 'email' ] = workflow.user.email
else:
@@ -129,9 +136,9 @@
action='user_per_month',
**kwd ) )
return self.specified_date_list_grid( trans, **kwd )
+
@web.expose
def per_month_all( self, trans, **kwd ):
- params = util.Params( kwd )
message = ''
q = sa.select( ( sa.func.date_trunc( 'month', sa.func.date( model.StoredWorkflow.table.c.create_time ) ).label( 'date' ),sa.func.count( model.StoredWorkflow.table.c.id ).label( 'total_workflows' ) ),
from_obj = [ sa.outerjoin( model.StoredWorkflow.table, model.User.table ) ],
@@ -146,9 +153,9 @@
return trans.fill_template( '/webapps/reports/workflows_per_month_all.mako',
workflows=workflows,
message=message )
+
@web.expose
def per_user( self, trans, **kwd ):
- params = util.Params( kwd )
message = ''
workflows = []
q = sa.select( ( model.User.table.c.email.label( 'user_email' ),
@@ -160,6 +167,7 @@
workflows.append( ( row.user_email,
row.total_workflows ) )
return trans.fill_template( '/webapps/reports/workflows_per_user.mako', workflows=workflows, message=message )
+
@web.expose
def user_per_month( self, trans, **kwd ):
params = util.Params( kwd )
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
17 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/79fd1058b25d/
Changeset: 79fd1058b25d
User: dannon
Date: 2013-10-25 00:40:09
Summary: Clean up imports in util package base
Affected #: 1 file
diff -r 97cb7306dc345ce5e81861e421c5277701161802 -r 79fd1058b25dc43a5292843a01106e38dfd83994 lib/galaxy/util/__init__.py
--- a/lib/galaxy/util/__init__.py
+++ b/lib/galaxy/util/__init__.py
@@ -2,25 +2,30 @@
Utility functions used systemwide.
"""
-import logging, threading, random, string, re, binascii, pickle, time, datetime, math, re, os, sys, tempfile, stat, grp, smtplib, errno, shutil
+import binascii, errno, grp, logging, os, pickle, random, re, shutil, smtplib, stat, string, sys, tempfile, threading
from email.MIMEText import MIMEText
from os.path import relpath
from hashlib import md5
from galaxy import eggs
-import pkg_resources
-pkg_resources.require( 'docutils' )
+eggs.require( 'docutils' )
import docutils.core
import docutils.writers.html4css1
-pkg_resources.require( 'elementtree' )
+eggs.require( 'elementtree' )
from elementtree import ElementTree, ElementInclude
-pkg_resources.require( "wchartype" )
+eggs.require( "wchartype" )
import wchartype
+from inflection import Inflector, English
+inflector = Inflector(English)
+
+eggs.require( "simplejson" )
+import simplejson
+
log = logging.getLogger(__name__)
_lock = threading.RLock()
@@ -35,12 +40,6 @@
NULL_CHAR = '\000'
BINARY_CHARS = [ NULL_CHAR ]
-from inflection import Inflector, English
-inflector = Inflector(English)
-
-pkg_resources.require( "simplejson" )
-import simplejson
-
def is_multi_byte( chars ):
for char in chars:
try:
@@ -946,5 +945,5 @@
return os.path.abspath(galaxy_root_path)
if __name__ == '__main__':
- import doctest, sys
+ import doctest
doctest.testmod(sys.modules[__name__], verbose=False)
https://bitbucket.org/galaxy/galaxy-central/commits/a81f9cdc2035/
Changeset: a81f9cdc2035
User: dannon
Date: 2013-10-25 00:42:18
Summary: Correct errors in util's xml_to_dict
Affected #: 1 file
diff -r 79fd1058b25dc43a5292843a01106e38dfd83994 -r a81f9cdc2035e6c7ea2febeb0a1af7e10d2ef2a3 lib/galaxy/util/__init__.py
--- a/lib/galaxy/util/__init__.py
+++ b/lib/galaxy/util/__init__.py
@@ -176,9 +176,9 @@
sub_elem_dict[ key ].append( value )
for key, value in sub_elem_dict.iteritems():
if len( value ) == 1:
- rval[ elem.tag ][ k ] = value[0]
+ rval[ elem.tag ][ key ] = value[0]
else:
- rval[ elem.tag ][ k ] = value
+ rval[ elem.tag ][ key ] = value
if elem.attrib:
for key, value in elem.attrib.iteritems():
rval[ elem.tag ][ "@%s" % key ] = value
https://bitbucket.org/galaxy/galaxy-central/commits/8305d16cf154/
Changeset: 8305d16cf154
User: dannon
Date: 2013-10-25 00:43:05
Summary: Strip unused variables from util package
Affected #: 1 file
diff -r a81f9cdc2035e6c7ea2febeb0a1af7e10d2ef2a3 -r 8305d16cf1542166a8d1c2bd04abd8a0562ca438 lib/galaxy/util/__init__.py
--- a/lib/galaxy/util/__init__.py
+++ b/lib/galaxy/util/__init__.py
@@ -44,7 +44,7 @@
for char in chars:
try:
char = unicode( char )
- except UnicodeDecodeError, e:
+ except UnicodeDecodeError:
# Probably binary
return False
if wchartype.is_asian( char ) or \
@@ -736,7 +736,7 @@
name = names.next()
file = os.path.join(dir, prefix + name)
try:
- linked_path = os.link( src, file )
+ os.link( src, file )
return (os.path.abspath(file))
except OSError, e:
if e.errno == errno.EEXIST:
https://bitbucket.org/galaxy/galaxy-central/commits/02bbb394aa98/
Changeset: 02bbb394aa98
User: dannon
Date: 2013-10-25 00:59:49
Summary: Fix missing HTTPNotImplemented import in api/annotations; cleanup existing.
Affected #: 1 file
diff -r 8305d16cf1542166a8d1c2bd04abd8a0562ca438 -r 02bbb394aa9856c5a607a8e61e7dfea9a7241dfd lib/galaxy/webapps/galaxy/api/annotations.py
--- a/lib/galaxy/webapps/galaxy/api/annotations.py
+++ b/lib/galaxy/webapps/galaxy/api/annotations.py
@@ -1,21 +1,15 @@
"""
API operations on annotations.
"""
-import logging, os, string, shutil, urllib, re, socket
-from cgi import escape, FieldStorage
-from galaxy import util, datatypes, jobs, web, util
-from galaxy.web.base.controller import BaseAPIController, UsesHistoryMixin, UsesHistoryDatasetAssociationMixin, UsesStoredWorkflowMixin
+import logging
+from galaxy import web
from galaxy.model.item_attrs import UsesAnnotations
from galaxy.util.sanitize_html import sanitize_html
-import galaxy.datatypes
-from galaxy.util.bunch import Bunch
-
-import pkg_resources
-pkg_resources.require( "Routes" )
-import routes
+from galaxy.web.base.controller import BaseAPIController, HTTPNotImplemented, UsesHistoryDatasetAssociationMixin, UsesHistoryMixin, UsesStoredWorkflowMixin
log = logging.getLogger( __name__ )
+
class BaseAnnotationsController( BaseAPIController, UsesAnnotations, UsesHistoryMixin, UsesHistoryDatasetAssociationMixin, UsesStoredWorkflowMixin ):
@web.expose_api
@@ -25,7 +19,6 @@
if item is not None:
return self.get_item_annotation_str( trans.sa_session, trans.get_user(), item )
-
@web.expose_api
def create( self, trans, payload, **kwd ):
if "text" not in payload:
@@ -53,23 +46,29 @@
def undelete( self, trans, **kwd ):
raise HTTPNotImplemented()
+
class HistoryAnnotationsController(BaseAnnotationsController):
controller_name = "history_annotations"
tagged_item_id = "history_id"
+
def _get_item_from_id(self, trans, idstr):
hist = self.get_history( trans, idstr )
return hist
+
class HistoryContentAnnotationsController(BaseAnnotationsController):
controller_name = "history_content_annotations"
tagged_item_id = "history_content_id"
+
def _get_item_from_id(self, trans, idstr):
hda = self.get_dataset(trans, idstr)
return hda
+
class WorkflowAnnotationsController(BaseAnnotationsController):
controller_name = "workflow_annotations"
tagged_item_id = "workflow_id"
+
def _get_item_from_id(self, trans, idstr):
hda = self.get_stored_workflow(trans, idstr)
return hda
https://bitbucket.org/galaxy/galaxy-central/commits/a19245efea88/
Changeset: a19245efea88
User: dannon
Date: 2013-10-25 01:08:04
Summary: Fix broken string_as_bool in history_contents API
Affected #: 1 file
diff -r 02bbb394aa9856c5a607a8e61e7dfea9a7241dfd -r a19245efea8847b994e90602c33813554a50ce03 lib/galaxy/webapps/galaxy/api/history_contents.py
--- a/lib/galaxy/webapps/galaxy/api/history_contents.py
+++ b/lib/galaxy/webapps/galaxy/api/history_contents.py
@@ -2,15 +2,12 @@
API operations on the contents of a history.
"""
-from galaxy import web, util
-from galaxy import exceptions
-from galaxy.web.base.controller import BaseAPIController, url_for
-from galaxy.web.base.controller import UsesHistoryDatasetAssociationMixin, UsesHistoryMixin
-from galaxy.web.base.controller import UsesLibraryMixin, UsesLibraryMixinItems
-from galaxy.datatypes import sniff
+import logging
+from galaxy import exceptions, util, web
+from galaxy.web.base.controller import (BaseAPIController, url_for,
+ UsesHistoryDatasetAssociationMixin, UsesHistoryMixin, UsesLibraryMixin,
+ UsesLibraryMixinItems)
-import os
-import logging
log = logging.getLogger( __name__ )
class HistoryContentsController( BaseAPIController, UsesHistoryDatasetAssociationMixin, UsesHistoryMixin,
@@ -354,7 +351,7 @@
# a request body is optional here
purge = False
if kwd.get( 'payload', None ):
- purge = string_as_bool( kwd['payload'].get( 'purge', False ) )
+ purge = util.string_as_bool( kwd['payload'].get( 'purge', False ) )
rval = { 'id' : id }
try:
@@ -389,7 +386,7 @@
log.exception( 'HDA API, delete: uncaught HTTPInternalServerError: %s, %s\n%s',
id, str( kwd ), str( http_server_err ) )
raise
- except exceptions.httpexceptions.HTTPException, http_exc:
+ except exceptions.httpexceptions.HTTPException:
raise
except Exception, exc:
log.exception( 'HDA API, delete: uncaught exception: %s, %s\n%s',
https://bitbucket.org/galaxy/galaxy-central/commits/28119d3941aa/
Changeset: 28119d3941aa
User: dannon
Date: 2013-10-25 01:10:39
Summary: Use standard spacing in history contents API, strip whitespace.
Affected #: 1 file
diff -r a19245efea8847b994e90602c33813554a50ce03 -r 28119d3941aae98156cdb4e07243ce7e3c4848a3 lib/galaxy/webapps/galaxy/api/history_contents.py
--- a/lib/galaxy/webapps/galaxy/api/history_contents.py
+++ b/lib/galaxy/webapps/galaxy/api/history_contents.py
@@ -10,8 +10,10 @@
log = logging.getLogger( __name__ )
+
class HistoryContentsController( BaseAPIController, UsesHistoryDatasetAssociationMixin, UsesHistoryMixin,
UsesLibraryMixin, UsesLibraryMixinItems ):
+
@web.expose_api_anonymous
def index( self, trans, history_id, ids=None, **kwd ):
"""
@@ -44,11 +46,9 @@
and ( history_id == trans.security.encode_id( trans.history.id ) ) ):
#TODO:?? is secure?
history = trans.history
-
# otherwise, check permissions for the history first
else:
history = self.get_history( trans, history_id, check_ownership=True, check_accessible=True )
-
# if ids, return _FULL_ data (as show) for each id passed
if ids:
ids = ids.split( ',' )
@@ -57,7 +57,6 @@
if encoded_hda_id in ids:
#TODO: share code with show
rval.append( self._detailed_hda_dict( trans, hda ) )
-
# if no ids passed, return a _SUMMARY_ of _all_ datasets in the history
else:
details = kwd.get( 'details', None ) or []
@@ -71,13 +70,11 @@
rval.append( self._detailed_hda_dict( trans, hda ) )
else:
rval.append( self._summary_hda_dict( trans, history_id, hda ) )
-
except Exception, e:
# for errors that are not specific to one hda (history lookup or summary list)
rval = "Error in history API at listing contents: " + str( e )
log.error( rval + ": %s, %s" % ( type( e ), str( e ) ), exc_info=True )
trans.response.status = 500
-
return rval
#TODO: move to model or Mixin
@@ -114,7 +111,6 @@
hda_dict[ 'display_types' ] = self.get_old_display_applications( trans, hda )
hda_dict[ 'display_apps' ] = self.get_display_apps( trans, hda )
return hda_dict
-
except Exception, exc:
# catch error here - returning a briefer hda_dict with an error attribute
log.exception( "Error in history API at listing contents with history %s, hda %s: (%s) %s",
@@ -149,24 +145,20 @@
#TODO: dataset/hda by id (from history) OR check_ownership for anon user
hda = self.get_history_dataset_association( trans, history, id,
check_ownership=False, check_accessible=True )
-
else:
#TODO: do we really need the history?
history = self.get_history( trans, history_id,
check_ownership=True, check_accessible=True, deleted=False )
hda = self.get_history_dataset_association( trans, history, id,
check_ownership=True, check_accessible=True )
-
hda_dict = self.get_hda_dict( trans, hda )
hda_dict[ 'display_types' ] = self.get_old_display_applications( trans, hda )
hda_dict[ 'display_apps' ] = self.get_display_apps( trans, hda )
-
except Exception, e:
msg = "Error in history API at listing dataset: %s" % ( str(e) )
log.error( msg, exc_info=True )
trans.response.status = 500
return msg
-
return hda_dict
@web.expose_api
@@ -183,28 +175,25 @@
copy from library:
'source' = 'library'
'content' = [the encoded id from the library dataset]
-
+
copy from HDA:
'source' = 'hda'
'content' = [the encoded id from the HDA]
..note:
Currently, a user can only copy an HDA from a history that the user owns.
-
+
:rtype: dict
:returns: dictionary containing detailed information for the new HDA
"""
-
#TODO: copy existing, accessible hda - dataset controller, copy_datasets
#TODO: convert existing, accessible hda - model.DatasetInstance(or hda.datatype).get_converter_types
-
# check parameters
source = payload.get('source', None)
content = payload.get('content', None)
if source not in ['library', 'hda'] or content is None:
trans.response.status = 400
return "Please define the source ('library' or 'hda') and the content."
-
# retrieve history
try:
history = self.get_history( trans, history_id, check_ownership=True, check_accessible=False )
@@ -212,10 +201,8 @@
# no way to tell if it failed bc of perms or other (all MessageExceptions)
trans.response.status = 500
return str( e )
-
# copy from library dataset
if source == 'library':
-
# get library data set
try:
ld = self.get_library_dataset( trans, content, check_ownership=False, check_accessible=False )
@@ -226,17 +213,14 @@
return str( e )
except Exception, e:
return str( e )
-
# insert into history
hda = ld.library_dataset_dataset_association.to_history_dataset_association( history, add_to_history=True )
trans.sa_session.flush()
return hda.to_dict()
-
elif source == 'hda':
try:
#NOTE: user currently only capable of copying one of their own datasets
hda = self.get_dataset( trans, content )
-
except ( exceptions.httpexceptions.HTTPRequestRangeNotSatisfiable,
exceptions.httpexceptions.HTTPBadRequest ), id_exc:
# wot...
@@ -250,12 +234,10 @@
trans.response.status = 500
log.exception( "history: %s, source: %s, content: %s", history_id, source, content )
return str( exc )
-
data_copy=hda.copy( copy_children=True )
result=history.add_dataset( data_copy )
trans.sa_session.flush()
return result.to_dict()
-
else:
# other options
trans.response.status = 501
@@ -291,27 +273,22 @@
if history_id != trans.security.encode_id( trans.history.id ):
trans.response.status = 401
return { 'error': 'Anonymous users cannot edit histories other than their current history' }
-
anon_allowed_payload = {}
if 'deleted' in payload:
anon_allowed_payload[ 'deleted' ] = payload[ 'deleted' ]
if 'visible' in payload:
anon_allowed_payload[ 'visible' ] = payload[ 'visible' ]
-
payload = self._validate_and_parse_update_payload( anon_allowed_payload )
hda = self.get_dataset( trans, id, check_ownership=False, check_accessible=False, check_state=True )
if hda.history != trans.history:
trans.response.status = 401
return { 'error': 'Anonymous users cannot edit datasets outside their current history' }
-
else:
payload = self._validate_and_parse_update_payload( payload )
hda = self.get_dataset( trans, id, check_ownership=True, check_accessible=True, check_state=True )
-
# get_dataset can return a string during an error
if hda and isinstance( hda, trans.model.HistoryDatasetAssociation ):
changed = self.set_hda_from_dict( trans, hda, payload )
-
except Exception, exception:
log.error( 'Update of history (%s), HDA (%s) failed: %s',
history_id, id, str( exception ), exc_info=True )
@@ -323,7 +300,6 @@
else:
trans.response.status = 500
return { 'error': str( exception ) }
-
return changed
@web.expose_api
@@ -352,22 +328,18 @@
purge = False
if kwd.get( 'payload', None ):
purge = util.string_as_bool( kwd['payload'].get( 'purge', False ) )
-
rval = { 'id' : id }
try:
hda = self.get_dataset( trans, id,
check_ownership=True, check_accessible=True, check_state=True )
hda.deleted = True
-
if purge:
if not trans.app.config.allow_user_dataset_purge:
raise exceptions.httpexceptions.HTTPForbidden(
detail='This instance does not allow user dataset purging' )
-
hda.purged = True
trans.sa_session.add( hda )
trans.sa_session.flush()
-
if hda.dataset.user_can_purge:
try:
hda.dataset.full_delete()
@@ -376,12 +348,9 @@
pass
# flush now to preserve deleted state in case of later interruption
trans.sa_session.flush()
-
rval[ 'purged' ] = True
-
trans.sa_session.flush()
rval[ 'deleted' ] = True
-
except exceptions.httpexceptions.HTTPInternalServerError, http_server_err:
log.exception( 'HDA API, delete: uncaught HTTPInternalServerError: %s, %s\n%s',
id, str( kwd ), str( http_server_err ) )
@@ -393,7 +362,6 @@
id, str( kwd ), str( exc ) )
trans.response.status = 500
rval.update({ 'error': str( exc ) })
-
return rval
def _validate_and_parse_update_payload( self, payload ):
@@ -416,7 +384,6 @@
'metadata_dbkey', 'metadata_column_names', 'metadata_column_types', 'metadata_columns',
'metadata_comment_lines', 'metadata_data_lines'
)
-
validated_payload = {}
for key, val in payload.items():
# TODO: lots of boilerplate here, but overhead on abstraction is equally onerous
https://bitbucket.org/galaxy/galaxy-central/commits/9fcd7759a210/
Changeset: 9fcd7759a210
User: dannon
Date: 2013-10-25 01:11:56
Summary: Irods objectstore: fix invalid rcCollCreate
Affected #: 1 file
diff -r 28119d3941aae98156cdb4e07243ce7e3c4848a3 -r 9fcd7759a210684ad2762340da7dbeab753c24c0 lib/galaxy/objectstore/rods.py
--- a/lib/galaxy/objectstore/rods.py
+++ b/lib/galaxy/objectstore/rods.py
@@ -6,16 +6,14 @@
import os
import time
-import errno
import logging
-#import traceback
from posixpath import join as path_join
from posixpath import basename as path_basename
from posixpath import dirname as path_dirname
from galaxy.objectstore import DiskObjectStore, ObjectStore, local_extra_dirs
-from galaxy.exceptions import ObjectNotFound, ObjectInvalid
+from galaxy.exceptions import ObjectNotFound
import galaxy.eggs
galaxy.eggs.require( 'PyRods' )
@@ -121,7 +119,7 @@
log.debug( 'Creating collection %s' % collname )
ci = irods.collInp_t()
ci.collName = collname
- status = rcCollCreate( self.rods_conn, ci )
+ status = irods.rcCollCreate( self.rods_conn, ci )
assert status == 0, '__mkcolls(): Failed to create collection: %s' % collname
@local_extra_dirs
https://bitbucket.org/galaxy/galaxy-central/commits/b9e78741f439/
Changeset: b9e78741f439
User: dannon
Date: 2013-10-25 01:25:28
Summary: Import cleanup in toolshed repositories API
Affected #: 1 file
diff -r 9fcd7759a210684ad2762340da7dbeab753c24c0 -r b9e78741f439f06c30b07d7d591c7c83183be6a6 lib/galaxy/webapps/tool_shed/api/repositories.py
--- a/lib/galaxy/webapps/tool_shed/api/repositories.py
+++ b/lib/galaxy/webapps/tool_shed/api/repositories.py
@@ -1,11 +1,12 @@
-import logging
+import logging, os
from time import strftime
-from galaxy.web.framework.helpers import time_ago
+
from galaxy import eggs
+from galaxy import util
from galaxy import web
-from galaxy import util
from galaxy.util import json
from galaxy.web.base.controller import BaseAPIController
+from galaxy.web.framework.helpers import time_ago
import tool_shed.repository_types.util as rt_util
import tool_shed.util.shed_util_common as suc
from tool_shed.galaxy_install import repository_util
@@ -14,9 +15,7 @@
eggs.require( 'mercurial' )
-from mercurial import commands
from mercurial import hg
-from mercurial import ui
log = logging.getLogger( __name__ )
https://bitbucket.org/galaxy/galaxy-central/commits/b154d93fb369/
Changeset: b154d93fb369
User: dannon
Date: 2013-10-25 01:26:06
Summary: Fix broken debug statements in toolshed repositories API -- would have caused Exception in reset_metadata
Affected #: 1 file
diff -r b9e78741f439f06c30b07d7d591c7c83183be6a6 -r b154d93fb369443a5979aa49e59c42fe27e7df53 lib/galaxy/webapps/tool_shed/api/repositories.py
--- a/lib/galaxy/webapps/tool_shed/api/repositories.py
+++ b/lib/galaxy/webapps/tool_shed/api/repositories.py
@@ -278,7 +278,7 @@
encoded_id = trans.security.encode_id( repository.id )
if encoded_id in encoded_ids_to_skip:
log.debug( "Skipping repository with id %s because it is in encoded_ids_to_skip %s" % \
- ( str( repository_id ), str( encoded_ids_to_skip ) ) )
+ ( str( repository.id ), str( encoded_ids_to_skip ) ) )
elif repository.type == rt_util.TOOL_DEPENDENCY_DEFINITION and repository.id not in handled_repository_ids:
results = handle_repository( trans, repository, results )
# Now reset metadata on all remaining repositories.
@@ -286,7 +286,7 @@
encoded_id = trans.security.encode_id( repository.id )
if encoded_id in encoded_ids_to_skip:
log.debug( "Skipping repository with id %s because it is in encoded_ids_to_skip %s" % \
- ( str( repository_id ), str( encoded_ids_to_skip ) ) )
+ ( str( repository.id ), str( encoded_ids_to_skip ) ) )
elif repository.type != rt_util.TOOL_DEPENDENCY_DEFINITION and repository.id not in handled_repository_ids:
results = handle_repository( trans, repository, results )
stop_time = strftime( "%Y-%m-%d %H:%M:%S" )
https://bitbucket.org/galaxy/galaxy-central/commits/9de91cccfcf0/
Changeset: 9de91cccfcf0
User: dannon
Date: 2013-10-25 01:27:15
Summary: Remove unused encoded_repository_id from get_ordered_installable_revisions in toolshed repository API
Affected #: 1 file
diff -r b154d93fb369443a5979aa49e59c42fe27e7df53 -r 9de91cccfcf0b7fc5f1beac6209e0111fd5c4af2 lib/galaxy/webapps/tool_shed/api/repositories.py
--- a/lib/galaxy/webapps/tool_shed/api/repositories.py
+++ b/lib/galaxy/webapps/tool_shed/api/repositories.py
@@ -38,7 +38,6 @@
try:
# Get the repository information.
repository = suc.get_repository_by_name_and_owner( trans.app, name, owner )
- encoded_repository_id = trans.security.encode_id( repository.id )
repo_dir = repository.repo_path( trans.app )
repo = hg.repository( suc.get_configured_ui(), repo_dir )
ordered_installable_revisions = suc.get_ordered_metadata_changeset_revisions( repository, repo, downloadable=True )
https://bitbucket.org/galaxy/galaxy-central/commits/d0a805216378/
Changeset: d0a805216378
User: dannon
Date: 2013-10-25 01:28:02
Summary: Add missing import HTTPBadRequest to toolshed repository revisions API
Affected #: 1 file
diff -r 9de91cccfcf0b7fc5f1beac6209e0111fd5c4af2 -r d0a80521637842c250665010848e7eb749946cce lib/galaxy/webapps/tool_shed/api/repository_revisions.py
--- a/lib/galaxy/webapps/tool_shed/api/repository_revisions.py
+++ b/lib/galaxy/webapps/tool_shed/api/repository_revisions.py
@@ -5,7 +5,7 @@
from galaxy import web
from galaxy import util
from galaxy.model.orm import and_, not_, select
-from galaxy.web.base.controller import BaseAPIController
+from galaxy.web.base.controller import BaseAPIController, HTTPBadRequest
from tool_shed.util import export_util
import tool_shed.util.shed_util_common as suc
https://bitbucket.org/galaxy/galaxy-central/commits/880f16259947/
Changeset: 880f16259947
User: dannon
Date: 2013-10-25 01:29:09
Summary: Remove unused code in toolshed repository revisions API; strip whitespace.
Affected #: 1 file
diff -r d0a80521637842c250665010848e7eb749946cce -r 880f162599472ce9316ccef0e0c56b4d16c11424 lib/galaxy/webapps/tool_shed/api/repository_revisions.py
--- a/lib/galaxy/webapps/tool_shed/api/repository_revisions.py
+++ b/lib/galaxy/webapps/tool_shed/api/repository_revisions.py
@@ -43,7 +43,6 @@
if not changeset_revision:
raise HTTPBadRequest( detail="Missing required parameter 'changeset_revision'." )
export_repository_dependencies = payload.get( 'export_repository_dependencies', False )
- download_dir = payload.get( 'download_dir', '/tmp' )
try:
# We'll currently support only gzip-compressed tar archives.
file_type = 'gz'
@@ -167,7 +166,6 @@
flush_needed = False
for key, new_value in payload.items():
if hasattr( repository_metadata, key ):
- old_value = getattr( repository_metadata, key )
setattr( repository_metadata, key, new_value )
if key in [ 'tools_functionally_correct', 'time_last_tested' ]:
# Automatically update repository_metadata.time_last_tested.
@@ -186,10 +184,10 @@
action='show',
id=trans.security.encode_id( repository_metadata.id ) )
return repository_metadata_dict
-
+
def __get_value_mapper( self, trans, repository_metadata ):
value_mapper = { 'id' : trans.security.encode_id,
'repository_id' : trans.security.encode_id }
if repository_metadata.time_last_tested is not None:
- value_mapper[ 'time_last_tested' ] = time_ago
+ value_mapper[ 'time_last_tested' ] = time_ago
return value_mapper
https://bitbucket.org/galaxy/galaxy-central/commits/3e5cbc50db38/
Changeset: 3e5cbc50db38
User: dannon
Date: 2013-10-25 01:31:10
Summary: Fix bug in galaxy's tool_shed_repositories API -- would cause exception if there was ever a shed_tool_conf.
Affected #: 1 file
diff -r 880f162599472ce9316ccef0e0c56b4d16c11424 -r 3e5cbc50db38f44d54ee0682d4320658ba6d4763 lib/galaxy/webapps/galaxy/api/tool_shed_repositories.py
--- a/lib/galaxy/webapps/galaxy/api/tool_shed_repositories.py
+++ b/lib/galaxy/webapps/galaxy/api/tool_shed_repositories.py
@@ -267,8 +267,7 @@
if shed_tool_conf:
# Get the tool_path setting.
index, shed_conf_dict = suc.get_shed_tool_conf_dict( trans.app, shed_tool_conf )
- # BUG, FIXME: Shed config dict does not exist in this context
- tool_path = shed_config_dict[ 'tool_path' ]
+ tool_path = shed_conf_dict[ 'tool_path' ]
else:
# Pick a semi-random shed-related tool panel configuration file and get the tool_path setting.
for shed_config_dict in trans.app.toolbox.shed_tool_confs:
https://bitbucket.org/galaxy/galaxy-central/commits/31d16cab8447/
Changeset: 31d16cab8447
User: dannon
Date: 2013-10-25 01:32:30
Summary: Fix yet another missing import in tool_shed_repositories API
Affected #: 1 file
diff -r 3e5cbc50db38f44d54ee0682d4320658ba6d4763 -r 31d16cab8447c111e1de64575208db8d16063e17 lib/galaxy/webapps/galaxy/api/tool_shed_repositories.py
--- a/lib/galaxy/webapps/galaxy/api/tool_shed_repositories.py
+++ b/lib/galaxy/webapps/galaxy/api/tool_shed_repositories.py
@@ -13,6 +13,8 @@
from tool_shed.util import encoding_util
from tool_shed.util import metadata_util
from tool_shed.util import workflow_util
+from tool_shed.util import tool_util
+
import tool_shed.util.shed_util_common as suc
log = logging.getLogger( __name__ )
https://bitbucket.org/galaxy/galaxy-central/commits/404f0c60e9bd/
Changeset: 404f0c60e9bd
User: dannon
Date: 2013-10-25 01:34:38
Summary: Complete cleanup of tool_shed_repositories API -- remove unused code and strip whitespace
Affected #: 1 file
diff -r 31d16cab8447c111e1de64575208db8d16063e17 -r 404f0c60e9bd45654bef1ea68bc64a26c0811bca lib/galaxy/webapps/galaxy/api/tool_shed_repositories.py
--- a/lib/galaxy/webapps/galaxy/api/tool_shed_repositories.py
+++ b/lib/galaxy/webapps/galaxy/api/tool_shed_repositories.py
@@ -34,6 +34,7 @@
message += 'Installing_Galaxy_tool_shed_repository_tools_into_a_local_Galaxy_instance.'
return message
+
class ToolShedRepositoriesController( BaseAPIController ):
"""RESTful controller for interactions with tool shed repositories."""
@@ -43,7 +44,7 @@
GET /api/tool_shed_repositories/{encoded_tool_shed_repository_id}/exported_workflows
Display a list of dictionaries containing information about this tool shed repository's exported workflows.
-
+
:param id: the encoded id of the ToolShedRepository object
"""
# Example URL: http://localhost:8763/api/tool_shed_repositories/f2db41e1fa331b3e/exported_…
@@ -74,10 +75,10 @@
POST /api/tool_shed_repositories/import_workflow
Import the specified exported workflow contained in the specified installed tool shed repository into Galaxy.
-
+
:param key: the API key of the Galaxy user with which the imported workflow will be associated.
:param id: the encoded id of the ToolShedRepository object
-
+
The following parameters are included in the payload.
:param index: the index location of the workflow tuple in the list of exported workflows stored in the metadata for the specified repository
"""
@@ -109,7 +110,7 @@
POST /api/tool_shed_repositories/import_workflow
Import all of the exported workflows contained in the specified installed tool shed repository into Galaxy.
-
+
:param key: the API key of the Galaxy user with which the imported workflows will be associated.
:param id: the encoded id of the ToolShedRepository object
"""
@@ -229,7 +230,6 @@
return dict( status='error', error=message )
if raw_text:
items = json.from_json_string( raw_text )
- repository_dict = items[ 0 ]
repository_revision_dict = items[ 1 ]
repo_info_dict = items[ 2 ]
else:
@@ -415,7 +415,6 @@
install_tool_dependencies = payload.get( 'install_tool_dependencies', False )
new_tool_panel_section_label = payload.get( 'new_tool_panel_section_label', '' )
shed_tool_conf = payload.get( 'shed_tool_conf', None )
- tool_path = payload.get( 'tool_path', None )
tool_panel_section_id = payload.get( 'tool_panel_section_id', '' )
all_installed_tool_shed_repositories = []
for index, tool_shed_url in enumerate( tool_shed_urls ):
@@ -451,7 +450,6 @@
:param owner (required): the owner of the Repository
:param changset_revision (required): the changset_revision of the RepositoryMetadata object associated with the Repository
"""
- api_key = kwd.get( 'key', None )
# Get the information about the repository to be installed from the payload.
tool_shed_url = payload.get( 'tool_shed_url', '' )
if not tool_shed_url:
@@ -471,7 +469,6 @@
ordered_tsr_ids = repair_dict.get( 'ordered_tsr_ids', [] )
ordered_repo_info_dicts = repair_dict.get( 'ordered_repo_info_dicts', [] )
if ordered_tsr_ids and ordered_repo_info_dicts:
- repositories_for_repair = []
for index, tsr_id in enumerate( ordered_tsr_ids ):
repository = trans.sa_session.query( trans.model.ToolShedRepository ).get( trans.security.decode_id( tsr_id ) )
repo_info_dict = ordered_repo_info_dicts[ index ]
@@ -496,7 +493,7 @@
PUT /api/tool_shed_repositories/reset_metadata_on_installed_repositories
Resets all metadata on all repositories installed into Galaxy in an "orderly fashion".
-
+
:param key: the API key of the Galaxy admin user.
"""
try:
https://bitbucket.org/galaxy/galaxy-central/commits/23c9b4736570/
Changeset: 23c9b4736570
User: dannon
Date: 2013-10-25 06:39:47
Summary: Simplify undelete_quota, there are no params.
Affected #: 2 files
diff -r 404f0c60e9bd45654bef1ea68bc64a26c0811bca -r 23c9b4736570957fd2d54bde163d99943efb2e1c lib/galaxy/actions/admin.py
--- a/lib/galaxy/actions/admin.py
+++ b/lib/galaxy/actions/admin.py
@@ -150,7 +150,7 @@
message += ', '.join( names )
return message
- def _undelete_quota( self, quota, params ):
+ def _undelete_quota( self, quota ):
quotas = util.listify( quota )
names = []
for q in quotas:
diff -r 404f0c60e9bd45654bef1ea68bc64a26c0811bca -r 23c9b4736570957fd2d54bde163d99943efb2e1c lib/galaxy/webapps/galaxy/api/quotas.py
--- a/lib/galaxy/webapps/galaxy/api/quotas.py
+++ b/lib/galaxy/webapps/galaxy/api/quotas.py
@@ -5,7 +5,6 @@
from galaxy.web.base.controller import BaseAPIController, UsesQuotaMixin, url_for
from galaxy.web.base.controllers.admin import Admin
from galaxy import web, util
-from elementtree.ElementTree import XML
from galaxy.web.params import QuotaParamParser
from galaxy.actions.admin import AdminActions
@@ -140,8 +139,7 @@
Undeletes a quota
"""
quota = self.get_quota( trans, id, deleted=True )
- params = self.get_quota_params( payload )
try:
- return self._undelete_quota( quota, params )
+ return self._undelete_quota( quota )
except ActionInputError, e:
raise HTTPBadRequest( detail=str( e ) )
https://bitbucket.org/galaxy/galaxy-central/commits/5a259fa8aabb/
Changeset: 5a259fa8aabb
User: dannon
Date: 2013-10-25 06:40:01
Summary: Merge with central
Affected #: 6 files
diff -r 23c9b4736570957fd2d54bde163d99943efb2e1c -r 5a259fa8aabb4d977c5ed091d1658b9674d0e67c lib/galaxy/webapps/galaxy/api/tools.py
--- a/lib/galaxy/webapps/galaxy/api/tools.py
+++ b/lib/galaxy/webapps/galaxy/api/tools.py
@@ -119,14 +119,18 @@
return { "message": { "type": "error", "data" : vars[ 'errors' ] } }
# TODO: check for errors and ensure that output dataset(s) are available.
- output_datasets = vars.get( 'out_data', {} ).values()
+ output_datasets = vars.get( 'out_data', {} ).iteritems()
rval = {
"outputs": []
}
outputs = rval[ "outputs" ]
#TODO:?? poss. only return ids?
- for output in output_datasets:
+ for output_name, output in output_datasets:
output_dict = output.to_dict()
+ #add the output name back into the output data structure
+ #so it's possible to figure out which newly created elements
+ #correspond with which tool file outputs
+ output_dict['output_name'] = output_name
outputs.append( trans.security.encode_dict_ids( output_dict ) )
return rval
diff -r 23c9b4736570957fd2d54bde163d99943efb2e1c -r 5a259fa8aabb4d977c5ed091d1658b9674d0e67c lib/tool_shed/galaxy_install/tool_dependencies/fabric_util.py
--- a/lib/tool_shed/galaxy_install/tool_dependencies/fabric_util.py
+++ b/lib/tool_shed/galaxy_install/tool_dependencies/fabric_util.py
@@ -341,10 +341,13 @@
elif action_type == 'setup_r_environment':
# setup an R environment
# <action type="setup_r_environment">
- # <r_base name="package_r_3_0_1" owner="bgruening" />
+ # <repository name="package_r_3_0_1" owner="bgruening">
+ # <package name="R" version="3.0.1" />
+ # </repository>
+ # <!-- allow installing an R packages -->
+ # <package>https://github.com/bgruening/download_store/raw/master/DESeq2-1_0_18/BiocGe…</package>
# </action>
- # allow downloading and installing an R package
- # <package>https://github.com/bgruening/download_store/raw/master/DESeq2-1_0_18/BiocGe…</package>
+
if action_dict.get( 'env_shell_file_paths', False ):
install_environment.add_env_shell_file_paths( action_dict[ 'env_shell_file_paths' ] )
else:
@@ -371,10 +374,73 @@
# R libraries are installed to $INSTALL_DIR (install_dir), we now set the R_LIBS path to that directory
# TODO: That code is used a lot for the different environments and should be refactored, once the environments are integrated
modify_env_command_dict = dict( name="R_LIBS", action="prepend_to", value=install_dir )
- modify_env_command = td_common_util.create_or_update_env_shell_file( install_dir, modify_env_command_dict )
- return_code = handle_command( app, tool_dependency, install_dir, modify_env_command )
+ env_entry, env_file = td_common_util.create_or_update_env_shell_file( install_dir, modify_env_command_dict )
+ return_code = file_append( env_entry, env_file, skip_if_contained=True, make_executable=True )
+
if return_code:
return
+ elif action_type == 'setup_ruby_environment':
+ # setup an Ruby environment
+ # <action type="setup_ruby_environment">
+ # <repository name="package_ruby_2_0" owner="bgruening">
+ # <package name="ruby" version="2.0" />
+ # </repository>
+ # <!-- allow downloading and installing an Ruby package from http://rubygems.org/ -->
+ # <package>protk</package>
+ # <package>protk=1.2.4</package>
+ # <package>http://url-to-some-gem-file.de/protk.gem</package>
+ # </action>
+ if action_dict.get( 'env_shell_file_paths', False ):
+ install_environment.add_env_shell_file_paths( action_dict[ 'env_shell_file_paths' ] )
+ else:
+ log.warning( 'Missing Ruby environment. Please check if your specified Ruby installation exists.' )
+ return
+
+ dir = os.path.curdir
+ current_dir = os.path.abspath( os.path.join( work_dir, dir ) )
+ with lcd( current_dir ):
+ with settings( warn_only=True ):
+ for (gem, gem_version) in action_dict[ 'ruby_packages' ]:
+ if os.path.isfile( gem ):
+ # we assume a local shipped gem file
+ cmd = '''export PATH=$PATH:$RUBY_HOME/bin && export GEM_HOME=$INSTALL_DIR &&
+ gem install --local %s''' % ( gem )
+ elif gem.find('://') != -1:
+ # we assume a URL to a gem file
+ url = gem
+ gem_name = url.split( '/' )[ -1 ]
+ td_common_util.url_download( work_dir, gem_name, url, extract=False )
+ cmd = '''export PATH=$PATH:$RUBY_HOME/bin && export GEM_HOME=$INSTALL_DIR &&
+ gem install --local %s ''' % ( gem_name )
+ else:
+ # gem file from rubygems.org with or without version number
+ if gem_version:
+ # version number was specified
+ cmd = '''export PATH=$PATH:$RUBY_HOME/bin && export GEM_HOME=$INSTALL_DIR &&
+ gem install %s --version "=%s"''' % ( gem, gem_version)
+ else:
+ # no version number given
+ cmd = '''export PATH=$PATH:$RUBY_HOME/bin && export GEM_HOME=$INSTALL_DIR &&
+ gem install %s''' % ( gem )
+ cmd = install_environment.build_command( td_common_util.evaluate_template( cmd, install_dir ) )
+ return_code = handle_command( app, tool_dependency, install_dir, cmd )
+ if return_code:
+ return
+
+ # Ruby libraries are installed to $INSTALL_DIR (install_dir), we now set the GEM_PATH path to that directory
+ # TODO: That code is used a lot for the different environments and should be refactored, once the environments are integrated
+ modify_env_command_dict = dict( name="GEM_PATH", action="prepend_to", value=install_dir )
+ env_entry, env_file = td_common_util.create_or_update_env_shell_file( install_dir, modify_env_command_dict )
+ return_code = file_append( env_entry, env_file, skip_if_contained=True, make_executable=True )
+ if return_code:
+ return
+
+ modify_env_command_dict = dict( name="PATH", action="prepend_to", value=os.path.join(install_dir, 'bin') )
+ env_entry, env_file = td_common_util.create_or_update_env_shell_file( install_dir, modify_env_command_dict )
+ return_code = file_append( env_entry, env_file, skip_if_contained=True, make_executable=True )
+ if return_code:
+ return
+
else:
# We're handling a complex repository dependency where we only have a set_environment tag set.
# <action type="set_environment">
diff -r 23c9b4736570957fd2d54bde163d99943efb2e1c -r 5a259fa8aabb4d977c5ed091d1658b9674d0e67c lib/tool_shed/galaxy_install/tool_dependencies/install_util.py
--- a/lib/tool_shed/galaxy_install/tool_dependencies/install_util.py
+++ b/lib/tool_shed/galaxy_install/tool_dependencies/install_util.py
@@ -613,10 +613,13 @@
action_dict[ 'configure_opts' ] = configure_opts
elif action_type == 'setup_r_environment':
# setup an R environment
- # <action type="setup_r_environment" name="package_r_3_0_1" owner="bgruening">
- # <package>https://github.com/bgruening/download_store/raw/master/DESeq2-1_0_18/BiocGe…</package>
+ # <action type="setup_r_environment">
+ # <repository name="package_r_3_0_1" owner="bgruening">
+ # <package name="R" version="3.0.1" />
+ # </repository>
+ # <!-- allow installing an R packages -->
+ # <package>https://github.com/bgruening/download_store/raw/master/DESeq2-1_0_18/BiocGe…</package>
# </action>
-
env_shell_file_paths = td_common_util.get_env_shell_file_paths( app, action_elem.find('repository') )
all_env_shell_file_paths.extend( env_shell_file_paths )
@@ -631,6 +634,46 @@
action_dict[ 'r_packages' ] = r_packages
else:
continue
+ elif action_type == 'setup_ruby_environment':
+ # setup an Ruby environment
+ # <action type="setup_ruby_environment">
+ # <repository name="package_ruby_2_0" owner="bgruening">
+ # <package name="ruby" version="2.0" />
+ # </repository>
+ # <!-- allow downloading and installing an Ruby package from http://rubygems.org/ -->
+ # <package>protk</package>
+ # <package>protk=1.2.4</package>
+ # <package>http://url-to-some-gem-file.de/protk.gem</package>
+ # </action>
+
+ env_shell_file_paths = td_common_util.get_env_shell_file_paths( app, action_elem.find('repository') )
+ all_env_shell_file_paths.extend( env_shell_file_paths )
+ if all_env_shell_file_paths:
+ action_dict[ 'env_shell_file_paths' ] = all_env_shell_file_paths
+ ruby_packages = list()
+ for env_elem in action_elem:
+ if env_elem.tag == 'package':
+ """
+ A valid gem definition can be:
+ protk=1.2.4
+ protk
+ ftp://ftp.gruening.de/protk.gem
+ """
+ gem_token = env_elem.text.strip().split('=')
+ if len(gem_token) == 2:
+ # version string
+ gem_name = gem_token[0]
+ gem_version = gem_token[1]
+ ruby_packages.append( [gem_name, gem_version] )
+ else:
+ # gem name for rubygems.org without version number
+ gem = env_elem.text.strip()
+ ruby_packages.append( [gem, None] )
+
+ if ruby_packages:
+ action_dict[ 'ruby_packages' ] = ruby_packages
+ else:
+ continue
elif action_type == 'make_install':
# make; make install; allow providing make options
if action_elem.text:
diff -r 23c9b4736570957fd2d54bde163d99943efb2e1c -r 5a259fa8aabb4d977c5ed091d1658b9674d0e67c test-data/extract_genomic_dna_out2.fasta
--- a/test-data/extract_genomic_dna_out2.fasta
+++ b/test-data/extract_genomic_dna_out2.fasta
@@ -1,6 +1,6 @@
->droPer1_super_1_139823_139913_-
+>droPer1_super_1_139823_139913_- AK028861
CGTCGGCTTCTGCTTCTGCTGATGATGGTCGTTCTTCTTCCTTTACTTCT
TCCTATTTTTCTTCCTTCCCTTACACTATATCTTCCTTTA
->droPer1_super_1_156750_156844_-
+>droPer1_super_1_156750_156844_- BC126698
CCGGGCTGCGGCAAGGGATTCACCTGCTCCAAACAGCTCAAGGTGCACTC
CCGCACGCACACGGGCGAGAAGCCCTATCACTGCGACATCTGCT
diff -r 23c9b4736570957fd2d54bde163d99943efb2e1c -r 5a259fa8aabb4d977c5ed091d1658b9674d0e67c tools/extract/extract_genomic_dna.py
--- a/tools/extract/extract_genomic_dna.py
+++ b/tools/extract/extract_genomic_dna.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
usage: %prog $input $out_file1
- -1, --cols=N,N,N,N: Columns for start, end, strand in input file
+ -1, --cols=N,N,N,N,N: Columns for start, end, strand in input file
-d, --dbkey=N: Genome build of input file
-o, --output_format=N: the data type of the output file
-g, --GALAXY_DATA_INDEX_DIR=N: the directory containing alignseq.loc
@@ -54,7 +54,13 @@
#
options, args = doc_optparse.parse( __doc__ )
try:
- chrom_col, start_col, end_col, strand_col = parse_cols_arg( options.cols )
+ if len(options.cols.split(',')) == 5:
+ # BED file
+ chrom_col, start_col, end_col, strand_col, name_col = parse_cols_arg( options.cols )
+ else:
+ # gff file
+ chrom_col, start_col, end_col, strand_col = parse_cols_arg( options.cols )
+ name_col = False
dbkey = options.dbkey
output_format = options.output_format
gff_format = options.gff
@@ -136,7 +142,8 @@
if isinstance( feature, ( Header, Comment ) ):
line_count += 1
continue
-
+
+ name = ""
if gff_format and interpret_features:
# Processing features.
gff_util.convert_gff_coords_to_bed( feature )
@@ -153,6 +160,8 @@
chrom = fields[chrom_col]
start = int( fields[start_col] )
end = int( fields[end_col] )
+ if name_col:
+ name = fields[name_col]
if gff_format:
start, end = gff_util.convert_gff_coords_to_bed( [start, end] )
if includes_strand_col:
@@ -237,13 +246,16 @@
sequence = reverse_complement( sequence )
if output_format == "fasta" :
- l = len( sequence )
+ l = len( sequence )
c = 0
if gff_format:
start, end = gff_util.convert_bed_coords_to_gff( [ start, end ] )
fields = [dbkey, str( chrom ), str( start ), str( end ), strand]
meta_data = "_".join( fields )
- fout.write( ">%s\n" % meta_data )
+ if name.strip():
+ fout.write( ">%s %s\n" % (meta_data, name) )
+ else:
+ fout.write( ">%s\n" % meta_data )
while c < l:
b = min( c + 50, l )
fout.write( "%s\n" % str( sequence[c:b] ) )
diff -r 23c9b4736570957fd2d54bde163d99943efb2e1c -r 5a259fa8aabb4d977c5ed091d1658b9674d0e67c tools/extract/extract_genomic_dna.xml
--- a/tools/extract/extract_genomic_dna.xml
+++ b/tools/extract/extract_genomic_dna.xml
@@ -1,4 +1,4 @@
-<tool id="Extract genomic DNA 1" name="Extract Genomic DNA" version="2.2.2">
+<tool id="Extract genomic DNA 1" name="Extract Genomic DNA" version="2.2.3"><description>using coordinates from assembled/unassembled genomes</description><command interpreter="python">
extract_genomic_dna.py $input $out_file1 -o $out_format -d $dbkey
@@ -11,9 +11,9 @@
#if isinstance( $input.datatype, $__app__.datatypes_registry.get_datatype_by_extension('gff').__class__):
-1 1,4,5,7 --gff
#else:
- -1 ${input.metadata.chromCol},${input.metadata.startCol},${input.metadata.endCol},${input.metadata.strandCol}
+ -1 ${input.metadata.chromCol},${input.metadata.startCol},${input.metadata.endCol},${input.metadata.strandCol},${input.metadata.nameCol}
#end if
-
+
#if $seq_source.index_source == "cached":
## Genomic data from cache.
-g ${GALAXY_DATA_INDEX_DIR}
@@ -52,16 +52,30 @@
</data></outputs><requirements>
+ <requirement type="package">ucsc_tools</requirement><requirement type="binary">faToTwoBit</requirement>
- <requirement type="package">ucsc_tools</requirement></requirements><tests><test><param name="input" value="1.bed" dbkey="hg17" ftype="bed" /><param name="interpret_features" value="yes"/><param name="index_source" value="cached"/>
- <param name="out_format" value="fasta"/>
- <output name="out_file1" file="extract_genomic_dna_out1.fasta" />
+ <param name="out_format" value="fasta"/>
+ <output name="out_file1">
+ <assert_contents>
+ <!-- First few lines... -->
+ <has_text text=">hg17_chr1_147962192_147962580_- CCDS989.1_cds_0_0_chr1_147962193_r" />
+ <has_text text="ACTTGATCCTGCTCCCTCGGTGTCTGCATTGACTCCTCATGCTGGGACTG" />
+ <has_text text="GACCCGTCAACCCCCCTGCTCGCTGCTCACGTACCTTCATCACTTTTAGT" />
+ <has_text text="GATGATGCAACTTTCGAGGAATGGTTCCCCCAAGGGCGGCCCCCAAAAGT" />
+ <!-- Last few lines... -->
+ <has_text text="GCTGTGGCACAGAACATGGACTCTGTGTTTAAGGAGCTCTTGGGAAAGAC" />
+ <has_text text="CTCTGTCCGCCAGGGCCTTGGGCCAGCATCTACCACCTCTCCCAGTCCTG" />
+ <has_text text="GGCCCCGAAGCCCAAAGGCCCCGCCCAGCAGCCGCCTGGGCAGGAACAAA" />
+ <has_text text="GGCTTCTCCCGGGGCCCTGGGGCCCCAGCCTCACCCTCAGCTTCCCACCC" />
+ <has_text text="CCAGGGCCTAGACACGACCCCCAAGCCACACTGA" />
+ </assert_contents>
+ </output></test><test><param name="input" value="droPer1.bed" dbkey="droPer1" ftype="bed" />
@@ -152,14 +166,14 @@
Extracting sequences with **FASTA** output data type returns::
- >hg17_chr7_127475281_127475310_+
+ >hg17_chr7_127475281_127475310_+ NM_000230
GTAGGAATCGCAGCGCCAGCGGTTGCAAG
- >hg17_chr7_127485994_127486166_+
+ >hg17_chr7_127485994_127486166_+ NM_000230
GCCCAAGAAGCCCATCCTGGGAAGGAAAATGCATTGGGGAACCCTGTGCG
GATTCTTGTGGCTTTGGCCCTATCTTTTCTATGTCCAAGCTGTGCCCATC
CAAAAAGTCCAAGATGACACCAAAACCCTCATCAAGACAATTGTCACCAG
GATCAATGACATTTCACACACG
- >hg17_chr7_127486011_127486166_+
+ >hg17_chr7_127486011_127486166_+ D49487
TGGGAAGGAAAATGCATTGGGGAACCCTGTGCGGATTCTTGTGGCTTTGG
CCCTATCTTTTCTATGTCCAAGCTGTGCCCATCCAAAAAGTCCAAGATGA
CACCAAAACCCTCATCAAGACAATTGTCACCAGGATCAATGACATTTCAC
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
6 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/1ce68c239d0e/
Changeset: 1ce68c239d0e
Branch: extract_genomic_dna_tool_enhancements
User: BjoernGruening
Date: 2013-10-18 18:31:44
Summary: Add the value (nameCol) in a given BED file to the FASTA header.
Affected #: 2 files
diff -r febd7622924885dd0729ce00924289cc1f0eb741 -r 1ce68c239d0ee59bd469c4520bf754eaa80ac04c tools/extract/extract_genomic_dna.py
--- a/tools/extract/extract_genomic_dna.py
+++ b/tools/extract/extract_genomic_dna.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
usage: %prog $input $out_file1
- -1, --cols=N,N,N,N: Columns for start, end, strand in input file
+ -1, --cols=N,N,N,N,N: Columns for start, end, strand in input file
-d, --dbkey=N: Genome build of input file
-o, --output_format=N: the data type of the output file
-g, --GALAXY_DATA_INDEX_DIR=N: the directory containing alignseq.loc
@@ -54,7 +54,13 @@
#
options, args = doc_optparse.parse( __doc__ )
try:
- chrom_col, start_col, end_col, strand_col = parse_cols_arg( options.cols )
+ if len(options.cols.split(',')) == 5:
+ # BED file
+ chrom_col, start_col, end_col, strand_col, name_col = parse_cols_arg( options.cols )
+ else:
+ # gff file
+ chrom_col, start_col, end_col, strand_col = parse_cols_arg( options.cols )
+ name_col = False
dbkey = options.dbkey
output_format = options.output_format
gff_format = options.gff
@@ -144,6 +150,7 @@
start = feature.start
end = feature.end
strand = feature.strand
+ name = ""
else:
# Processing lines, either interval or GFF format.
line = feature.rstrip( '\r\n' )
@@ -153,6 +160,8 @@
chrom = fields[chrom_col]
start = int( fields[start_col] )
end = int( fields[end_col] )
+ if name_col:
+ name = fields[name_col]
if gff_format:
start, end = gff_util.convert_gff_coords_to_bed( [start, end] )
if includes_strand_col:
@@ -237,13 +246,16 @@
sequence = reverse_complement( sequence )
if output_format == "fasta" :
- l = len( sequence )
+ l = len( sequence )
c = 0
if gff_format:
start, end = gff_util.convert_bed_coords_to_gff( [ start, end ] )
fields = [dbkey, str( chrom ), str( start ), str( end ), strand]
meta_data = "_".join( fields )
- fout.write( ">%s\n" % meta_data )
+ if name.strip():
+ fout.write( ">%s %s\n" % (meta_data, name) )
+ else:
+ fout.write( ">%s\n" % meta_data )
while c < l:
b = min( c + 50, l )
fout.write( "%s\n" % str( sequence[c:b] ) )
diff -r febd7622924885dd0729ce00924289cc1f0eb741 -r 1ce68c239d0ee59bd469c4520bf754eaa80ac04c tools/extract/extract_genomic_dna.xml
--- a/tools/extract/extract_genomic_dna.xml
+++ b/tools/extract/extract_genomic_dna.xml
@@ -11,9 +11,9 @@
#if isinstance( $input.datatype, $__app__.datatypes_registry.get_datatype_by_extension('gff').__class__):
-1 1,4,5,7 --gff
#else:
- -1 ${input.metadata.chromCol},${input.metadata.startCol},${input.metadata.endCol},${input.metadata.strandCol}
+ -1 ${input.metadata.chromCol},${input.metadata.startCol},${input.metadata.endCol},${input.metadata.strandCol},${input.metadata.nameCol}
#end if
-
+
#if $seq_source.index_source == "cached":
## Genomic data from cache.
-g ${GALAXY_DATA_INDEX_DIR}
@@ -52,8 +52,8 @@
</data></outputs><requirements>
+ <requirement type="package">ucsc_tools</requirement><requirement type="binary">faToTwoBit</requirement>
- <requirement type="package">ucsc_tools</requirement></requirements><tests><test>
https://bitbucket.org/galaxy/galaxy-central/commits/9c6732931369/
Changeset: 9c6732931369
Branch: extract_genomic_dna_tool_enhancements
User: BjoernGruening
Date: 2013-10-24 18:13:18
Summary: bugfix and one test fix
Affected #: 3 files
diff -r 1ce68c239d0ee59bd469c4520bf754eaa80ac04c -r 9c67329313699a02108fe36dc0cee93fee362c70 test-data/extract_genomic_dna_out2.fasta
--- a/test-data/extract_genomic_dna_out2.fasta
+++ b/test-data/extract_genomic_dna_out2.fasta
@@ -1,6 +1,6 @@
->droPer1_super_1_139823_139913_-
+>droPer1_super_1_139823_139913_- AK028861
CGTCGGCTTCTGCTTCTGCTGATGATGGTCGTTCTTCTTCCTTTACTTCT
TCCTATTTTTCTTCCTTCCCTTACACTATATCTTCCTTTA
->droPer1_super_1_156750_156844_-
+>droPer1_super_1_156750_156844_- BC126698
CCGGGCTGCGGCAAGGGATTCACCTGCTCCAAACAGCTCAAGGTGCACTC
CCGCACGCACACGGGCGAGAAGCCCTATCACTGCGACATCTGCT
diff -r 1ce68c239d0ee59bd469c4520bf754eaa80ac04c -r 9c67329313699a02108fe36dc0cee93fee362c70 tools/extract/extract_genomic_dna.py
--- a/tools/extract/extract_genomic_dna.py
+++ b/tools/extract/extract_genomic_dna.py
@@ -142,7 +142,8 @@
if isinstance( feature, ( Header, Comment ) ):
line_count += 1
continue
-
+
+ name = ""
if gff_format and interpret_features:
# Processing features.
gff_util.convert_gff_coords_to_bed( feature )
@@ -150,7 +151,6 @@
start = feature.start
end = feature.end
strand = feature.strand
- name = ""
else:
# Processing lines, either interval or GFF format.
line = feature.rstrip( '\r\n' )
diff -r 1ce68c239d0ee59bd469c4520bf754eaa80ac04c -r 9c67329313699a02108fe36dc0cee93fee362c70 tools/extract/extract_genomic_dna.xml
--- a/tools/extract/extract_genomic_dna.xml
+++ b/tools/extract/extract_genomic_dna.xml
@@ -60,7 +60,7 @@
<param name="input" value="1.bed" dbkey="hg17" ftype="bed" /><param name="interpret_features" value="yes"/><param name="index_source" value="cached"/>
- <param name="out_format" value="fasta"/>
+ <param name="out_format" value="fasta"/><output name="out_file1" file="extract_genomic_dna_out1.fasta" /></test><test>
https://bitbucket.org/galaxy/galaxy-central/commits/af3fc6046bd6/
Changeset: af3fc6046bd6
Branch: extract_genomic_dna_tool_enhancements
User: jmchilton
Date: 2013-10-25 06:03:57
Summary: Update hg17 test case for extract_genomic_dna.xml tor reflect recent changes.
Cannot delete or modify previous output file - it is used as input for another tool. Use assertion testing to weaken test case. As this tool is migrated to the tool shed the hg17 test cases should probably be eliminated completely.
Affected #: 1 file
diff -r 9c67329313699a02108fe36dc0cee93fee362c70 -r af3fc6046bd693fdbf1ec26d119bf387d7a92bc2 tools/extract/extract_genomic_dna.xml
--- a/tools/extract/extract_genomic_dna.xml
+++ b/tools/extract/extract_genomic_dna.xml
@@ -61,7 +61,21 @@
<param name="interpret_features" value="yes"/><param name="index_source" value="cached"/><param name="out_format" value="fasta"/>
- <output name="out_file1" file="extract_genomic_dna_out1.fasta" />
+ <output name="out_file1">
+ <assert_contents>
+ <!-- First few lines... -->
+ <has_text text=">hg17_chr1_147962192_147962580_- CCDS989.1_cds_0_0_chr1_147962193_r" />
+ <has_text text="ACTTGATCCTGCTCCCTCGGTGTCTGCATTGACTCCTCATGCTGGGACTG" />
+ <has_text text="GACCCGTCAACCCCCCTGCTCGCTGCTCACGTACCTTCATCACTTTTAGT" />
+ <has_text text="GATGATGCAACTTTCGAGGAATGGTTCCCCCAAGGGCGGCCCCCAAAAGT" />
+ <!-- Last few lines... -->
+ <has_text text="GCTGTGGCACAGAACATGGACTCTGTGTTTAAGGAGCTCTTGGGAAAGAC" />
+ <has_text text="CTCTGTCCGCCAGGGCCTTGGGCCAGCATCTACCACCTCTCCCAGTCCTG" />
+ <has_text text="GGCCCCGAAGCCCAAAGGCCCCGCCCAGCAGCCGCCTGGGCAGGAACAAA" />
+ <has_text text="GGCTTCTCCCGGGGCCCTGGGGCCCCAGCCTCACCCTCAGCTTCCCACCC" />
+ <has_text text="CCAGGGCCTAGACACGACCCCCAAGCCACACTGA" />
+ </assert_contents>
+ </output></test><test><param name="input" value="droPer1.bed" dbkey="droPer1" ftype="bed" />
https://bitbucket.org/galaxy/galaxy-central/commits/7b014440dda1/
Changeset: 7b014440dda1
Branch: extract_genomic_dna_tool_enhancements
User: jmchilton
Date: 2013-10-25 06:06:14
Summary: Rev slightly the tool version of extract_genomic_dna.xml since output is slightly different.
Update tool help to reflect new output format.
Affected #: 1 file
diff -r af3fc6046bd693fdbf1ec26d119bf387d7a92bc2 -r 7b014440dda1d9dddb292598fb804510b5274438 tools/extract/extract_genomic_dna.xml
--- a/tools/extract/extract_genomic_dna.xml
+++ b/tools/extract/extract_genomic_dna.xml
@@ -1,4 +1,4 @@
-<tool id="Extract genomic DNA 1" name="Extract Genomic DNA" version="2.2.2">
+<tool id="Extract genomic DNA 1" name="Extract Genomic DNA" version="2.2.3"><description>using coordinates from assembled/unassembled genomes</description><command interpreter="python">
extract_genomic_dna.py $input $out_file1 -o $out_format -d $dbkey
@@ -166,14 +166,14 @@
Extracting sequences with **FASTA** output data type returns::
- >hg17_chr7_127475281_127475310_+
+ >hg17_chr7_127475281_127475310_+ NM_000230
GTAGGAATCGCAGCGCCAGCGGTTGCAAG
- >hg17_chr7_127485994_127486166_+
+ >hg17_chr7_127485994_127486166_+ NM_000230
GCCCAAGAAGCCCATCCTGGGAAGGAAAATGCATTGGGGAACCCTGTGCG
GATTCTTGTGGCTTTGGCCCTATCTTTTCTATGTCCAAGCTGTGCCCATC
CAAAAAGTCCAAGATGACACCAAAACCCTCATCAAGACAATTGTCACCAG
GATCAATGACATTTCACACACG
- >hg17_chr7_127486011_127486166_+
+ >hg17_chr7_127486011_127486166_+ D49487
TGGGAAGGAAAATGCATTGGGGAACCCTGTGCGGATTCTTGTGGCTTTGG
CCCTATCTTTTCTATGTCCAAGCTGTGCCCATCCAAAAAGTCCAAGATGA
CACCAAAACCCTCATCAAGACAATTGTCACCAGGATCAATGACATTTCAC
https://bitbucket.org/galaxy/galaxy-central/commits/57e9ebe8ea6b/
Changeset: 57e9ebe8ea6b
User: jmchilton
Date: 2013-10-25 06:08:48
Summary: Merge pull request #239 changes into default.
Affected #: 3 files
diff -r d4e60067889e2bd8873010fa0fc887e725a4b695 -r 57e9ebe8ea6ba6686a489560cde62b309d2e5271 test-data/extract_genomic_dna_out2.fasta
--- a/test-data/extract_genomic_dna_out2.fasta
+++ b/test-data/extract_genomic_dna_out2.fasta
@@ -1,6 +1,6 @@
->droPer1_super_1_139823_139913_-
+>droPer1_super_1_139823_139913_- AK028861
CGTCGGCTTCTGCTTCTGCTGATGATGGTCGTTCTTCTTCCTTTACTTCT
TCCTATTTTTCTTCCTTCCCTTACACTATATCTTCCTTTA
->droPer1_super_1_156750_156844_-
+>droPer1_super_1_156750_156844_- BC126698
CCGGGCTGCGGCAAGGGATTCACCTGCTCCAAACAGCTCAAGGTGCACTC
CCGCACGCACACGGGCGAGAAGCCCTATCACTGCGACATCTGCT
diff -r d4e60067889e2bd8873010fa0fc887e725a4b695 -r 57e9ebe8ea6ba6686a489560cde62b309d2e5271 tools/extract/extract_genomic_dna.py
--- a/tools/extract/extract_genomic_dna.py
+++ b/tools/extract/extract_genomic_dna.py
@@ -1,7 +1,7 @@
#!/usr/bin/env python
"""
usage: %prog $input $out_file1
- -1, --cols=N,N,N,N: Columns for start, end, strand in input file
+ -1, --cols=N,N,N,N,N: Columns for start, end, strand in input file
-d, --dbkey=N: Genome build of input file
-o, --output_format=N: the data type of the output file
-g, --GALAXY_DATA_INDEX_DIR=N: the directory containing alignseq.loc
@@ -54,7 +54,13 @@
#
options, args = doc_optparse.parse( __doc__ )
try:
- chrom_col, start_col, end_col, strand_col = parse_cols_arg( options.cols )
+ if len(options.cols.split(',')) == 5:
+ # BED file
+ chrom_col, start_col, end_col, strand_col, name_col = parse_cols_arg( options.cols )
+ else:
+ # gff file
+ chrom_col, start_col, end_col, strand_col = parse_cols_arg( options.cols )
+ name_col = False
dbkey = options.dbkey
output_format = options.output_format
gff_format = options.gff
@@ -136,7 +142,8 @@
if isinstance( feature, ( Header, Comment ) ):
line_count += 1
continue
-
+
+ name = ""
if gff_format and interpret_features:
# Processing features.
gff_util.convert_gff_coords_to_bed( feature )
@@ -153,6 +160,8 @@
chrom = fields[chrom_col]
start = int( fields[start_col] )
end = int( fields[end_col] )
+ if name_col:
+ name = fields[name_col]
if gff_format:
start, end = gff_util.convert_gff_coords_to_bed( [start, end] )
if includes_strand_col:
@@ -237,13 +246,16 @@
sequence = reverse_complement( sequence )
if output_format == "fasta" :
- l = len( sequence )
+ l = len( sequence )
c = 0
if gff_format:
start, end = gff_util.convert_bed_coords_to_gff( [ start, end ] )
fields = [dbkey, str( chrom ), str( start ), str( end ), strand]
meta_data = "_".join( fields )
- fout.write( ">%s\n" % meta_data )
+ if name.strip():
+ fout.write( ">%s %s\n" % (meta_data, name) )
+ else:
+ fout.write( ">%s\n" % meta_data )
while c < l:
b = min( c + 50, l )
fout.write( "%s\n" % str( sequence[c:b] ) )
diff -r d4e60067889e2bd8873010fa0fc887e725a4b695 -r 57e9ebe8ea6ba6686a489560cde62b309d2e5271 tools/extract/extract_genomic_dna.xml
--- a/tools/extract/extract_genomic_dna.xml
+++ b/tools/extract/extract_genomic_dna.xml
@@ -1,4 +1,4 @@
-<tool id="Extract genomic DNA 1" name="Extract Genomic DNA" version="2.2.2">
+<tool id="Extract genomic DNA 1" name="Extract Genomic DNA" version="2.2.3"><description>using coordinates from assembled/unassembled genomes</description><command interpreter="python">
extract_genomic_dna.py $input $out_file1 -o $out_format -d $dbkey
@@ -11,9 +11,9 @@
#if isinstance( $input.datatype, $__app__.datatypes_registry.get_datatype_by_extension('gff').__class__):
-1 1,4,5,7 --gff
#else:
- -1 ${input.metadata.chromCol},${input.metadata.startCol},${input.metadata.endCol},${input.metadata.strandCol}
+ -1 ${input.metadata.chromCol},${input.metadata.startCol},${input.metadata.endCol},${input.metadata.strandCol},${input.metadata.nameCol}
#end if
-
+
#if $seq_source.index_source == "cached":
## Genomic data from cache.
-g ${GALAXY_DATA_INDEX_DIR}
@@ -52,16 +52,30 @@
</data></outputs><requirements>
+ <requirement type="package">ucsc_tools</requirement><requirement type="binary">faToTwoBit</requirement>
- <requirement type="package">ucsc_tools</requirement></requirements><tests><test><param name="input" value="1.bed" dbkey="hg17" ftype="bed" /><param name="interpret_features" value="yes"/><param name="index_source" value="cached"/>
- <param name="out_format" value="fasta"/>
- <output name="out_file1" file="extract_genomic_dna_out1.fasta" />
+ <param name="out_format" value="fasta"/>
+ <output name="out_file1">
+ <assert_contents>
+ <!-- First few lines... -->
+ <has_text text=">hg17_chr1_147962192_147962580_- CCDS989.1_cds_0_0_chr1_147962193_r" />
+ <has_text text="ACTTGATCCTGCTCCCTCGGTGTCTGCATTGACTCCTCATGCTGGGACTG" />
+ <has_text text="GACCCGTCAACCCCCCTGCTCGCTGCTCACGTACCTTCATCACTTTTAGT" />
+ <has_text text="GATGATGCAACTTTCGAGGAATGGTTCCCCCAAGGGCGGCCCCCAAAAGT" />
+ <!-- Last few lines... -->
+ <has_text text="GCTGTGGCACAGAACATGGACTCTGTGTTTAAGGAGCTCTTGGGAAAGAC" />
+ <has_text text="CTCTGTCCGCCAGGGCCTTGGGCCAGCATCTACCACCTCTCCCAGTCCTG" />
+ <has_text text="GGCCCCGAAGCCCAAAGGCCCCGCCCAGCAGCCGCCTGGGCAGGAACAAA" />
+ <has_text text="GGCTTCTCCCGGGGCCCTGGGGCCCCAGCCTCACCCTCAGCTTCCCACCC" />
+ <has_text text="CCAGGGCCTAGACACGACCCCCAAGCCACACTGA" />
+ </assert_contents>
+ </output></test><test><param name="input" value="droPer1.bed" dbkey="droPer1" ftype="bed" />
@@ -152,14 +166,14 @@
Extracting sequences with **FASTA** output data type returns::
- >hg17_chr7_127475281_127475310_+
+ >hg17_chr7_127475281_127475310_+ NM_000230
GTAGGAATCGCAGCGCCAGCGGTTGCAAG
- >hg17_chr7_127485994_127486166_+
+ >hg17_chr7_127485994_127486166_+ NM_000230
GCCCAAGAAGCCCATCCTGGGAAGGAAAATGCATTGGGGAACCCTGTGCG
GATTCTTGTGGCTTTGGCCCTATCTTTTCTATGTCCAAGCTGTGCCCATC
CAAAAAGTCCAAGATGACACCAAAACCCTCATCAAGACAATTGTCACCAG
GATCAATGACATTTCACACACG
- >hg17_chr7_127486011_127486166_+
+ >hg17_chr7_127486011_127486166_+ D49487
TGGGAAGGAAAATGCATTGGGGAACCCTGTGCGGATTCTTGTGGCTTTGG
CCCTATCTTTTCTATGTCCAAGCTGTGCCCATCCAAAAAGTCCAAGATGA
CACCAAAACCCTCATCAAGACAATTGTCACCAGGATCAATGACATTTCAC
https://bitbucket.org/galaxy/galaxy-central/commits/7286338fd77e/
Changeset: 7286338fd77e
Branch: extract_genomic_dna_tool_enhancements
User: jmchilton
Date: 2013-10-25 06:09:25
Summary: Close branch extract_genomic_dna_tool_enhancements.
Affected #: 0 files
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/91399e1ae5fc/
Changeset: 91399e1ae5fc
User: BjoernGruening
Date: 2013-10-23 13:45:33
Summary: Add setup_ruby_environment action type
Affected #: 2 files
diff -r 115a6924dc4c459467ca162e10ee24ba04001a1e -r 91399e1ae5fc827ddc9b33702fe401a10d367539 lib/tool_shed/galaxy_install/tool_dependencies/fabric_util.py
--- a/lib/tool_shed/galaxy_install/tool_dependencies/fabric_util.py
+++ b/lib/tool_shed/galaxy_install/tool_dependencies/fabric_util.py
@@ -375,6 +375,68 @@
return_code = handle_command( app, tool_dependency, install_dir, modify_env_command )
if return_code:
return
+ elif action_type == 'setup_ruby_environment':
+ # setup an Ruby environment
+ # <action type="setup_ruby_environment">
+ # <repository name="package_ruby_2_0" owner="bgruening">
+ # <package name="ruby" version="2.0" />
+ # </repository>
+ # <!-- allow downloading and installing an Ruby package from http://rubygems.org/ -->
+ # <package>protk</package>
+ # <package>protk=1.2.4</package>
+ # <package>http://url-to-some-gem-file.de/protk.gem</package>
+ # </action>
+ if action_dict.get( 'env_shell_file_paths', False ):
+ install_environment.add_env_shell_file_paths( action_dict[ 'env_shell_file_paths' ] )
+ else:
+ log.warning( 'Missing Ruby environment. Please check if your specified Ruby installation exists.' )
+ return
+
+ dir = os.path.curdir
+ current_dir = os.path.abspath( os.path.join( work_dir, dir ) )
+ with lcd( current_dir ):
+ with settings( warn_only=True ):
+ for (gem, gem_version) in action_dict[ 'ruby_packages' ]:
+ if os.path.isfile( gem ):
+ # we assume a local shipped gem file
+ cmd = '''export PATH=$PATH:$RUBY_HOME/bin && export GEM_HOME=$INSTALL_DIR &&
+ gem install --local %s''' % ( gem )
+ elif gem.find('://') != -1:
+ # we assume a URL to a gem file
+ url = gem
+ gem_name = url.split( '/' )[ -1 ]
+ td_common_util.url_download( work_dir, gem_name, url, extract=False )
+ cmd = '''export PATH=$PATH:$RUBY_HOME/bin && export GEM_HOME=$INSTALL_DIR &&
+ gem install --local %s ''' % ( gem_name )
+ else:
+ # gem file from rubygems.org with or without version number
+ if gem_version:
+ # version number was specified
+ cmd = '''export PATH=$PATH:$RUBY_HOME/bin && export GEM_HOME=$INSTALL_DIR &&
+ gem install %s --version "=%s"''' % ( gem, gem_version)
+ else:
+ # no version number given
+ cmd = '''export PATH=$PATH:$RUBY_HOME/bin && export GEM_HOME=$INSTALL_DIR &&
+ gem install %s''' % ( gem )
+ cmd = install_environment.build_command( td_common_util.evaluate_template( cmd, install_dir ) )
+ return_code = handle_command( app, tool_dependency, install_dir, cmd )
+ if return_code:
+ return
+
+ # Ruby libraries are installed to $INSTALL_DIR (install_dir), we now set the GEM_PATH path to that directory
+ # TODO: That code is used a lot for the different environments and should be refactored, once the environments are integrated
+ modify_env_command_dict = dict( name="GEM_PATH", action="prepend_to", value=install_dir )
+ env_entry, env_file = td_common_util.create_or_update_env_shell_file( install_dir, modify_env_command_dict )
+ return_code = file_append( env_entry, env_file, skip_if_contained=True, make_executable=True )
+ if return_code:
+ return
+
+ modify_env_command_dict = dict( name="PATH", action="prepend_to", value=os.path.join(install_dir, 'bin') )
+ env_entry, env_file = td_common_util.create_or_update_env_shell_file( install_dir, modify_env_command_dict )
+ return_code = file_append( env_entry, env_file, skip_if_contained=True, make_executable=True )
+ if return_code:
+ return
+
else:
# We're handling a complex repository dependency where we only have a set_environment tag set.
# <action type="set_environment">
diff -r 115a6924dc4c459467ca162e10ee24ba04001a1e -r 91399e1ae5fc827ddc9b33702fe401a10d367539 lib/tool_shed/galaxy_install/tool_dependencies/install_util.py
--- a/lib/tool_shed/galaxy_install/tool_dependencies/install_util.py
+++ b/lib/tool_shed/galaxy_install/tool_dependencies/install_util.py
@@ -631,6 +631,46 @@
action_dict[ 'r_packages' ] = r_packages
else:
continue
+ elif action_type == 'setup_ruby_environment':
+ # setup an Ruby environment
+ # <action type="setup_ruby_environment">
+ # <repository name="package_ruby_2_0" owner="bgruening">
+ # <package name="ruby" version="2.0" />
+ # </repository>
+ # <!-- allow downloading and installing an Ruby package from http://rubygems.org/ -->
+ # <package>protk</package>
+ # <package>protk=1.2.4</package>
+ # <package>http://url-to-some-gem-file.de/protk.gem</package>
+ # </action>
+
+ env_shell_file_paths = td_common_util.get_env_shell_file_paths( app, action_elem.find('repository') )
+ all_env_shell_file_paths.extend( env_shell_file_paths )
+ if all_env_shell_file_paths:
+ action_dict[ 'env_shell_file_paths' ] = all_env_shell_file_paths
+ ruby_packages = list()
+ for env_elem in action_elem:
+ if env_elem.tag == 'package':
+ """
+ A valid gem definition can be:
+ protk=1.2.4
+ protk
+ ftp://ftp.gruening.de/protk.gem
+ """
+ gem_token = env_elem.text.strip().split('=')
+ if len(gem_token) == 2:
+ # version string
+ gem_name = gem_token[0]
+ gem_version = gem_token[1]
+ ruby_packages.append( [gem_name, gem_version] )
+ else:
+ # gem name for rubygems.org without version number
+ gem = env_elem.text.strip()
+ ruby_packages.append( [gem, None] )
+
+ if ruby_packages:
+ action_dict[ 'ruby_packages' ] = ruby_packages
+ else:
+ continue
elif action_type == 'make_install':
# make; make install; allow providing make options
if action_elem.text:
https://bitbucket.org/galaxy/galaxy-central/commits/d4e60067889e/
Changeset: d4e60067889e
User: BjoernGruening
Date: 2013-10-23 14:39:49
Summary: cleanup & bugfix for R environment
Affected #: 2 files
diff -r 91399e1ae5fc827ddc9b33702fe401a10d367539 -r d4e60067889e2bd8873010fa0fc887e725a4b695 lib/tool_shed/galaxy_install/tool_dependencies/fabric_util.py
--- a/lib/tool_shed/galaxy_install/tool_dependencies/fabric_util.py
+++ b/lib/tool_shed/galaxy_install/tool_dependencies/fabric_util.py
@@ -341,10 +341,13 @@
elif action_type == 'setup_r_environment':
# setup an R environment
# <action type="setup_r_environment">
- # <r_base name="package_r_3_0_1" owner="bgruening" />
+ # <repository name="package_r_3_0_1" owner="bgruening">
+ # <package name="R" version="3.0.1" />
+ # </repository>
+ # <!-- allow installing an R packages -->
+ # <package>https://github.com/bgruening/download_store/raw/master/DESeq2-1_0_18/BiocGe…</package>
# </action>
- # allow downloading and installing an R package
- # <package>https://github.com/bgruening/download_store/raw/master/DESeq2-1_0_18/BiocGe…</package>
+
if action_dict.get( 'env_shell_file_paths', False ):
install_environment.add_env_shell_file_paths( action_dict[ 'env_shell_file_paths' ] )
else:
@@ -371,8 +374,9 @@
# R libraries are installed to $INSTALL_DIR (install_dir), we now set the R_LIBS path to that directory
# TODO: That code is used a lot for the different environments and should be refactored, once the environments are integrated
modify_env_command_dict = dict( name="R_LIBS", action="prepend_to", value=install_dir )
- modify_env_command = td_common_util.create_or_update_env_shell_file( install_dir, modify_env_command_dict )
- return_code = handle_command( app, tool_dependency, install_dir, modify_env_command )
+ env_entry, env_file = td_common_util.create_or_update_env_shell_file( install_dir, modify_env_command_dict )
+ return_code = file_append( env_entry, env_file, skip_if_contained=True, make_executable=True )
+
if return_code:
return
elif action_type == 'setup_ruby_environment':
diff -r 91399e1ae5fc827ddc9b33702fe401a10d367539 -r d4e60067889e2bd8873010fa0fc887e725a4b695 lib/tool_shed/galaxy_install/tool_dependencies/install_util.py
--- a/lib/tool_shed/galaxy_install/tool_dependencies/install_util.py
+++ b/lib/tool_shed/galaxy_install/tool_dependencies/install_util.py
@@ -613,10 +613,13 @@
action_dict[ 'configure_opts' ] = configure_opts
elif action_type == 'setup_r_environment':
# setup an R environment
- # <action type="setup_r_environment" name="package_r_3_0_1" owner="bgruening">
- # <package>https://github.com/bgruening/download_store/raw/master/DESeq2-1_0_18/BiocGe…</package>
+ # <action type="setup_r_environment">
+ # <repository name="package_r_3_0_1" owner="bgruening">
+ # <package name="R" version="3.0.1" />
+ # </repository>
+ # <!-- allow installing an R packages -->
+ # <package>https://github.com/bgruening/download_store/raw/master/DESeq2-1_0_18/BiocGe…</package>
# </action>
-
env_shell_file_paths = td_common_util.get_env_shell_file_paths( app, action_elem.find('repository') )
all_env_shell_file_paths.extend( env_shell_file_paths )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/21a13e4865b3/
Changeset: 21a13e4865b3
Branch: next-stable
User: jmchilton
Date: 2013-04-23 16:57:14
Summary: Add exception handling for Binary sniffers. Image sniffers can fail for large files because signed integers are used internally, this catches that and other potential problems.
Traceback (most recent call last):
File "/opt/galaxy/web/tools/data_source/upload.py", line 432, in <module>
__main__()
File "/opt/galaxy/web/tools/data_source/upload.py", line 421, in __main__
add_file( dataset, registry, json_file, output_path )
File "/opt/galaxy/web/tools/data_source/upload.py", line 155, in add_file
type_info = Binary.is_sniffable_binary( dataset.path )
File "/opt/galaxy/web/lib/galaxy/datatypes/binary.py", line 38, in is_sniffable_binary
if format["class"]().sniff(filename):
File "/opt/galaxy/web/lib/galaxy/datatypes/images.py", line 203, in sniff
headers = get_headers(filename, None, 1)
File "/opt/galaxy/web/lib/galaxy/datatypes/sniff.py", line 179, in get_headers
for idx, line in enumerate(file(fname)):
SystemError: Negative size passed to PyString_FromStringAndSize
Affected #: 1 file
diff -r 7266b5e09cb20cac801cddef87b0466ddc32d41e -r 21a13e4865b3f5d997dd34bc977eb5f998b43024 lib/galaxy/datatypes/binary.py
--- a/lib/galaxy/datatypes/binary.py
+++ b/lib/galaxy/datatypes/binary.py
@@ -42,11 +42,20 @@
Binary.unsniffable_binary_formats.append(ext)
@staticmethod
- def is_sniffable_binary(filename):
+ def is_sniffable_binary( filename ):
+ format_information = None
for format in Binary.sniffable_binary_formats:
- if format["class"]().sniff(filename):
- return (format["type"], format["ext"])
- return None
+ format_instance = format[ "class" ]()
+ try:
+ if format_instance.sniff(filename):
+ format_information = ( format["type"], format[ "ext" ] )
+ break
+ except Exception:
+ # Sniffer raised exception, could be any number of
+ # reasons for this so there is not much to do besides
+ # trying next sniffer.
+ pass
+ return format_information
@staticmethod
def is_ext_unsniffable(ext):
https://bitbucket.org/galaxy/galaxy-central/commits/94aea2327373/
Changeset: 94aea2327373
Branch: next-stable
User: jmchilton
Date: 2013-04-23 19:24:16
Summary: Rework checking binary files. Why read in line by line if only going to check 100 characters? This approach to just read first 100 characters is cleaner, more efficient, and hopefully less error prone. Should avoid the following exception caused when checking large files:
Traceback (most recent call last):
File "/opt/galaxy/web/tools/data_source/upload.py", line 432, in <module>
__main__()
File "/opt/galaxy/web/tools/data_source/upload.py", line 421, in __main__
add_file( dataset, registry, json_file, output_path )
File "/opt/galaxy/web/tools/data_source/upload.py", line 283, in add_file
if check_binary( dataset.path ):
File "/opt/galaxy/web/lib/galaxy/datatypes/checkers.py", line 58, in check_binary
for chars in temp:
SystemError: Negative size passed to PyString_FromStringAndSize
Affected #: 1 file
diff -r 21a13e4865b3f5d997dd34bc977eb5f998b43024 -r 94aea2327373d4cb651e3db3fe5113a5b0c669f5 lib/galaxy/datatypes/checkers.py
--- a/lib/galaxy/datatypes/checkers.py
+++ b/lib/galaxy/datatypes/checkers.py
@@ -1,5 +1,6 @@
import os, gzip, re, gzip, zipfile, binascii, bz2, imghdr
from galaxy import util
+from StringIO import StringIO
try:
import Image as PIL
@@ -53,20 +54,15 @@
if file_path:
temp = open( name, "U" )
else:
- temp = name
+ temp = StringIO( name )
chars_read = 0
- for chars in temp:
- for char in chars:
- chars_read += 1
+ try:
+ for char in temp.read( 100 ):
if util.is_binary( char ):
is_binary = True
break
- if chars_read > 100:
- break
- if chars_read > 100:
- break
- if file_path:
- temp.close()
+ finally:
+ temp.close( )
return is_binary
def check_gzip( file_path ):
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/edab395a78b1/
Changeset: edab395a78b1
Branch: tool_api
User: Kyle Ellrott
Date: 2013-10-25 01:34:30
Summary: Adding output_name to /api/tool submit output. So files created by a tool can be mapped to the possible multiple output declaration it could have
Affected #: 1 file
diff -r bf0057b13f58f5c5438f1a6477b27bfceb14a2ce -r edab395a78b1f9d27bc2f2d233b2ded002b3080a lib/galaxy/webapps/galaxy/api/tools.py
--- a/lib/galaxy/webapps/galaxy/api/tools.py
+++ b/lib/galaxy/webapps/galaxy/api/tools.py
@@ -119,14 +119,18 @@
return { "message": { "type": "error", "data" : vars[ 'errors' ] } }
# TODO: check for errors and ensure that output dataset(s) are available.
- output_datasets = vars.get( 'out_data', {} ).values()
+ output_datasets = vars.get( 'out_data', {} ).iteritems()
rval = {
"outputs": []
}
outputs = rval[ "outputs" ]
#TODO:?? poss. only return ids?
- for output in output_datasets:
+ for output_name, output in output_datasets:
output_dict = output.to_dict()
+ #add the output name back into the output data structure
+ #so it's possible to figure out which newly created elements
+ #correspond with which tool file outputs
+ output_dict['output_name'] = output_name
outputs.append( trans.security.encode_dict_ids( output_dict ) )
return rval
https://bitbucket.org/galaxy/galaxy-central/commits/115a6924dc4c/
Changeset: 115a6924dc4c
User: jmchilton
Date: 2013-10-25 04:08:11
Summary: Merged in kellrott/galaxy-central/tool_api (pull request #243)
Adding output_name to /api/tool submit output
Matching client code added to blend4j: https://github.com/jmchilton/blend4j/commit/991ec2b30fd538c0b8e97aa55e681aa….
Thanks for the contribution Kyle!
Affected #: 1 file
diff -r 97cb7306dc345ce5e81861e421c5277701161802 -r 115a6924dc4c459467ca162e10ee24ba04001a1e lib/galaxy/webapps/galaxy/api/tools.py
--- a/lib/galaxy/webapps/galaxy/api/tools.py
+++ b/lib/galaxy/webapps/galaxy/api/tools.py
@@ -119,14 +119,18 @@
return { "message": { "type": "error", "data" : vars[ 'errors' ] } }
# TODO: check for errors and ensure that output dataset(s) are available.
- output_datasets = vars.get( 'out_data', {} ).values()
+ output_datasets = vars.get( 'out_data', {} ).iteritems()
rval = {
"outputs": []
}
outputs = rval[ "outputs" ]
#TODO:?? poss. only return ids?
- for output in output_datasets:
+ for output_name, output in output_datasets:
output_dict = output.to_dict()
+ #add the output name back into the output data structure
+ #so it's possible to figure out which newly created elements
+ #correspond with which tool file outputs
+ output_dict['output_name'] = output_name
outputs.append( trans.security.encode_dict_ids( output_dict ) )
return rval
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: dannon: Re-close search feature branch.
by commits-noreply@bitbucket.org 24 Oct '13
by commits-noreply@bitbucket.org 24 Oct '13
24 Oct '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/e19d39296919/
Changeset: e19d39296919
Branch: search
User: dannon
Date: 2013-10-25 00:12:50
Summary: Re-close search feature branch.
Affected #: 0 files
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
3 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/9da06a2f3db4/
Changeset: 9da06a2f3db4
Branch: search
User: Kyle Ellrott
Date: 2013-10-24 21:50:53
Summary: Default merge
Affected #: 45 files
diff -r f82bbdc5c22b24d329a6710a20ce4c049f124064 -r 9da06a2f3db4bf535cf179af6ba66b98741e7ea1 lib/galaxy/datatypes/binary.py
--- a/lib/galaxy/datatypes/binary.py
+++ b/lib/galaxy/datatypes/binary.py
@@ -42,11 +42,20 @@
Binary.unsniffable_binary_formats.append(ext)
@staticmethod
- def is_sniffable_binary(filename):
+ def is_sniffable_binary( filename ):
+ format_information = None
for format in Binary.sniffable_binary_formats:
- if format["class"]().sniff(filename):
- return (format["type"], format["ext"])
- return None
+ format_instance = format[ "class" ]()
+ try:
+ if format_instance.sniff(filename):
+ format_information = ( format["type"], format[ "ext" ] )
+ break
+ except Exception:
+ # Sniffer raised exception, could be any number of
+ # reasons for this so there is not much to do besides
+ # trying next sniffer.
+ pass
+ return format_information
@staticmethod
def is_ext_unsniffable(ext):
diff -r f82bbdc5c22b24d329a6710a20ce4c049f124064 -r 9da06a2f3db4bf535cf179af6ba66b98741e7ea1 lib/galaxy/datatypes/checkers.py
--- a/lib/galaxy/datatypes/checkers.py
+++ b/lib/galaxy/datatypes/checkers.py
@@ -1,5 +1,6 @@
import os, gzip, re, gzip, zipfile, binascii, bz2, imghdr
from galaxy import util
+from StringIO import StringIO
try:
import Image as PIL
@@ -53,20 +54,15 @@
if file_path:
temp = open( name, "U" )
else:
- temp = name
+ temp = StringIO( name )
chars_read = 0
- for chars in temp:
- for char in chars:
- chars_read += 1
+ try:
+ for char in temp.read( 100 ):
if util.is_binary( char ):
is_binary = True
break
- if chars_read > 100:
- break
- if chars_read > 100:
- break
- if file_path:
- temp.close()
+ finally:
+ temp.close( )
return is_binary
def check_gzip( file_path ):
diff -r f82bbdc5c22b24d329a6710a20ce4c049f124064 -r 9da06a2f3db4bf535cf179af6ba66b98741e7ea1 lib/galaxy/datatypes/metadata.py
--- a/lib/galaxy/datatypes/metadata.py
+++ b/lib/galaxy/datatypes/metadata.py
@@ -5,7 +5,6 @@
from galaxy import eggs
eggs.require("simplejson")
-
import copy
import cPickle
import logging
@@ -37,10 +36,12 @@
"""
def __init__( self, target ):
self.target = target
+
def __call__( self, *args, **kwargs ):
class_locals = sys._getframe( 1 ).f_locals #get the locals dictionary of the frame object one down in the call stack (i.e. the Datatype class calling MetadataElement)
statements = class_locals.setdefault( STATEMENTS, [] ) #get and set '__galaxy_statments__' to an empty list if not in locals dict
statements.append( ( self, args, kwargs ) ) #add Statement containing info to populate a MetadataElementSpec
+
@classmethod
def process( cls, element ):
for statement, args, kwargs in getattr( element, STATEMENTS, [] ):
@@ -59,29 +60,38 @@
#initialize dict if needed
if self.parent._metadata is None:
self.parent._metadata = {}
+
def get_parent( self ):
if "_parent" in self.__dict__:
return self.__dict__["_parent"]()
return None
+
def set_parent( self, parent ):
self.__dict__["_parent"] = weakref.ref( parent ) # use weakref to prevent a circular reference interfering with garbage collection: hda/lda (parent) <--> MetadataCollection (self) ; needs to be hashable, so cannot use proxy.
parent = property( get_parent, set_parent )
+
@property
def spec( self ):
return self.parent.datatype.metadata_spec
+
def __iter__( self ):
return self.parent._metadata.__iter__()
+
def get( self, key, default=None ):
try:
return self.__getattr__( key ) or default
except:
return default
+
def items(self):
return iter( [ ( k, self.get( k ) ) for k in self.spec.iterkeys() ] )
+
def __str__(self):
return dict( self.items() ).__str__()
+
def __nonzero__( self ):
return bool( self.parent._metadata )
+
def __getattr__( self, name ):
if name in self.spec:
if name in self.parent._metadata:
@@ -89,6 +99,7 @@
return self.spec[name].wrap( self.spec[name].default, object_session( self.parent ) )
if name in self.parent._metadata:
return self.parent._metadata[name]
+
def __setattr__( self, name, value ):
if name == "parent":
return self.set_parent( value )
@@ -97,14 +108,17 @@
self.parent._metadata[name] = self.spec[name].unwrap( value )
else:
self.parent._metadata[name] = value
+
def element_is_set( self, name ):
return bool( self.parent._metadata.get( name, False ) )
+
def get_html_by_name( self, name, **kwd ):
if name in self.spec:
rval = self.spec[name].param.get_html( value=getattr( self, name ), context=self, **kwd )
if rval is None:
return self.spec[name].no_value
return rval
+
def make_dict_copy( self, to_copy ):
"""Makes a deep copy of input iterable to_copy according to self.spec"""
rval = {}
@@ -112,6 +126,7 @@
if key in self.spec:
rval[key] = self.spec[key].param.make_copy( value, target_context=self, source_context=to_copy )
return rval
+
def from_JSON_dict( self, filename ):
dataset = self.parent
log.debug( 'loading metadata from file for: %s %s' % ( dataset.__class__.__name__, dataset.id ) )
@@ -123,6 +138,7 @@
#if the metadata value is not found in our externally set metadata but it has a value in the 'old'
#metadata associated with our dataset, we'll delete it from our dataset's metadata dict
del dataset._metadata[ name ]
+
def to_JSON_dict( self, filename ):
#galaxy.model.customtypes.json_encoder.encode()
meta_dict = {}
@@ -131,6 +147,7 @@
if name in dataset_meta_dict:
meta_dict[ name ] = spec.param.to_external_value( dataset_meta_dict[ name ] )
simplejson.dump( meta_dict, open( filename, 'wb+' ) )
+
def __getstate__( self ):
return None #cannot pickle a weakref item (self._parent), when data._metadata_collection is None, it will be recreated on demand
@@ -163,10 +180,12 @@
def __init__( self, spec ):
self.spec = spec
- def get_html_field( self, value=None, context={}, other_values={}, **kwd ):
+ def get_html_field( self, value=None, context=None, other_values=None, **kwd ):
+ context = context or {}
+ other_values = other_values or {}
return form_builder.TextField( self.spec.name, value=value )
- def get_html( self, value, context={}, other_values={}, **kwd ):
+ def get_html( self, value, context=None, other_values=None, **kwd ):
"""
The "context" is simply the metadata collection/bunch holding
this piece of metadata. This is passed in to allow for
@@ -175,6 +194,9 @@
example, a column assignment should validate against the
number of columns in the dataset.
"""
+ context = context or {}
+ other_values = other_values or {}
+
if self.spec.get("readonly"):
return value
if self.spec.get("optional"):
@@ -296,7 +318,10 @@
value = [value]
return ",".join( map( str, value ) )
- def get_html_field( self, value=None, context={}, other_values={}, values=None, **kwd ):
+ def get_html_field( self, value=None, context=None, other_values=None, values=None, **kwd ):
+ context = context or {}
+ other_values = other_values or {}
+
field = form_builder.SelectField( self.spec.name, multiple=self.multiple, display=self.spec.get("display") )
if self.values:
value_list = self.values
@@ -316,7 +341,10 @@
field.add_option( val, label, selected=False )
return field
- def get_html( self, value, context={}, other_values={}, values=None, **kwd ):
+ def get_html( self, value, context=None, other_values=None, values=None, **kwd ):
+ context = context or {}
+ other_values = other_values or {}
+
if self.spec.get("readonly"):
if value in [ None, [] ]:
return str( self.spec.no_value )
@@ -338,21 +366,30 @@
if not isinstance( value, list ): return [value]
return value
+
class DBKeyParameter( SelectParameter ):
- def get_html_field( self, value=None, context={}, other_values={}, values=None, **kwd):
+
+ def get_html_field( self, value=None, context=None, other_values=None, values=None, **kwd):
+ context = context or {}
+ other_values = other_values or {}
try:
values = kwd['trans'].db_builds
except KeyError:
pass
return super(DBKeyParameter, self).get_html_field( value, context, other_values, values, **kwd)
- def get_html( self, value=None, context={}, other_values={}, values=None, **kwd):
+
+ def get_html( self, value=None, context=None, other_values=None, values=None, **kwd):
+ context = context or {}
+ other_values = other_values or {}
try:
values = kwd['trans'].db_builds
except KeyError:
pass
return super(DBKeyParameter, self).get_html( value, context, other_values, values, **kwd)
+
class RangeParameter( SelectParameter ):
+
def __init__( self, spec ):
SelectParameter.__init__( self, spec )
# The spec must be set with min and max values
@@ -360,12 +397,18 @@
self.max = spec.get( "max" ) or 1
self.step = self.spec.get( "step" ) or 1
- def get_html_field( self, value=None, context={}, other_values={}, values=None, **kwd ):
+ def get_html_field( self, value=None, context=None, other_values=None, values=None, **kwd ):
+ context = context or {}
+ other_values = other_values or {}
+
if values is None:
values = zip( range( self.min, self.max, self.step ), range( self.min, self.max, self.step ))
return SelectParameter.get_html_field( self, value=value, context=context, other_values=other_values, values=values, **kwd )
- def get_html( self, value, context={}, other_values={}, values=None, **kwd ):
+ def get_html( self, value, context=None, other_values=None, values=None, **kwd ):
+ context = context or {}
+ other_values = other_values or {}
+
if values is None:
values = zip( range( self.min, self.max, self.step ), range( self.min, self.max, self.step ))
return SelectParameter.get_html( self, value, context=context, other_values=other_values, values=values, **kwd )
@@ -376,35 +419,46 @@
values = [ int(x) for x in value ]
return values
+
class ColumnParameter( RangeParameter ):
- def get_html_field( self, value=None, context={}, other_values={}, values=None, **kwd ):
+ def get_html_field( self, value=None, context=None, other_values=None, values=None, **kwd ):
+ context = context or {}
+ other_values = other_values or {}
+
if values is None and context:
column_range = range( 1, ( context.columns or 0 ) + 1, 1 )
values = zip( column_range, column_range )
return RangeParameter.get_html_field( self, value=value, context=context, other_values=other_values, values=values, **kwd )
- def get_html( self, value, context={}, other_values={}, values=None, **kwd ):
+ def get_html( self, value, context=None, other_values=None, values=None, **kwd ):
+ context = context or {}
+ other_values = other_values or {}
+
if values is None and context:
column_range = range( 1, ( context.columns or 0 ) + 1, 1 )
values = zip( column_range, column_range )
return RangeParameter.get_html( self, value, context=context, other_values=other_values, values=values, **kwd )
+
class ColumnTypesParameter( MetadataParameter ):
def to_string( self, value ):
return ",".join( map( str, value ) )
+
class ListParameter( MetadataParameter ):
def to_string( self, value ):
return ",".join( [str(x) for x in value] )
+
class DictParameter( MetadataParameter ):
def to_string( self, value ):
return simplejson.dumps( value )
+
class PythonObjectParameter( MetadataParameter ):
def to_string( self, value ):
@@ -412,16 +466,21 @@
return self.spec._to_string( self.spec.no_value )
return self.spec._to_string( value )
- def get_html_field( self, value=None, context={}, other_values={}, **kwd ):
+ def get_html_field( self, value=None, context=None, other_values=None, **kwd ):
+ context = context or {}
+ other_values = other_values or {}
return form_builder.TextField( self.spec.name, value=self._to_string( value ) )
- def get_html( self, value=None, context={}, other_values={}, **kwd ):
+ def get_html( self, value=None, context=None, other_values=None, **kwd ):
+ context = context or {}
+ other_values = other_values or {}
return str( self )
@classmethod
def marshal( cls, value ):
return value
+
class FileParameter( MetadataParameter ):
def to_string( self, value ):
@@ -429,10 +488,14 @@
return str( self.spec.no_value )
return value.file_name
- def get_html_field( self, value=None, context={}, other_values={}, **kwd ):
+ def get_html_field( self, value=None, context=None, other_values=None, **kwd ):
+ context = context or {}
+ other_values = other_values or {}
return form_builder.TextField( self.spec.name, value=str( value.id ) )
- def get_html( self, value=None, context={}, other_values={}, **kwd ):
+ def get_html( self, value=None, context=None, other_values=None, **kwd ):
+ context = context or {}
+ other_values = other_values or {}
return "<div>No display available for Metadata Files</div>"
def wrap( self, value, session ):
@@ -497,12 +560,15 @@
#we do not include 'dataset' in the kwds passed, as from_JSON_value() will handle this for us
return MetadataTempFile( **kwds )
+
#This class is used when a database file connection is not available
class MetadataTempFile( object ):
tmp_dir = 'database/tmp' #this should be overwritten as necessary in calling scripts
+
def __init__( self, **kwds ):
self.kwds = kwds
self._filename = None
+
@property
def file_name( self ):
if self._filename is None:
@@ -510,17 +576,21 @@
self._filename = abspath( tempfile.NamedTemporaryFile( dir = self.tmp_dir, prefix = "metadata_temp_file_" ).name )
open( self._filename, 'wb+' ) #create an empty file, so it can't be reused using tempfile
return self._filename
+
def to_JSON( self ):
return { '__class__':self.__class__.__name__, 'filename':self.file_name, 'kwds':self.kwds }
+
@classmethod
def from_JSON( cls, json_dict ):
#need to ensure our keywords are not unicode
rval = cls( **stringify_dictionary_keys( json_dict['kwds'] ) )
rval._filename = json_dict['filename']
return rval
+
@classmethod
def is_JSONified_value( cls, value ):
return ( isinstance( value, dict ) and value.get( '__class__', None ) == cls.__name__ )
+
@classmethod
def cleanup_from_JSON_dict_filename( cls, filename ):
try:
@@ -533,12 +603,15 @@
except Exception, e:
log.debug( 'Failed to cleanup MetadataTempFile temp files from %s: %s' % ( filename, e ) )
+
#Class with methods allowing set_meta() to be called externally to the Galaxy head
class JobExternalOutputMetadataWrapper( object ):
#this class allows access to external metadata filenames for all outputs associated with a job
#We will use JSON as the medium of exchange of information, except for the DatasetInstance object which will use pickle (in the future this could be JSONified as well)
+
def __init__( self, job ):
self.job_id = job.id
+
def get_output_filenames_by_dataset( self, dataset, sa_session ):
if isinstance( dataset, galaxy.model.HistoryDatasetAssociation ):
return sa_session.query( galaxy.model.JobExternalOutputMetadata ) \
@@ -549,12 +622,15 @@
.filter_by( job_id = self.job_id, library_dataset_dataset_association_id = dataset.id ) \
.first() #there should only be one or None
return None
+
def get_dataset_metadata_key( self, dataset ):
# Set meta can be called on library items and history items,
# need to make different keys for them, since ids can overlap
return "%s_%d" % ( dataset.__class__.__name__, dataset.id )
+
def setup_external_metadata( self, datasets, sa_session, exec_dir=None, tmp_dir=None, dataset_files_path=None,
- output_fnames=None, config_root=None, config_file=None, datatypes_config=None, job_metadata=None, kwds={} ):
+ output_fnames=None, config_root=None, config_file=None, datatypes_config=None, job_metadata=None, kwds=None ):
+ kwds = kwds or {}
#fill in metadata_files_dict and return the command with args required to set metadata
def __metadata_files_list_to_cmd_line( metadata_files ):
def __get_filename_override():
@@ -652,6 +728,7 @@
os.remove( fname )
except Exception, e:
log.debug( 'Failed to cleanup external metadata file (%s) for %s: %s' % ( key, dataset_key, e ) )
+
def set_job_runner_external_pid( self, pid, sa_session ):
for metadata_files in sa_session.query( galaxy.model.Job ).get( self.job_id ).external_output_metadata:
metadata_files.job_runner_external_pid = pid
diff -r f82bbdc5c22b24d329a6710a20ce4c049f124064 -r 9da06a2f3db4bf535cf179af6ba66b98741e7ea1 lib/galaxy/datatypes/registry.py
--- a/lib/galaxy/datatypes/registry.py
+++ b/lib/galaxy/datatypes/registry.py
@@ -547,8 +547,11 @@
display_app.id = tool_dict[ 'guid' ]
break
if deactivate:
- del self.display_applications[ display_app.id ]
- del self.datatypes_by_extension[ extension ].display_applications[ display_app.id ]
+ if display_app.id in self.display_applications:
+ del self.display_applications[ display_app.id ]
+ if extension in self.datatypes_by_extension:
+ if display_app.id in self.datatypes_by_extension[ extension ].display_applications:
+ del self.datatypes_by_extension[ extension ].display_applications[ display_app.id ]
if inherit and ( self.datatypes_by_extension[ extension ], display_app ) in self.inherit_display_application_by_class:
self.inherit_display_application_by_class.remove( ( self.datatypes_by_extension[ extension ], display_app ) )
self.log.debug( "Deactivated display application '%s' for datatype '%s'." % ( display_app.id, extension ) )
diff -r f82bbdc5c22b24d329a6710a20ce4c049f124064 -r 9da06a2f3db4bf535cf179af6ba66b98741e7ea1 lib/galaxy/webapps/galaxy/api/history_contents.py
--- a/lib/galaxy/webapps/galaxy/api/history_contents.py
+++ b/lib/galaxy/webapps/galaxy/api/history_contents.py
@@ -311,8 +311,9 @@
payload = self._validate_and_parse_update_payload( payload )
hda = self.get_dataset( trans, id, check_ownership=True, check_accessible=True, check_state=True )
- # additional checks here (security, etc.)
- changed = self.set_hda_from_dict( trans, hda, payload )
+ # get_dataset can return a string during an error
+ if hda and isinstance( hda, trans.model.HistoryDatasetAssociation ):
+ changed = self.set_hda_from_dict( trans, hda, payload )
except Exception, exception:
log.error( 'Update of history (%s), HDA (%s) failed: %s',
diff -r f82bbdc5c22b24d329a6710a20ce4c049f124064 -r 9da06a2f3db4bf535cf179af6ba66b98741e7ea1 lib/galaxy/webapps/galaxy/api/users.py
--- a/lib/galaxy/webapps/galaxy/api/users.py
+++ b/lib/galaxy/webapps/galaxy/api/users.py
@@ -4,7 +4,7 @@
import logging
from paste.httpexceptions import HTTPBadRequest, HTTPNotImplemented
from galaxy import util, web
-from galaxy.web.base.controller import BaseAPIController, url_for
+from galaxy.web.base.controller import BaseAPIController
log = logging.getLogger( __name__ )
@@ -22,27 +22,19 @@
query = trans.sa_session.query( trans.app.model.User )
deleted = util.string_as_bool( deleted )
if deleted:
- route = 'deleted_user'
query = query.filter( trans.app.model.User.table.c.deleted == True )
# only admins can see deleted users
if not trans.user_is_admin():
return []
-
else:
- route = 'user'
query = query.filter( trans.app.model.User.table.c.deleted == False )
# special case: user can see only their own user
if not trans.user_is_admin():
item = trans.user.to_dict( value_mapper={ 'id': trans.security.encode_id } )
- item['url'] = url_for( route, id=item['id'] )
- item['quota_percent'] = trans.app.quota_agent.get_percent( trans=trans )
return [item]
-
for user in query:
item = user.to_dict( value_mapper={ 'id': trans.security.encode_id } )
#TODO: move into api_values
- item['quota_percent'] = trans.app.quota_agent.get_percent( trans=trans )
- item['url'] = url_for( route, id=item['id'] )
rval.append( item )
return rval
diff -r f82bbdc5c22b24d329a6710a20ce4c049f124064 -r 9da06a2f3db4bf535cf179af6ba66b98741e7ea1 lib/galaxy/webapps/tool_shed/controllers/repository.py
--- a/lib/galaxy/webapps/tool_shed/controllers/repository.py
+++ b/lib/galaxy/webapps/tool_shed/controllers/repository.py
@@ -2741,6 +2741,9 @@
changeset_revision = kwd.get( 'changeset_revision', None )
repository = suc.get_repository_by_name_and_owner( trans.app, name, owner )
if repository:
+ repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans,
+ trans.security.encode_id( repository.id ),
+ changeset_revision )
repo_dir = repository.repo_path( trans.app )
repo = hg.repository( suc.get_configured_ui(), repo_dir )
tool_shed_status_dict = {}
@@ -2751,21 +2754,24 @@
tool_shed_status_dict[ 'latest_installable_revision' ] = 'True'
else:
next_installable_revision = suc.get_next_downloadable_changeset_revision( repository, repo, changeset_revision )
- if next_installable_revision:
- tool_shed_status_dict[ 'latest_installable_revision' ] = 'False'
+ if repository_metadata is None:
+ if next_installable_revision:
+ tool_shed_status_dict[ 'latest_installable_revision' ] = 'True'
+ else:
+ tool_shed_status_dict[ 'latest_installable_revision' ] = 'False'
else:
- tool_shed_status_dict[ 'latest_installable_revision' ] = 'True'
+ if next_installable_revision:
+ tool_shed_status_dict[ 'latest_installable_revision' ] = 'False'
+ else:
+ tool_shed_status_dict[ 'latest_installable_revision' ] = 'True'
# Handle revision updates.
if changeset_revision == repository.tip( trans.app ):
tool_shed_status_dict[ 'revision_update' ] = 'False'
else:
- repository_metadata = suc.get_repository_metadata_by_changeset_revision( trans,
- trans.security.encode_id( repository.id ),
- changeset_revision )
- if repository_metadata:
+ if repository_metadata is None:
+ tool_shed_status_dict[ 'revision_update' ] = 'True'
+ else:
tool_shed_status_dict[ 'revision_update' ] = 'False'
- else:
- tool_shed_status_dict[ 'revision_update' ] = 'True'
# Handle revision upgrades.
ordered_metadata_changeset_revisions = suc.get_ordered_metadata_changeset_revisions( repository, repo, downloadable=True )
num_metadata_revisions = len( ordered_metadata_changeset_revisions )
diff -r f82bbdc5c22b24d329a6710a20ce4c049f124064 -r 9da06a2f3db4bf535cf179af6ba66b98741e7ea1 lib/tool_shed/galaxy_install/tool_dependencies/fabric_util.py
--- a/lib/tool_shed/galaxy_install/tool_dependencies/fabric_util.py
+++ b/lib/tool_shed/galaxy_install/tool_dependencies/fabric_util.py
@@ -502,7 +502,6 @@
pre_cmd = './configure %s && make && make install' % configure_opts
else:
pre_cmd = './configure prefix=$INSTALL_DIR %s && make && make install' % configure_opts
-
cmd = install_environment.build_command( td_common_util.evaluate_template( pre_cmd, install_dir ) )
return_code = handle_command( app, tool_dependency, install_dir, cmd )
if return_code:
diff -r f82bbdc5c22b24d329a6710a20ce4c049f124064 -r 9da06a2f3db4bf535cf179af6ba66b98741e7ea1 lib/tool_shed/util/commit_util.py
--- a/lib/tool_shed/util/commit_util.py
+++ b/lib/tool_shed/util/commit_util.py
@@ -318,22 +318,23 @@
error_message = 'Unable to locate repository with name %s and owner %s. ' % ( str( name ), str( owner ) )
return revised, elem, error_message
-def handle_set_environment_for_install( trans, package_altered, altered, actions_elem, action_index, action_elem, unpopulate=False ):
+def handle_repository_dependency_sub_elem( trans, package_altered, altered, actions_elem, action_index, action_elem, unpopulate=False ):
+ # This method populates the toolshed and changeset_revision attributes for each of the following.
# <action type="set_environment_for_install">
- # <repository name="package_eigen_2_0" owner="test" changeset_revision="09eb05087cd0">
- # <package name="eigen" version="2.0.17" />
- # </repository>
- # </action>
+ # <action type="setup_r_environment">
+ # <action type="setup_ruby_environment">
for repo_index, repo_elem in enumerate( action_elem ):
- revised, repository_elem, error_message = handle_repository_dependency_elem( trans, repo_elem, unpopulate=unpopulate )
- if error_message:
- exception_message = 'The tool_dependencies.xml file contains an invalid <repository> tag. %s' % error_message
- raise Exception( exception_message )
- if revised:
- action_elem[ repo_index ] = repository_elem
- package_altered = True
- if not altered:
- altered = True
+ # Make sure to skip comments and tags that are not <repository>.
+ if repo_elem.tag == 'repository':
+ revised, repository_elem, error_message = handle_repository_dependency_elem( trans, repo_elem, unpopulate=unpopulate )
+ if error_message:
+ exception_message = 'The tool_dependencies.xml file contains an invalid <repository> tag. %s' % error_message
+ raise Exception( exception_message )
+ if revised:
+ action_elem[ repo_index ] = repository_elem
+ package_altered = True
+ if not altered:
+ altered = True
if package_altered:
actions_elem[ action_index ] = action_elem
return package_altered, altered, actions_elem
@@ -402,29 +403,28 @@
last_actions_elem[ last_actions_elem_package_index ] = last_actions_elem_package_elem
actions_group_elem[ last_actions_index ] = last_actions_elem
else:
- last_actions_elem_action_type = last_actions_elem.get( 'type' )
- if last_actions_elem_action_type == 'set_environment_for_install':
- last_actions_package_altered, altered, last_actions_elem = \
- handle_set_environment_for_install( trans,
- last_actions_package_altered,
- altered,
- actions_group_elem,
- last_actions_index,
- last_actions_elem,
- unpopulate=unpopulate )
+ # Inspect the sub elements of last_actions_elem to locate all <repository> tags and
+ # populate them with toolshed and changeset_revision attributes if necessary.
+ last_actions_package_altered, altered, last_actions_elem = \
+ handle_repository_dependency_sub_elem( trans,
+ last_actions_package_altered,
+ altered,
+ actions_group_elem,
+ last_actions_index,
+ last_actions_elem,
+ unpopulate=unpopulate )
elif actions_elem.tag == 'actions':
# We are not in an <actions_group> tag set, so we must be in an <actions> tag set.
for action_index, action_elem in enumerate( actions_elem ):
-
- action_type = action_elem.get( 'type' )
- if action_type == 'set_environment_for_install':
- package_altered, altered, actions_elem = handle_set_environment_for_install( trans,
- package_altered,
- altered,
- actions_elem,
- action_index,
- action_elem,
- unpopulate=unpopulate )
+ # Inspect the sub elements of last_actions_elem to locate all <repository> tags and populate them with
+ # toolshed and changeset_revision attributes if necessary.
+ package_altered, altered, actions_elem = handle_repository_dependency_sub_elem( trans,
+ package_altered,
+ altered,
+ actions_elem,
+ action_index,
+ action_elem,
+ unpopulate=unpopulate )
if package_altered:
package_elem[ actions_index ] = actions_elem
if package_altered:
diff -r f82bbdc5c22b24d329a6710a20ce4c049f124064 -r 9da06a2f3db4bf535cf179af6ba66b98741e7ea1 lib/tool_shed/util/common_install_util.py
--- a/lib/tool_shed/util/common_install_util.py
+++ b/lib/tool_shed/util/common_install_util.py
@@ -483,7 +483,7 @@
app.model.ToolDependency.installation_status.ERROR ]:
installed_tool_dependencies.append( tool_dependency )
elif elem.tag == 'set_environment':
- env_var_name = env_var_elem.get( 'name', None )
+ env_var_name = elem.get( 'name', None )
if env_var_name:
# Tool dependencies of type "set_environmnet" always have the version attribute set to None.
attr_tup = ( env_var_name, None, 'set_environment' )
diff -r f82bbdc5c22b24d329a6710a20ce4c049f124064 -r 9da06a2f3db4bf535cf179af6ba66b98741e7ea1 static/scripts/galaxy.upload.js
--- a/static/scripts/galaxy.upload.js
+++ b/static/scripts/galaxy.upload.js
@@ -278,7 +278,7 @@
sy.addClass(this.state.success);
// update galaxy history
- Galaxy.currHistoryPanel.refresh();
+ Galaxy.currHistoryPanel.refreshHdas();
},
// error
diff -r f82bbdc5c22b24d329a6710a20ce4c049f124064 -r 9da06a2f3db4bf535cf179af6ba66b98741e7ea1 static/scripts/mvc/dataset/hda-base.js
--- a/static/scripts/mvc/dataset/hda-base.js
+++ b/static/scripts/mvc/dataset/hda-base.js
@@ -5,7 +5,7 @@
//==============================================================================
/** @class Read only view for HistoryDatasetAssociation.
* @name HDABaseView
- *
+ *
* @augments Backbone.View
* @borrows LoggableMixin#logger as #logger
* @borrows LoggableMixin#log as #log
@@ -23,7 +23,7 @@
fxSpeed : 'fast',
- // ......................................................................... SET UP
+ // ......................................................................... set up
/** Set up the view, cache url templates, bind listeners
* @param {Object} attributes
* @config {Object} urlTemplates nested object containing url templates for this view
@@ -44,16 +44,28 @@
this._setUpListeners();
},
+ /** event listeners */
_setUpListeners : function(){
+
// re-rendering on any model changes
- this.model.on( 'change', this.render, this );
+ this.model.on( 'change', function( model, options ){
+
+ // if the model moved into the ready state and is expanded without details, fetch those details now
+ if( this.model.changedAttributes().state && this.model.inReadyState()
+ && this.expanded && !this.model.hasDetails() ){
+ this.model.fetch(); // will render automatically (due to lines below)
+
+ } else {
+ this.render();
+ }
+ }, this );
//this.on( 'all', function( event ){
// this.log( event );
//}, this );
},
- // ......................................................................... RENDER MAIN
+ // ......................................................................... render main
/** Render this HDA, set up ui.
* @fires rendered:ready when rendered and NO running HDAs
* @fires rendered when rendered and running HDAs
@@ -114,7 +126,6 @@
_setUpBehaviors : function( $container ){
$container = $container || this.$el;
// set up canned behavior on children (bootstrap, popupmenus, editable_text, etc.)
- //TODO: we can potentially skip this step and call popupmenu directly on the download button
make_popup_menus( $container );
$container.find( '[title]' ).tooltip({ placement : 'bottom' });
},
@@ -205,13 +216,10 @@
* @returns {jQuery} rendered DOM
*/
_render_titleLink : function(){
- return $( jQuery.trim( HDABaseView.templates.titleLink(
- //TODO?? does this need urls?
- _.extend( this.model.toJSON(), { urls: this.urls } )
- )));
+ return $( jQuery.trim( HDABaseView.templates.titleLink( this.model.toJSON() )));
},
- // ......................................................................... RENDER BODY
+ // ......................................................................... body
/** Render the data/metadata summary (format, size, misc info, etc.).
* @returns {jQuery} rendered DOM
*/
@@ -275,7 +283,7 @@
/** Render links to external genome display applications (igb, gbrowse, etc.).
* @param {jQuery} $parent the jq node to search for .display-apps and render into to (defaults to this.$el)
*/
- //TODO: not a fan of the style on these
+//TODO: move into visualization button
_render_displayApps : function( $parent ){
$parent = $parent || this.$el;
var $displayAppsDiv = $parent.find( 'div.display-apps' ),
@@ -302,7 +310,6 @@
/** Render the data peek.
* @returns {jQuery} rendered DOM
*/
- //TODO: curr. pre-formatted into table on the server side - may not be ideal/flexible
_render_peek : function(){
var peek = this.model.get( 'peek' );
if( !peek ){ return null; }
@@ -318,74 +325,38 @@
/** Render the enclosing div of the hda body and, if expanded, the html in the body
* @returns {jQuery} rendered DOM
*/
- //TODO: only render these on expansion (or already expanded)
_render_body : function(){
- var body = $( '<div/>' )
+ var $body = $( '<div/>' )
.attr( 'id', 'info-' + this.model.get( 'id' ) )
.addClass( 'historyItemBody' )
.attr( 'style', 'display: none' );
if( this.expanded ){
// only render the body html if it's being shown
- this._render_body_html( body );
- //TODO: switch back when jq -> 1.9
- //body.show();
- body.css( 'display', 'block' );
+ this._render_body_html( $body );
+ $body.show();
}
- return body;
+ return $body;
},
/** Render the (expanded) body of an HDA, dispatching to other functions based on the HDA state
* @param {jQuery} body the body element to append the html to
*/
- //TODO: only render these on expansion (or already expanded)
- _render_body_html : function( body ){
+ _render_body_html : function( $body ){
//this.log( this + '_render_body' );
- body.html( '' );
- //TODO: not a fan of this dispatch
- switch( this.model.get( 'state' ) ){
- case hdaModel.HistoryDatasetAssociation.STATES.NEW :
- this._render_body_new( body );
- break;
- case hdaModel.HistoryDatasetAssociation.STATES.NOT_VIEWABLE :
- this._render_body_not_viewable( body );
- break;
- case hdaModel.HistoryDatasetAssociation.STATES.UPLOAD :
- this._render_body_uploading( body );
- break;
- case hdaModel.HistoryDatasetAssociation.STATES.PAUSED:
- this._render_body_paused( body );
- break;
- case hdaModel.HistoryDatasetAssociation.STATES.QUEUED :
- this._render_body_queued( body );
- break;
- case hdaModel.HistoryDatasetAssociation.STATES.RUNNING :
- this._render_body_running( body );
- break;
- case hdaModel.HistoryDatasetAssociation.STATES.ERROR :
- this._render_body_error( body );
- break;
- case hdaModel.HistoryDatasetAssociation.STATES.DISCARDED :
- this._render_body_discarded( body );
- break;
- case hdaModel.HistoryDatasetAssociation.STATES.SETTING_METADATA :
- this._render_body_setting_metadata( body );
- break;
- case hdaModel.HistoryDatasetAssociation.STATES.EMPTY :
- this._render_body_empty( body );
- break;
- case hdaModel.HistoryDatasetAssociation.STATES.FAILED_METADATA :
- this._render_body_failed_metadata( body );
- break;
- case hdaModel.HistoryDatasetAssociation.STATES.OK :
- this._render_body_ok( body );
- break;
- default:
- //??: no body?
- body.append( $( '<div>Error: unknown dataset state "' + this.model.get( 'state' ) + '".</div>' ) );
+ $body.empty();
+
+ var modelState = this.model.get( 'state' );
+ // cheesy get function by assumed matching name
+ var renderFnName = '_render_body_' + modelState,
+ renderFn = this[ renderFnName ];
+ if( _.isFunction( renderFn ) ){
+ this[ renderFnName ]( $body );
+ } else {
+ $body.append( $( '<div>Error: unknown dataset state "' + this.model.get( 'state' ) + '".</div>' ) );
}
- body.append( '<div style="clear: both"></div>' );
- this._setUpBehaviors( body );
+ $body.append( '<div style="clear: both"></div>' );
+ this._setUpBehaviors( $body );
},
/** Render a new dataset - this should be a transient state that's never shown
@@ -400,15 +371,14 @@
/** Render inaccessible, not-owned by curr user.
* @param {jQuery} parent DOM to which to append this body
*/
- _render_body_not_viewable : function( parent ){
- //TODO: revisit - still showing display, edit, delete (as common) - that CAN'T be right
- parent.append( $( '<div>' + _l( 'You do not have permission to view dataset' ) + '</div>' ) );
+ _render_body_noPermission : function( parent ){
+ parent.append( $( '<div>' + _l( 'You do not have permission to view this dataset' ) + '</div>' ) );
},
/** Render an HDA still being uploaded.
* @param {jQuery} parent DOM to which to append this body
*/
- _render_body_uploading : function( parent ){
+ _render_body_upload : function( parent ){
parent.append( $( '<div>' + _l( 'Dataset is uploading' ) + '</div>' ) );
},
@@ -424,7 +394,8 @@
* @param {jQuery} parent DOM to which to append this body
*/
_render_body_paused: function( parent ){
- parent.append( $( '<div>' + _l( 'Job is paused. Use the history menu to resume' ) + '</div>' ) );
+ parent.append( $( '<div>' + _l( 'Job is paused. '
+ + 'Use the "Resume Paused Jobs" in the history menu to resume' ) + '</div>' ) );
parent.append( this._render_primaryActionButtons( this.defaultPrimaryActionButtonRenderers ));
},
@@ -469,8 +440,6 @@
* @param {jQuery} parent DOM to which to append this body
*/
_render_body_empty : function( parent ){
- //TODO: replace i with dataset-misc-info class
- //?? why are we showing the file size when we know it's zero??
parent.append( $( '<div>' + _l( 'No data' ) + ': <i>' + this.model.get( 'misc_blurb' ) + '</i></div>' ) );
parent.append( this._render_primaryActionButtons( this.defaultPrimaryActionButtonRenderers ));
},
@@ -479,7 +448,6 @@
* @param {jQuery} parent DOM to which to append this body
*/
_render_body_failed_metadata : function( parent ){
- //TODO: the css for this box is broken (unlike the others)
// add a message box about the failure at the top of the body...
parent.append( $( HDABaseView.templates.failedMetadata(
_.extend( this.model.toJSON(), { urls: this.urls } )
@@ -496,7 +464,6 @@
parent.append( this._render_hdaSummary() );
// return shortened form if del'd
- //TODO: is this correct? maybe only on purged
if( this.model.isDeletedOrPurged() ){
parent.append( this._render_primaryActionButtons([
this._render_downloadButton,
@@ -517,44 +484,55 @@
parent.append( this._render_peek() );
},
- // ......................................................................... EVENTS
+ // ......................................................................... events
/** event map */
events : {
+ // expand the body when the title is clicked
'click .historyItemTitle' : 'toggleBodyVisibility'
},
- /** Render an HDA that's done running and where everything worked.
+ /** Show or hide the body/details of an HDA.
+ * note: if the model does not have detailed data, fetch that data before showing the body
* @param {Event} event the event that triggered this (@link HDABaseView#events)
* @param {Boolean} expanded if true, expand; if false, collapse
* @fires body-expanded when a body has been expanded
* @fires body-collapsed when a body has been collapsed
*/
toggleBodyVisibility : function( event, expand ){
- var hdaView = this;
expand = ( expand === undefined )?( !this.body.is( ':visible' ) ):( expand );
if( expand ){
- if( this.model.inReadyState() && !this.model.hasDetails() ){
- var xhr = this.model.fetch();
- xhr.done( function( model ){
- hdaView.expandBody();
- });
- } else {
- this.expandBody();
- }
+ this.expandBody();
} else {
this.collapseBody();
}
},
+ /** Render and show the full, detailed body of this view including extra data and controls.
+ * @fires body-expanded when a body has been expanded
+ */
expandBody : function(){
var hdaView = this;
- hdaView._render_body_html( hdaView.body );
- this.body.slideDown( hdaView.fxSpeed, function(){
- hdaView.expanded = true;
- hdaView.trigger( 'body-expanded', hdaView.model.get( 'id' ) );
- });
+
+ function _renderBodyAndExpand(){
+ hdaView._render_body_html( hdaView.body );
+ hdaView.body.slideDown( hdaView.fxSpeed, function(){
+ hdaView.expanded = true;
+ hdaView.trigger( 'body-expanded', hdaView.model.get( 'id' ) );
+ });
+ }
+ // fetch first if no details in the model
+ if( this.model.inReadyState() && !this.model.hasDetails() ){
+ this.model.fetch().done( function( model ){
+ _renderBodyAndExpand();
+ });
+ } else {
+ _renderBodyAndExpand();
+ }
},
+ /** Hide the body/details of an HDA.
+ * @fires body-collapsed when a body has been collapsed
+ */
collapseBody : function(){
var hdaView = this;
this.body.slideUp( hdaView.fxSpeed, function(){
@@ -563,7 +541,10 @@
});
},
- // ......................................................................... DELETION
+ // ......................................................................... removal
+ /** Remove this view's html from the DOM and remove all event listeners.
+ * @param {Function} callback an optional function called when removal is done
+ */
remove : function( callback ){
var hdaView = this;
this.$el.fadeOut( hdaView.fxSpeed, function(){
@@ -573,7 +554,8 @@
});
},
- // ......................................................................... MISC
+ // ......................................................................... misc
+ /** String representation */
toString : function(){
var modelString = ( this.model )?( this.model + '' ):( '(no model)' );
return 'HDABaseView(' + modelString + ')';
@@ -594,5 +576,5 @@
//==============================================================================
return {
- HDABaseView : HDABaseView,
+ HDABaseView : HDABaseView
};});
diff -r f82bbdc5c22b24d329a6710a20ce4c049f124064 -r 9da06a2f3db4bf535cf179af6ba66b98741e7ea1 static/scripts/mvc/dataset/hda-edit.js
--- a/static/scripts/mvc/dataset/hda-edit.js
+++ b/static/scripts/mvc/dataset/hda-edit.js
@@ -14,7 +14,7 @@
var HDAEditView = hdaBase.HDABaseView.extend( LoggableMixin ).extend(
/** @lends HDAEditView.prototype */{
- // ......................................................................... SET UP
+ // ......................................................................... set up
/** Set up the view, cache url templates, bind listeners.
* Overrides HDABaseView.initialize to change default actions (adding re-run).
* @param {Object} attributes
@@ -43,7 +43,7 @@
//var hdaView = this;
},
- // ......................................................................... RENDER WARNINGS
+ // ......................................................................... render warnings
/** Render any hda warnings including: is deleted, is purged, is hidden.
* Overrides _render_warnings to include links to further actions (undelete, etc.)).
* @returns {Object} the templated urls
@@ -71,13 +71,14 @@
return buttonDiv;
},
+//TODO: move titleButtons into state renderers, remove state checks in the buttons
+
/** Render icon-button to edit the attributes (format, permissions, etc.) this hda.
* @returns {jQuery} rendered DOM
*/
_render_editButton : function(){
// don't show edit while uploading, in-accessible
// DO show if in error (ala previous history panel)
- //TODO??: not viewable/accessible are essentially the same (not viewable set from accessible)
if( ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NEW )
|| ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.UPLOAD )
|| ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NOT_VIEWABLE )
@@ -114,7 +115,6 @@
*/
_render_deleteButton : function(){
// don't show delete if...
- //TODO??: not viewable/accessible are essentially the same (not viewable set from accessible)
if( ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NEW )
|| ( this.model.get( 'state' ) === hdaModel.HistoryDatasetAssociation.STATES.NOT_VIEWABLE )
|| ( !this.model.get( 'accessible' ) ) ){
@@ -147,7 +147,7 @@
return this.deleteButton.render().$el;
},
- // ......................................................................... RENDER BODY
+ // ......................................................................... render body
/** Render the data/metadata summary (format, size, misc info, etc.).
* Overrides _render_hdaSummary to include edit link in dbkey.
* @see HDABaseView#_render_hdaSummary
@@ -158,7 +158,6 @@
// if there's no dbkey and it's editable : pass a flag to the template to render a link to editing in the '?'
if( this.model.get( 'metadata_dbkey' ) === '?'
&& !this.model.isDeletedOrPurged() ){
- //TODO: use HDABaseView and select/replace base on this switch
_.extend( modelData, { dbkey_unknown_and_editable : true });
}
return hdaBase.HDABaseView.templates.hdaSummary( modelData );
@@ -238,10 +237,8 @@
var $icon = this.visualizationsButton.render().$el;
$icon.addClass( 'visualize-icon' ); // needed?
- //TODO: make this more concise
// map a function to each visualization in the icon's attributes
// create a popupmenu from that map
-
/** @inner */
function create_viz_action( visualization ) {
switch( visualization ){
@@ -269,7 +266,6 @@
// >1: Populate menu dict with visualization fns, make the popupmenu
} else {
_.each( visualizations, function( visualization ) {
- //TODO: move to utils
var titleCaseVisualization = visualization.charAt( 0 ).toUpperCase() + visualization.slice( 1 );
popup_menu_dict[ _l( titleCaseVisualization ) ] = create_viz_action( visualization );
});
@@ -334,9 +330,7 @@
/** Render icon-button to load and display tagging html.
* @returns {jQuery} rendered DOM
*/
- //TODO: these should be a sub-MV
_render_tagButton : function(){
- //TODO: check for User
if( !this.hasUser || !this.urls.tags.get ){
this.tagButton = null;
return null;
@@ -354,9 +348,7 @@
/** Render icon-button to load and display annotation html.
* @returns {jQuery} rendered DOM
*/
- //TODO: these should be a sub-MV
_render_annotateButton : function(){
- //TODO: check for User
if( !this.hasUser || !this.urls.annotation.get ){
this.annotateButton = null;
return null;
@@ -370,33 +362,6 @@
return this.annotateButton.render().$el;
},
- // ......................................................................... other elements
- /** Render area to display tags.
- * @returns {jQuery} rendered DOM
- */
-//TODO: into sub-MV
-//TODO: check for User
- _render_tagArea : function(){
- if( !this.urls.tags.set ){ return null; }
- //TODO: move to mvc/tags.js
- return $( HDAEditView.templates.tagArea(
- _.extend( this.model.toJSON(), { urls: this.urls } )
- ).trim() );
- },
-
- /** Render area to display annotation.
- * @returns {jQuery} rendered DOM
- */
-//TODO: into sub-MV
-//TODO: check for User
- _render_annotationArea : function(){
- if( !this.urls.annotation.get ){ return null; }
- //TODO: move to mvc/annotations.js
- return $( HDAEditView.templates.annotationArea(
- _.extend( this.model.toJSON(), { urls: this.urls } )
- ).trim() );
- },
-
// ......................................................................... state body renderers
/** Render an HDA whose job has failed.
* Overrides _render_body_error to prepend error report button to primary actions strip.
@@ -415,7 +380,6 @@
* @see HDABaseView#_render_body_ok
*/
_render_body_ok : function( parent ){
- //TODO: should call super somehow and insert the needed...
// most common state renderer and the most complicated
parent.append( this._render_hdaSummary() );
@@ -451,7 +415,7 @@
parent.append( this._render_peek() );
},
- // ......................................................................... EVENTS
+ // ......................................................................... events
/** event map */
events : {
'click .historyItemTitle' : 'toggleBodyVisibility',
@@ -463,16 +427,28 @@
'click a.icon-button.annotate' : 'loadAndDisplayAnnotation'
},
- // ......................................................................... STATE CHANGES / MANIPULATION
+ /** listener for item purge */
confirmPurge : function _confirmPurge( ev ){
- //TODO: confirm dialog
+//TODO: confirm dialog
this.model.purge({ url: this.urls.purge });
return false;
},
+ // ......................................................................... tags
+ /** Render area to display tags.
+ * @returns {jQuery} rendered DOM
+ */
+//TODO: into sub-MV
+ _render_tagArea : function(){
+ if( !this.hasUser || !this.urls.tags.set ){ return null; }
+ return $( HDAEditView.templates.tagArea(
+ _.extend( this.model.toJSON(), { urls: this.urls } )
+ ).trim() );
+ },
+
/** Find the tag area and, if initial: load the html (via ajax) for displaying them; otherwise, unhide/hide
*/
- //TODO: into sub-MV
+//TODO: into sub-MV
loadAndDisplayTags : function( event ){
//BUG: broken with latest
//TODO: this is a drop in from history.mako - should use MV as well
@@ -508,6 +484,18 @@
}
return false;
},
+
+ // ......................................................................... annotations
+ /** Render area to display annotation.
+ * @returns {jQuery} rendered DOM
+ */
+//TODO: into sub-MV
+ _render_annotationArea : function(){
+ if( !this.hasUser || !this.urls.annotation.get ){ return null; }
+ return $( HDAEditView.templates.annotationArea(
+ _.extend( this.model.toJSON(), { urls: this.urls } )
+ ).trim() );
+ },
/** Find the annotation area and, if initial: load the html (via ajax) for displaying them; otherwise, unhide/hide
*/
@@ -555,7 +543,7 @@
return false;
},
- // ......................................................................... UTILTIY
+ // ......................................................................... misc
/** string rep */
toString : function(){
var modelString = ( this.model )?( this.model + '' ):( '(no model)' );
@@ -678,5 +666,5 @@
//==============================================================================
return {
- HDAEditView : HDAEditView,
+ HDAEditView : HDAEditView
};});
diff -r f82bbdc5c22b24d329a6710a20ce4c049f124064 -r 9da06a2f3db4bf535cf179af6ba66b98741e7ea1 static/scripts/mvc/dataset/hda-model.js
--- a/static/scripts/mvc/dataset/hda-model.js
+++ b/static/scripts/mvc/dataset/hda-model.js
@@ -53,41 +53,42 @@
misc_info : ''
},
- /** fetch location of this history in the api */
+ /** fetch location of this HDA's history in the api */
urlRoot: 'api/histories/',
+ /** full url spec. for this HDA */
url : function(){
return this.urlRoot + this.get( 'history_id' ) + '/contents/' + this.get( 'id' );
},
+ /** controller urls assoc. with this HDA */
urls : function(){
var id = this.get( 'id' );
if( !id ){ return {}; }
var urls = {
- 'delete' : '/datasets/' + id + '/delete_async',
- 'purge' : '/datasets/' + id + '/purge_async',
- 'unhide' : '/datasets/' + id + '/unhide',
- 'undelete' : '/datasets/' + id + '/undelete',
+ 'purge' : galaxy_config.root + 'datasets/' + id + '/purge_async',
- 'display' : '/datasets/' + id + '/display/?preview=True',
- 'download' : '/datasets/' + id + '/display?to_ext=' + this.get( 'file_ext' ),
- 'edit' : '/datasets/' + id + '/edit',
- 'report_error': '/dataset/errors?id=' + id,
- 'rerun' : '/tool_runner/rerun?id=' + id,
- 'show_params': '/datasets/' + id + '/show_params',
- 'visualization': '/visualization',
+ 'display' : galaxy_config.root + 'datasets/' + id + '/display/?preview=True',
+ 'download' : galaxy_config.root + 'datasets/' + id + '/display?to_ext=' + this.get( 'file_ext' ),
+ 'edit' : galaxy_config.root + 'datasets/' + id + '/edit',
+ 'report_error' : galaxy_config.root + 'dataset/errors?id=' + id,
+ 'rerun' : galaxy_config.root + 'tool_runner/rerun?id=' + id,
+ 'show_params' : galaxy_config.root + 'datasets/' + id + '/show_params',
+ 'visualization' : galaxy_config.root + 'visualization',
- 'annotation': { 'get': '/dataset/get_annotation_async?id=' + id,
- 'set': '/dataset/annotate_async?id=' + id },
- 'tags' : { 'get': '/tag/get_tagging_elt_async?item_id=' + id + '&item_class=HistoryDatasetAssociation',
- 'set': '/tag/retag?item_id=' + id + '&item_class=HistoryDatasetAssociation' }
+ 'annotation': { 'get': galaxy_config.root + 'dataset/get_annotation_async?id=' + id,
+ 'set': galaxy_config.root + 'dataset/annotate_async?id=' + id },
+ 'tags' : { 'get': galaxy_config.root + 'tag/get_tagging_elt_async?item_id='
+ + id + '&item_class=HistoryDatasetAssociation',
+ 'set': galaxy_config.root + 'tag/retag?item_id='
+ + id + '&item_class=HistoryDatasetAssociation' }
};
- //'meta_download': '/dataset/get_metadata_file?hda_id=%3C%25%3D+id+%25%3E&metadata_name=%3C%25%3D+file_type+%25%3E',
+ // download links to assoc. metadata files (bam indeces, etc.)
var meta_files = this.get( 'meta_files' );
if( meta_files ){
urls.meta_download = _.map( meta_files, function( meta_file ){
return {
- //url : _.template( urlTemplate, { id: modelJson.id, file_type: meta_file.file_type }),
- url : '/dataset/get_metadata_file?hda_id=' + id + '&metadata_name=' + meta_file.file_type,
+ url : galaxy_config.root + 'dataset/get_metadata_file?hda_id='
+ + id + '&metadata_name=' + meta_file.file_type,
file_type : meta_file.file_type
};
});
@@ -110,6 +111,9 @@
this._setUpListeners();
},
+ /** set up any event listeners
+ * event: state:ready fired when this HDA moves into a ready state
+ */
_setUpListeners : function(){
// if the state has changed and the new state is a ready state, fire an event
this.on( 'change:state', function( currModel, newState ){
@@ -121,8 +125,7 @@
},
// ........................................................................ common queries
- /** Is this hda deleted or purged?
- */
+ /** Is this hda deleted or purged? */
isDeletedOrPurged : function(){
return ( this.get( 'deleted' ) || this.get( 'purged' ) );
},
@@ -132,7 +135,6 @@
* @param {Boolean} show_deleted are we showing deleted hdas?
* @param {Boolean} show_hidden are we showing hidden hdas?
*/
- //TODO: too many 'visible's
isVisible : function( show_deleted, show_hidden ){
var isVisible = true;
if( ( !show_deleted )
@@ -146,6 +148,7 @@
return isVisible;
},
+ /** the more common alias of visible */
hidden : function(){
return !this.get( 'visible' );
},
@@ -158,33 +161,37 @@
return ( this.isDeletedOrPurged() || ready );
},
+ /** Does this model already contain detailed data (as opposed to just summary level data)? */
hasDetails : function(){
//?? this may not be reliable
return _.has( this.attributes, 'genome_build' );
},
- /** Convenience function to match hda.has_data.
- */
+ /** Convenience function to match hda.has_data. */
hasData : function(){
- //TODO:?? is this equivalent to all possible hda.has_data calls?
return ( this.get( 'file_size' ) > 0 );
},
// ........................................................................ ajax
+ /** save this HDA, _Mark_ing it as deleted (just a flag) */
'delete' : function _delete( options ){
return this.save( { deleted: true }, options );
},
+ /** save this HDA, _Mark_ing it as undeleted */
undelete : function _undelete( options ){
return this.save( { deleted: false }, options );
},
+ /** save this HDA as not visible */
hide : function _hide( options ){
return this.save( { visible: false }, options );
},
+ /** save this HDA as visible */
unhide : function _uhide( options ){
return this.save( { visible: true }, options );
},
+ /** purge this HDA and remove the underlying dataset file from the server's fs */
purge : function _purge( options ){
//TODO: ideally this would be a DELETE call to the api
// using purge async for now
@@ -210,10 +217,15 @@
},
// ........................................................................ sorting/filtering
+ /** what attributes of an HDA will be used in a search */
searchKeys : [
'name', 'file_ext', 'genome_build', 'misc_blurb', 'misc_info', 'annotation', 'tags'
],
+ /** search this HDA for the string searchFor
+ * @param {String} searchFor look for this string in all attributes listed in searchKeys (above) using indexOf
+ * @returns {Array} an array of attribute keys where searchFor was found
+ */
search : function( searchFor ){
var model = this;
searchFor = searchFor.toLowerCase();
@@ -223,13 +235,16 @@
});
},
+ /** alias of search, but returns a boolean
+ * @param {String} matchesWhat look for this string in all attributes listed in searchKeys (above) using indexOf
+ * @returns {Boolean} was matchesWhat found in any attributes
+ */
matches : function( matchesWhat ){
return !!this.search( matchesWhat ).length;
},
// ........................................................................ misc
- /** String representation
- */
+ /** String representation */
toString : function(){
var nameAndId = this.get( 'id' ) || '';
if( this.get( 'name' ) ){
@@ -274,6 +289,7 @@
ERROR : 'error'
};
+/** states that are in a final state (the underlying job is complete) */
HistoryDatasetAssociation.READY_STATES = [
HistoryDatasetAssociation.STATES.NEW,
HistoryDatasetAssociation.STATES.OK,
@@ -285,6 +301,7 @@
HistoryDatasetAssociation.STATES.ERROR
];
+/** states that will change (the underlying job is not finished) */
HistoryDatasetAssociation.NOT_READY_STATES = [
HistoryDatasetAssociation.STATES.UPLOAD,
HistoryDatasetAssociation.STATES.QUEUED,
@@ -306,7 +323,10 @@
///** logger used to record this.log messages, commonly set to console */
//// comment this out to suppress log output
//logger : console,
- urlRoot : '/api/histories',
+
+ /** root api url */
+ urlRoot : galaxy_config.root + 'api/histories',
+ /** complete api url */
url : function(){
return this.urlRoot + '/' + this.historyId + '/contents';
},
@@ -331,6 +351,9 @@
return this.map( function( hda ){ return hda.id; });
},
+ /** Get hdas that are not ready
+ * @returns array of HDAs
+ */
notReady : function(){
return this.filter( function( hda ){
return !hda.inReadyState();
@@ -370,11 +393,13 @@
},
// ........................................................................ ajax
+ /** fetch detailed model data for all HDAs in this collection */
fetchAllDetails : function(){
return this.fetch({ data : { details : 'all' } });
},
// ........................................................................ sorting/filtering
+ /** return a new collection of HDAs whose attributes contain the substring matchesWhat */
matches : function( matchesWhat ){
return this.filter( function( hda ){
return hda.matches( matchesWhat );
diff -r f82bbdc5c22b24d329a6710a20ce4c049f124064 -r 9da06a2f3db4bf535cf179af6ba66b98741e7ea1 static/scripts/mvc/history/history-model.js
--- a/static/scripts/mvc/history/history-model.js
+++ b/static/scripts/mvc/history/history-model.js
@@ -13,7 +13,6 @@
*/
var History = Backbone.Model.extend( LoggableMixin ).extend(
/** @lends History.prototype */{
- //TODO: bind change events from items and collection to this (itemLengths, states)
///** logger used to record this.log messages, commonly set to console */
//// comment this out to suppress log output
@@ -31,29 +30,33 @@
},
// ........................................................................ urls
- urlRoot: 'api/histories',
+ urlRoot: galaxy_config.root + 'api/histories',
+ /** url for changing the name of the history */
renameUrl : function(){
//TODO: just use this.save()
var id = this.get( 'id' );
if( !id ){ return undefined; }
- return '/history/rename_async?id=' + this.get( 'id' );
+ return galaxy_config.root + 'history/rename_async?id=' + this.get( 'id' );
},
+ /** url for changing the annotation of the history */
annotateUrl : function(){
var id = this.get( 'id' );
if( !id ){ return undefined; }
- return '/history/annotate_async?id=' + this.get( 'id' );
+ return galaxy_config.root + 'history/annotate_async?id=' + this.get( 'id' );
},
+ /** url for changing the tags of the history */
tagUrl : function(){
var id = this.get( 'id' );
if( !id ){ return undefined; }
- return '/tag/get_tagging_elt_async?item_id=' + this.get( 'id' ) + '&item_class=History';
+ return galaxy_config.root + 'tag/get_tagging_elt_async?item_id=' + this.get( 'id' ) + '&item_class=History';
},
// ........................................................................ set up/tear down
- /** Set up the hdas collection
+ /** Set up the model
* @param {Object} historyJSON model data for this History
* @param {Object[]} hdaJSON array of model data for this History's HDAs
+ * @param {Object} options any extra settings including logger
* @see BaseModel#initialize
*/
initialize : function( historyJSON, hdaJSON, options ){
@@ -69,17 +72,24 @@
}
this._setUpListeners();
- this._installAjaxErrorHandler( this.ajaxErrorHandler );
+ /** cached timeout id for the HDA updater */
+ this.updateTimeoutId = null;
// set up update timeout if needed
this.checkForUpdates();
},
+ /** set up any event listeners for this history including those to the contained HDAs
+ * events: error:hdas if an error occurred with the HDA collection
+ */
_setUpListeners : function(){
+ this.on( 'error', function( model, xhr, options, msg, details ){
+ this.errorHandler( model, xhr, options, msg, details );
+ });
+
// hda collection listening
if( this.hdas ){
this.listenTo( this.hdas, 'error', function(){
- //this.ajaxErrorHandler.apply( this, arguments );
this.trigger.apply( this, [ 'error:hdas' ].concat( jQuery.makeArray( arguments ) ) );
});
}
@@ -105,34 +115,29 @@
// }
//},
+ /** event listener for errors. Generally errors are handled outside this model */
+ errorHandler : function( model, xhr, options, msg, details ){
+ // clear update timeout on model err
+ this.clearUpdateTimeout();
+ },
+
// ........................................................................ common queries
+ /** is this model already associated with a user? */
hasUser : function(){
var user = this.get( 'user' );
return !!( user && user.id );
},
// ........................................................................ ajax
- // override to add ajax error event
- //TODO: into mixin/base
- _installAjaxErrorHandler : function( handler ){
- this.sync = function _sync( method, model, options ){
- return Backbone.Model.prototype.sync.call( model, method, model, options )
- .fail( function( xhr, status, message ){
- handler.call( model, model, xhr, options, method );
- });
- };
- },
-
- ajaxErrorHandler : function( model, xhr, options, method ){
- },
-
- // get the history's state from it's cummulative ds states, delay + update if needed
- // events: ready
+ /** does the HDA collection indicate they're still running and need to be updated later? delay + update if needed
+ * @param {Function} onReadyCallback function to run when all HDAs are in the ready state
+ * events: ready
+ */
checkForUpdates : function( onReadyCallback ){
//console.info( 'checkForUpdates' )
// get overall History state from collection, run updater if History has running/queued hdas
- // boiling it down on the client to running/not
+ // boiling it down on the client to running/not
if( this.hdas.running().length ){
this.setUpdateTimeout();
@@ -145,8 +150,8 @@
return this;
},
+ /** create a timeout (after UPDATE_DELAY or delay ms) to refetch the HDA collection. Clear any prev. timeout */
setUpdateTimeout : function( delay ){
- //TODO: callbacks?
delay = delay || History.UPDATE_DELAY;
var history = this;
@@ -158,6 +163,7 @@
return this.updateTimeoutId;
},
+ /** clear the timeout and the cached timeout id */
clearUpdateTimeout : function(){
if( this.updateTimeoutId ){
clearTimeout( this.updateTimeoutId );
@@ -165,25 +171,26 @@
}
},
- // update this history, find any hda's running/queued, update ONLY those that have changed states,
- // set up to run this again in some interval of time
- // events: ready
+ /* update the HDA collection getting full detailed model data for any hda whose id is in detailIds
+ * set up to run this again in some interval of time
+ * @param {String[]} detailIds list of HDA ids to get detailed model data for
+ * @param {Object} options std. backbone fetch options map
+ */
refresh : function( detailIds, options ){
//console.info( 'refresh:', detailIds, this.hdas );
detailIds = detailIds || [];
options = options || {};
var history = this;
+ // add detailIds to options as CSV string
options.data = options.data || {};
if( detailIds.length ){
options.data.details = detailIds.join( ',' );
}
var xhr = this.hdas.fetch( options );
xhr.done( function( hdaModels ){
- //this.trigger( 'hdas-refreshed', this, hdaModels );
- history.checkForUpdates(function(){
- // fetch the history after an update in order to recalc history size
- //TODO: move to event?
+ history.checkForUpdates( function(){
+ // fetch the history inside onReadyCallback in order to recalc history size
this.fetch();
});
});
@@ -214,7 +221,7 @@
function getHistory( id ){
// get the history data
//return jQuery.ajax( '/generate_json_error' );
- return jQuery.ajax( '/api/histories/' + historyId );
+ return jQuery.ajax( galaxy_config.root + 'api/histories/' + historyId );
}
function countHdasFromHistory( historyData ){
// get the number of hdas accrd. to the history
@@ -232,7 +239,7 @@
hdaDetailIds = hdaDetailIds( historyData );
}
var data = ( hdaDetailIds.length )?( { details : hdaDetailIds.join( ',' ) } ):( {} );
- return jQuery.ajax( '/api/histories/' + historyData.id + '/contents', { data: data });
+ return jQuery.ajax( galaxy_config.root + 'api/histories/' + historyData.id + '/contents', { data: data });
//return jQuery.ajax( '/generate_json_error' );
}
@@ -283,7 +290,7 @@
var HistoryCollection = Backbone.Collection.extend( LoggableMixin ).extend(
/** @lends HistoryCollection.prototype */{
model : History,
- urlRoot : 'api/histories'
+ urlRoot : galaxy_config.root + 'api/histories'
///** logger used to record this.log messages, commonly set to console */
//// comment this out to suppress log output
This diff is so big that we needed to truncate the remainder.
https://bitbucket.org/galaxy/galaxy-central/commits/35a847f0f33d/
Changeset: 35a847f0f33d
Branch: search
User: Kyle Ellrott
Date: 2013-10-25 00:04:33
Summary: Adding missing import
Affected #: 1 file
diff -r 9da06a2f3db4bf535cf179af6ba66b98741e7ea1 -r 35a847f0f33d2944b8033aefeb8d5ef0c734c8c6 lib/galaxy/model/search.py
--- a/lib/galaxy/model/search.py
+++ b/lib/galaxy/model/search.py
@@ -35,7 +35,7 @@
History, Library, LibraryFolder, LibraryDataset,StoredWorkflowTagAssociation,
StoredWorkflow, HistoryTagAssociation,HistoryDatasetAssociationTagAssociation,
ExtendedMetadata, ExtendedMetadataIndex, HistoryAnnotationAssociation, Job, JobParameter,
-JobToInputDatasetAssociation, JobToOutputDatasetAssociation, ToolVersion)
+JobToInputLibraryDatasetAssociation, JobToInputDatasetAssociation, JobToOutputDatasetAssociation, ToolVersion )
from galaxy.util.json import to_json_string
from sqlalchemy import and_
https://bitbucket.org/galaxy/galaxy-central/commits/97cb7306dc34/
Changeset: 97cb7306dc34
User: dannon
Date: 2013-10-25 00:10:01
Summary: Merged in kellrott/galaxy-central/search (pull request #241)
Fixing missing import in search.py
Affected #: 1 file
diff -r bf0057b13f58f5c5438f1a6477b27bfceb14a2ce -r 97cb7306dc345ce5e81861e421c5277701161802 lib/galaxy/model/search.py
--- a/lib/galaxy/model/search.py
+++ b/lib/galaxy/model/search.py
@@ -35,7 +35,7 @@
History, Library, LibraryFolder, LibraryDataset,StoredWorkflowTagAssociation,
StoredWorkflow, HistoryTagAssociation,HistoryDatasetAssociationTagAssociation,
ExtendedMetadata, ExtendedMetadataIndex, HistoryAnnotationAssociation, Job, JobParameter,
-JobToInputDatasetAssociation, JobToOutputDatasetAssociation, ToolVersion)
+JobToInputLibraryDatasetAssociation, JobToInputDatasetAssociation, JobToOutputDatasetAssociation, ToolVersion )
from galaxy.util.json import to_json_string
from sqlalchemy import and_
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: dannon: Strip quota information and url from primary users collection -- not useful, and a ton of extra info that can be attained other ways. Issue deprecation warning with dist.
by commits-noreply@bitbucket.org 24 Oct '13
by commits-noreply@bitbucket.org 24 Oct '13
24 Oct '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/bf0057b13f58/
Changeset: bf0057b13f58
User: dannon
Date: 2013-10-24 21:18:51
Summary: Strip quota information and url from primary users collection -- not useful, and a ton of extra info that can be attained other ways. Issue deprecation warning with dist.
Affected #: 1 file
diff -r 05fb304579771af681eb1a89de633133364c5f7d -r bf0057b13f58f5c5438f1a6477b27bfceb14a2ce lib/galaxy/webapps/galaxy/api/users.py
--- a/lib/galaxy/webapps/galaxy/api/users.py
+++ b/lib/galaxy/webapps/galaxy/api/users.py
@@ -4,7 +4,7 @@
import logging
from paste.httpexceptions import HTTPBadRequest, HTTPNotImplemented
from galaxy import util, web
-from galaxy.web.base.controller import BaseAPIController, url_for
+from galaxy.web.base.controller import BaseAPIController
log = logging.getLogger( __name__ )
@@ -22,27 +22,19 @@
query = trans.sa_session.query( trans.app.model.User )
deleted = util.string_as_bool( deleted )
if deleted:
- route = 'deleted_user'
query = query.filter( trans.app.model.User.table.c.deleted == True )
# only admins can see deleted users
if not trans.user_is_admin():
return []
-
else:
- route = 'user'
query = query.filter( trans.app.model.User.table.c.deleted == False )
# special case: user can see only their own user
if not trans.user_is_admin():
item = trans.user.to_dict( value_mapper={ 'id': trans.security.encode_id } )
- item['url'] = url_for( route, id=item['id'] )
- item['quota_percent'] = trans.app.quota_agent.get_percent( trans=trans )
return [item]
-
for user in query:
item = user.to_dict( value_mapper={ 'id': trans.security.encode_id } )
#TODO: move into api_values
- item['quota_percent'] = trans.app.quota_agent.get_percent( trans=trans )
- item['url'] = url_for( route, id=item['id'] )
rval.append( item )
return rval
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 a link to the repository from the repository dependency when displayed in the tool shed.
by commits-noreply@bitbucket.org 24 Oct '13
by commits-noreply@bitbucket.org 24 Oct '13
24 Oct '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/05fb30457977/
Changeset: 05fb30457977
User: greg
Date: 2013-10-24 20:13:09
Summary: Add a link to the repository from the repository dependency when displayed in the tool shed.
Affected #: 1 file
diff -r 99aa4cab1812998a767e3a26ce727a1ca50e03f8 -r 05fb304579771af681eb1a89de633133364c5f7d templates/webapps/tool_shed/repository/common.mako
--- a/templates/webapps/tool_shed/repository/common.mako
+++ b/templates/webapps/tool_shed/repository/common.mako
@@ -603,9 +603,9 @@
</%def><%def name="render_repository_dependency( repository_dependency, pad, parent, row_counter, row_is_header=False )">
-
<%
from galaxy.util import asbool
+ from tool_shed.util.shed_util_common import get_repository_by_name_and_owner
encoded_id = trans.security.encode_id( repository_dependency.id )
if trans.webapp.name == 'galaxy':
if repository_dependency.tool_shed_repository_id:
@@ -623,14 +623,15 @@
prior_installation_required_str = " <i>(prior install required)</i>"
else:
prior_installation_required_str = ""
-
if trans.webapp.name == 'galaxy':
if row_is_header:
cell_type = 'th'
else:
cell_type = 'td'
else:
+ # We're in the tool shed.
cell_type = 'td'
+ rd = get_repository_by_name_and_owner( trans.app, repository_name, repository_owner )
%><tr class="datasetRow"
%if parent is not None:
@@ -658,7 +659,11 @@
</${cell_type}>
%else:
<td style="padding-left: ${pad+20}px;">
- Repository <b>${repository_name | h}</b> revision <b>${changeset_revision | h}</b> owned by <b>${repository_owner | h}</b>${prior_installation_required_str}
+ %if rd:
+ <a class="view-info" href="${h.url_for( controller='repository', action='view_or_manage_repository', id=trans.security.encode_id( rd.id ), changeset_revision=changeset_revision )}">Repository <b>${repository_name | h}</b> revision <b>${changeset_revision | h}</b> owned by <b>${repository_owner | h}</b></a>${prior_installation_required_str}
+ %else:
+ Repository <b>${repository_name | h}</b> revision <b>${changeset_revision | h}</b> owned by <b>${repository_owner | h}</b>${prior_installation_required_str}
+ %endif
</td>
%endif
</tr>
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