1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/6c269fbd11a4/
Changeset: 6c269fbd11a4
User: carlfeberhard
Date: 2014-01-08 20:40:41
Summary: Functional browser tests: update/fix upload tests
Affected #: 4 files
diff -r 3240786183e464dd9233a7e64eebe06a0fed0172 -r 6c269fbd11a43236a0dd4c7df388125fdaf8962d test/casperjs/modules/historypanel.js
--- a/test/casperjs/modules/historypanel.js
+++ b/test/casperjs/modules/historypanel.js
@@ -33,13 +33,13 @@
// =================================================================== API (external)
// ------------------------------------------------------------------- frame control
-/** Is casper currently 'in' the history frame?
- * @returns {Boolean}
- */
-HistoryPanel.prototype.inFrame = function inFrame(){
- return ( ( this.spaceghost.page.frameName === this.spaceghost.data.selectors.frames.history )
- && ( this.spaceghost.page.frameTitle === this.data.text.frameTitle ) );
-};
+///** Is casper currently 'in' the history frame?
+// * @returns {Boolean}
+// */
+//HistoryPanel.prototype.inFrame = function inFrame(){
+// return ( ( this.spaceghost.page.frameName === this.spaceghost.data.selectors.frames.history )
+// && ( this.spaceghost.page.frameTitle === this.data.text.frameTitle ) );
+//};
/** Hover over an element in the history panel.
* @param {String} selector a css or xpath selector for an historyItemWrapper
@@ -61,36 +61,27 @@
};
// ------------------------------------------------------------------- hdas
-/** Parse the hid and name from an HDA title.
+///** Parse the hid and name from an HDA title.
+// * NOTE: if more than one is found, will return the first found.
+// * @param {String} title the title of the hda
+// * @returns {Object} of the form { hid: <hid>, name: <name> }
+// */
+//HistoryPanel.prototype.hdaHidAndNameFromTitle = function hdaHidAndNameFromTitle( title ){
+// var sep = ': ', split = title.split( sep, 1 );
+// return {
+// name : (( split.length >= 2 )?( split[1] ):( split[0] )),
+// hid : (( split.length >= 2 )?( parseInt( split[0], 10 ) ):( undefined ))
+// };
+//};
+
+/** Find the casper element info of the hda wrapper given the hda title.
* NOTE: if more than one is found, will return the first found.
* @param {String} title the title of the hda
- * @returns {Object} of the form { hid: <hid>, name: <name> }
- */
-HistoryPanel.prototype.hdaHidAndNameFromTitle = function hdaHidAndNameFromTitle( title ){
- var sep = ': ', split = title.split( sep, 1 );
- return {
- name : (( split.length >= 2 )?( split[1] ):( split[0] )),
- hid : (( split.length >= 2 )?( parseInt( split[0], 10 ) ):( undefined ))
- };
-};
-
-/** Find the casper element info of the hda wrapper given the hda title and hid.
- * NOTE: if more than one is found, will return the first found.
- * @param {String} title the title of the hda
- * @param {Int} hid (optional) the hid of the hda to look for
* @returns {Object|null} ElementInfo of the historyItemWrapper found, null if not found
*/
-HistoryPanel.prototype.hdaElementInfoByTitle = function hdaElementInfoByTitle( title, hid ){
- var spaceghost = this.spaceghost,
- titleContains = ( hid !== undefined )?( hid + ': ' + title ):( title );
- //TODO: this would fail if we named/uploaded a file that has quotations -
- // we can use underscore.un/escape to solve that
-
- return spaceghost.jumpToHistory( function getWrapperInfo(){
- var wrapperXpath = xpath( '//span[@class="historyItemTitle" ' +
- 'and contains(text(),"' + titleContains + '")]/../..' );
- return spaceghost.elementInfoOrNull( wrapperXpath );
- });
+HistoryPanel.prototype.hdaElementInfoByTitle = function hdaElementInfoByTitle( title ){
+ var wrapperXpath = xpath( '//span[@class="dataset-name" and contains(text(),"' + title + '")]/../../..' );
+ return this.spaceghost.elementInfoOrNull( wrapperXpath );
};
/** Get the state string of the given hda.
@@ -99,12 +90,10 @@
* @returns {String|undefined} class string of the historyItemWrapper found, undefined if not found or set
*/
HistoryPanel.prototype.getHdaState = function getHdaState( hdaSelector ){
- return this.spaceghost.jumpToHistory( function(){
- var found = null,
- hdaInfo = this.elementInfoOrNull( hdaSelector );
- if( !hdaInfo ){ return undefined; }
- return (( found = hdaInfo.attributes[ 'class' ].match( /historyItem\-(\w+)/ ) )?( found[1] ):( undefined ));
- });
+ var found = null,
+ hdaInfo = this.spaceghost.elementInfoOrNull( hdaSelector );
+ if( !hdaInfo ){ return undefined; }
+ return (( found = hdaInfo.attributes[ 'class' ].match( /state\-(\w+)/ ) )?( found[1] ):( undefined ));
};
/** Get the encoded database/API id of the given hda.
@@ -119,20 +108,20 @@
};
// ------------------------------------------------------------------- step functions
-/** Version of Casper#withFrame for the history iframe.
- * Hopefully will allow easier test transition if/when frames are removed
- * (i.e. -> just call the function).
- * NOTE: is more than one Casper step.
- * @param {Function} then function called when in the history frame
- */
-HistoryPanel.prototype.then = function then( thenFn ){
- if( this.inFrame() ){
- thenFn.call( this.spaceghost );
- } else {
- this.spaceghost.withHistoryPanel( thenFn );
- }
-};
-
+///** Version of Casper#withFrame for the history iframe.
+// * Hopefully will allow easier test transition if/when frames are removed
+// * (i.e. -> just call the function).
+// * NOTE: is more than one Casper step.
+// * @param {Function} then function called when in the history frame
+// */
+//HistoryPanel.prototype.then = function then( thenFn ){
+// if( this.inFrame() ){
+// thenFn.call( this.spaceghost );
+// } else {
+// this.spaceghost.withHistoryPanel( thenFn );
+// }
+//};
+//
/** Moves into history iframe and waits until hdas are visible or empty message is.
* NOTE: is more than one Casper step.
* @see Casper@waitFor
@@ -140,13 +129,13 @@
HistoryPanel.prototype.waitForHdas = function waitForHdas( then, timeout, maxWait ){
//TODO:?? should this wait until the seletors are in AND they are opaque?
var spaceghost = this.spaceghost;
- this.then( function waitingForHdas(){
+ spaceghost.then( function waitingForHdas(){
this.waitFor(
function checkHpanel(){
- // trying a subtitle opacity test for page.isloaded
var subtitleOpacity = this.evaluate( function( selector ){
return $( selector ).css( 'opacity' );
}, this.historypanel.data.selectors.history.subtitle );
+ // wait until the subtitle is faded in and either the hdas or the empty history msg is displayed
return ( subtitleOpacity !== 1
&& ( ( this.visible( this.historypanel.data.selectors.hda.wrapper.itemClass ) )
||( this.visible( this.historypanel.data.selectors.history.emptyMsg ) ) ) );
@@ -218,7 +207,7 @@
var hpanel = this,
spaceghost = this.spaceghost;
- this.then( function(){
+ this.spaceghost.then( function(){
// get initial state, cache old timeout, set new timeout
var prevState = hpanel.getHdaState( hdaSelector ),
oldWaitTimeout = spaceghost.options.waitTimeout;
@@ -356,39 +345,39 @@
},
selectors : {
history : {
- name : 'div#history-name',
- subtitle : 'div#history-subtitle-area',
- tagIcon : '#history-tag.icon-button',
- tagArea : '#history-tag-area',
- annoIcon : '#history-annotate.icon-button',
- annoArea : '#history-annotation-area',
- // weak
- emptyMsg : '.infomessagesmall',
- undeleteLink : '.historyItemUndelete',
- hdaContainer : '.history-datasets-list'
+ title : '.history-title',
+ name : '.history-title .history-name',
+ subtitle : '.history-subtitle',
+ tagIcon : '.history-secondary-actions .history-tag-btn',
+ tagArea : '.history-controls .tags-display',
+ annoIcon : '.history-secondary-actions .history-annotate-btn',
+ annoArea : '.history-controls .annotation-display',
+ emptyMsg : '.empty-history-message',
+ hdaContainer: '.datasets-list'
+ //undeleteLink : '.historyItemUndelete',
},
hda : {
wrapper : {
- itemClass : '.historyItem',
+ itemClass : '.hda',
stateClasses : {
- prefix : 'historyItem-',
- ok : 'historyItem-ok',
- 'new' : 'historyItem-new'
+ prefix : 'state-',
+ ok : 'state-ok',
+ 'new' : 'state-new'
}
},
errorMessage : '.errormessagesmall',
- title : '.historyItemTitle',
- titleButtonArea : '.historyItemButtons',
- body : '.historyItemBody',
- summary : '.hda-summary',
- dbkey : '.metadata-dbkey',
- info : '.hda-info',
+ title : '.dataset-title',
+ titleButtonArea : '.dataset-primary-actions',
+ summary : '.dataset-summary',
+ dbkey : '.dataset-dbkey',
+ info : '.dataset-info',
+ body : '.dataset-body',
primaryActionButtons : 'div[id^="primary-actions"]',
secondaryActionButtons : 'div[id^="secondary-actions"]',
- peek : 'pre.peek'
+ peek : '.dataset-peek'
}
},
labels : {
@@ -399,7 +388,7 @@
},
text : {
windowTitle : 'History',
- frameTitle : 'Galaxy History',
+ //frameTitle : 'Galaxy History',
anonymous : {
tooltips : {
name : 'You must be logged in to edit your history name'
diff -r 3240786183e464dd9233a7e64eebe06a0fed0172 -r 6c269fbd11a43236a0dd4c7df388125fdaf8962d test/casperjs/modules/tools.js
--- a/test/casperjs/modules/tools.js
+++ b/test/casperjs/modules/tools.js
@@ -89,7 +89,7 @@
// click the upload tool
spaceghost.thenOpen( spaceghost.baseUrl, function(){
// we can apprently click a tool label without expanding the tool container for it
- this.clickLabel( spaceghost.data.labels.tools.upload.panelLabel );
+ this.click( xpath( '//a[contains(text(),"Upload File")]' ) );
this.jumpToMain( function(){
this.waitForSelector( 'body' );
});
@@ -108,7 +108,7 @@
// wait for main panel, history reload
////NOTE!: assumes tool execution reloads the history panel
- this.waitForMultipleNavigation( [ 'tool_runner/upload_async_message', 'history' ],
+ this.waitForMultipleNavigation( [ 'tool_runner/upload_async_message' ],
function thenAfterUploadRefreshes(){
// debugging
this.jumpToMain( function(){
diff -r 3240786183e464dd9233a7e64eebe06a0fed0172 -r 6c269fbd11a43236a0dd4c7df388125fdaf8962d test/casperjs/spaceghost.js
--- a/test/casperjs/spaceghost.js
+++ b/test/casperjs/spaceghost.js
@@ -626,15 +626,6 @@
// ------------------------------------------------------------------- iframes, damnable iframes
-/** Version of Casper#withFrame for the history iframe.
- * Hopefully will allow easier test transition if/when frames are removed
- * (i.e. -> just call the function).
- * @param {Function} then function called when in the history frame
- */
-SpaceGhost.prototype.withHistoryPanel = function withHistoryPanel( then ){
- return this.withFrame( this.data.selectors.frames.history, then );
-};
-
/** Version of Casper#withFrame for the main iframe.
* @param {Function} then function called when in the frame
*/
@@ -671,14 +662,14 @@
return returned;
};
-/** Jumps into history frame, exectutes fn, and jumps back to original frame.
- * @param {Selector} frame the selector for the frame to jump to
- * @param {Function} fn function called when in the frame
- * @returns {Any} the return value of fn
- */
-SpaceGhost.prototype.jumpToHistory = function jumpToHistory( fn ){
- return this.jumpToFrame( this.data.selectors.frames.history, fn );
-};
+///** Jumps into history frame, exectutes fn, and jumps back to original frame.
+// * @param {Selector} frame the selector for the frame to jump to
+// * @param {Function} fn function called when in the frame
+// * @returns {Any} the return value of fn
+// */
+//SpaceGhost.prototype.jumpToHistory = function jumpToHistory( fn ){
+// return this.jumpToFrame( this.data.selectors.frames.history, fn );
+//};
/** Jumps into main frame, exectutes fn, and jumps back to original frame.
* @param {Selector} frame the selector for the frame to jump to
diff -r 3240786183e464dd9233a7e64eebe06a0fed0172 -r 6c269fbd11a43236a0dd4c7df388125fdaf8962d test/casperjs/upload-tests.js
--- a/test/casperjs/upload-tests.js
+++ b/test/casperjs/upload-tests.js
@@ -59,7 +59,6 @@
var filename = '1.txt',
filepath = this.options.scriptDir + '/../../test-data/' + filename;
-
this.tools._uploadFile( filepath );
// when an upload begins successfully main should reload with a infomessagelarge
@@ -83,6 +82,7 @@
this.test.fail( 'Could not locate new hda: ' + testUploadInfo.name );
} else {
+ spaceghost.debugElement( spaceghost.jsonStr( hdaInfo ) );
this.historypanel.waitForHdaState( '#' + hdaInfo.attributes.id, 'ok',
function whenInStateFn( newHdaInfo ){
//this.debug( 'newHdaInfo:\n' + this.jsonStr( newHdaInfo ) );
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.
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/613f3d93261b/
Changeset: 613f3d93261b
User: inithello
Date: 2014-01-08 18:20:41
Summary: Fix error when time_last_tested has a None value.
Affected #: 1 file
diff -r 709c4b85bc411e5424c9536435d76fa4ee62781e -r 613f3d93261b282d6260b09100ffd5d3be3ff7dc lib/galaxy/webapps/tool_shed/model/__init__.py
--- a/lib/galaxy/webapps/tool_shed/model/__init__.py
+++ b/lib/galaxy/webapps/tool_shed/model/__init__.py
@@ -275,7 +275,8 @@
rval = super( RepositoryMetadata, self ).to_dict( view=view, value_mapper=value_mapper )
if 'time_last_tested' in rval:
time_last_tested = rval[ 'time_last_tested' ]
- rval[ 'time_last_tested' ] = time_last_tested.isoformat()
+ if time_last_tested is not None:
+ rval[ 'time_last_tested' ] = time_last_tested.isoformat()
return rval
https://bitbucket.org/galaxy/galaxy-central/commits/725010d022f3/
Changeset: 725010d022f3
User: inithello
Date: 2014-01-08 18:27:14
Summary: When a push is received in the hg controller, update the repository on disk after the push is complete.
Affected #: 1 file
diff -r 613f3d93261b282d6260b09100ffd5d3be3ff7dc -r 725010d022f3dae2400fab9d009b3d65af70f440 lib/galaxy/webapps/tool_shed/controllers/hg.py
--- a/lib/galaxy/webapps/tool_shed/controllers/hg.py
+++ b/lib/galaxy/webapps/tool_shed/controllers/hg.py
@@ -2,6 +2,7 @@
from galaxy import web
from galaxy.web.base.controller import BaseUIController
from tool_shed.util.shed_util_common import get_repository_by_name_and_owner
+from tool_shed.util.shed_util_common import update_repository
from tool_shed.util.metadata_util import set_repository_metadata
from galaxy import eggs
@@ -9,6 +10,8 @@
import mercurial.__version__
from mercurial.hgweb.hgwebdir_mod import hgwebdir
from mercurial.hgweb.request import wsgiapplication
+from mercurial import hg
+from mercurial import ui
log = logging.getLogger(__name__)
@@ -36,6 +39,11 @@
repository = get_repository_by_name_and_owner( trans.app, name, owner )
if repository:
if hg_version >= '2.2.3':
+ # Update the repository on disk to the tip revision, because the web upload form uses the on-disk working
+ # directory. If the repository is not updated on disk, pushing from the command line and then uploading
+ # via the web interface will result in a new head being created.
+ repo = hg.repository( ui.ui(), repository.repo_path( trans.app ) )
+ update_repository( repo, ctx_rev=None )
# Set metadata using the repository files on disk.
error_message, status = set_repository_metadata( trans, repository )
if status == 'ok' and error_message:
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 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/709c4b85bc41/
Changeset: 709c4b85bc41
User: greg
Date: 2014-01-08 16:10:05
Summary: Retain and display more errors if they occurred during repository creation and population when importing a repository capsule into a tool shed.
Affected #: 1 file
diff -r 796cf860956c4f61b873335e502a8db4a0d7e951 -r 709c4b85bc411e5424c9536435d76fa4ee62781e lib/tool_shed/util/repository_maintenance_util.py
--- a/lib/tool_shed/util/repository_maintenance_util.py
+++ b/lib/tool_shed/util/repository_maintenance_util.py
@@ -154,6 +154,9 @@
# Populate the new repository with the contents of exported repository archive.
results_dict = import_util.import_repository_archive( trans, repository, repository_archive_dict )
ok = results_dict.get( 'ok', False )
+ error_message = results_dict.get( 'error_message', '' )
+ if error_message:
+ results_message += error_message
import_results_tups.append( ( ok, ( str( name ), str( username ) ), results_message ) )
else:
# The repository either already exists in this Tool Shed or the current user is not authorized to create it.
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 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/af196ff2cc63/
Changeset: af196ff2cc63
User: greg
Date: 2014-01-08 15:25:17
Summary: Fixes for comparing datetime values in the tool shed's install and test framework.
Affected #: 2 files
diff -r 6aeb657bc40ee0884f538308e1bfbec0b197c44b -r af196ff2cc63fcc59b07c1579891ffe7bed2013a lib/galaxy/webapps/tool_shed/model/__init__.py
--- a/lib/galaxy/webapps/tool_shed/model/__init__.py
+++ b/lib/galaxy/webapps/tool_shed/model/__init__.py
@@ -271,6 +271,13 @@
return True
return False
+ def to_dict( self, view='collection', value_mapper=None ):
+ rval = super( RepositoryMetadata, self ).to_dict( view=view, value_mapper=value_mapper )
+ if 'time_last_tested' in rval:
+ time_last_tested = rval[ 'time_last_tested' ]
+ rval[ 'time_last_tested' ] = time_last_tested.isoformat()
+ return rval
+
class SkipToolTest( object, Dictifiable ):
dict_collection_visible_keys = ( 'id', 'repository_metadata_id', 'initial_changeset_revision' )
diff -r 6aeb657bc40ee0884f538308e1bfbec0b197c44b -r af196ff2cc63fcc59b07c1579891ffe7bed2013a test/install_and_test_tool_shed_repositories/base/util.py
--- a/test/install_and_test_tool_shed_repositories/base/util.py
+++ b/test/install_and_test_tool_shed_repositories/base/util.py
@@ -898,16 +898,16 @@
log.debug( 'due to the following error getting tool_test_results:\n%s' % str( error_message ) )
else:
# Check the required repository's time_last_tested value to see if its tool_test_results column
- # has been updated within the past 12 hours.
- """
- twelve_hours_ago = datetime.utcnow() - timedelta( hours=12 )
+ # has been updated within the past 12 hours. The RepositoryMetadata class's to_dict() method
+ # returns the value of time_last_tested in datetime.isoformat().
+ twelve_hours_ago = ( datetime.utcnow() - timedelta( hours=12 ) ).isoformat()
time_last_tested, error_message = get_time_last_tested( galaxy_tool_shed_url, repository_metadata_id )
if time_last_tested is not None and time_last_tested < twelve_hours_ago:
log.debug( 'The install containers for version %s of repository dependency %s owned by %s have been ' % \
( changeset_revision, name, owner ) )
log.debug( 'populated within the past 12 hours (likely in this test run), so skipping this check.' )
continue
- if time_last_tested is None:
+ elif time_last_tested is None:
log.debug( 'The time_last_tested column value is None for version %s of repository dependency %s owned by %s.' % \
( changeset_revision, name, owner ) )
elif time_last_tested < twelve_hours_ago:
@@ -916,7 +916,6 @@
else:
log.debug( 'Version %s of repository dependency %s owned by %s was last tested more than 12 hours ago.' % \
( changeset_revision, name, owner ) )
- """
# Inspect the tool_test_results_dict for the last test run to see if it has not yet been populated.
if len( tool_test_results_dicts ) == 0:
tool_test_results_dict = {}
@@ -977,8 +976,8 @@
else:
log.debug( 'Cannot retrieve revision %s of required repository %s owned by %s from the database ' % \
( changeset_revision, name, owner ) )
- log.debug( 'so tool_test_results cannot be saved.' )
- log.debug( 'The attributes used to retrieve the record are:\n' )
+ log.debug( 'so tool_test_results cannot be saved at this time.' )
+ log.debug( 'The attributes used to retrieve the record are:' )
log.debug( 'tool_shed: %s name: %s owner: %s changeset_revision: %s' % \
( cleaned_tool_shed_url, name, owner, changeset_revision ) )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/6aeb657bc40e/
Changeset: 6aeb657bc40e
User: greg
Date: 2014-01-08 03:50:02
Summary: Eliminate comparison of times tested in the tool shed's install and test framework.
Affected #: 1 file
diff -r 478c60421dd9a71422d98ee2ada8043bf53ffeef -r 6aeb657bc40ee0884f538308e1bfbec0b197c44b test/install_and_test_tool_shed_repositories/base/util.py
--- a/test/install_and_test_tool_shed_repositories/base/util.py
+++ b/test/install_and_test_tool_shed_repositories/base/util.py
@@ -899,6 +899,7 @@
else:
# Check the required repository's time_last_tested value to see if its tool_test_results column
# has been updated within the past 12 hours.
+ """
twelve_hours_ago = datetime.utcnow() - timedelta( hours=12 )
time_last_tested, error_message = get_time_last_tested( galaxy_tool_shed_url, repository_metadata_id )
if time_last_tested is not None and time_last_tested < twelve_hours_ago:
@@ -915,6 +916,7 @@
else:
log.debug( 'Version %s of repository dependency %s owned by %s was last tested more than 12 hours ago.' % \
( changeset_revision, name, owner ) )
+ """
# Inspect the tool_test_results_dict for the last test run to see if it has not yet been populated.
if len( tool_test_results_dicts ) == 0:
tool_test_results_dict = {}
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 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/478c60421dd9/
Changeset: 478c60421dd9
User: greg
Date: 2014-01-08 03:37:17
Summary: Don't map the time_last_tested column in the tool shed API.
Affected #: 1 file
diff -r 2a23dec18caabf3e326447db7eabd0b2d963fef4 -r 478c60421dd9a71422d98ee2ada8043bf53ffeef 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
@@ -1,6 +1,5 @@
import datetime
import logging
-from galaxy.web.framework.helpers import time_ago
from tool_shed.util import metadata_util
from galaxy import web
from galaxy import util
@@ -234,8 +233,4 @@
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:
- # For some reason the Dictifiable.to_dict() method in ~/galaxy/model/item_attrs.py requires
- # a function rather than a mapped value, so just pass the time_ago function here.
- value_mapper[ 'time_last_tested' ] = time_ago
return value_mapper
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.