Merge branch 'dev' into ui_pref_routing

This commit is contained in:
guerler
2017-03-09 13:45:15 -05:00
68 changed files with 2146 additions and 197 deletions
@@ -43,6 +43,12 @@ HDAListItemView.prototype.templates = (function(){
'<span class="hid"><%- dataset.hid %></span> ',
'<span class="name"><%- dataset.name %></span>',
'</div>',
'</br>',
'<span class="nametags">',
'<% _.each(dataset.nametags, function(tag){ %>',
'<span class="label label-info"><%- tag %></span>',
'<% }); %>',
'</span>',
'</div>'
], 'dataset' );
@@ -221,7 +221,8 @@ var View = Backbone.View.extend({
hid : item.hid,
keep : item.keep,
label: item.hid + ': ' + item.name,
value: item.id
value: item.id,
tags : item.tags
});
self.history[ item.id + '_' + src ] = item;
});
@@ -109,6 +109,11 @@ var View = Backbone.View.extend({
}
},
/** Matches a search term with a given text */
_match: function( term, text ) {
return !term || term == '' || String( text ).toUpperCase().indexOf( term.toUpperCase() ) >= 0
},
/** Updates the selection options */
_changeData: function() {
var self = this;
@@ -125,22 +130,44 @@ var View = Backbone.View.extend({
if ( this.model.get( 'searchable' ) ) {
this.data2 = [];
_.each( this.data, function( option, index ) {
self.data2.push( { order: index, id: option.value, text: option.label } );
self.data2.push( { order: index, id: option.value, text: option.label, tags: option.tags } );
});
this.$select.data( 'select2' ) && this.$select.select2( 'destroy' );
this.matched_tags = {};
this.$select.select2({
data : self.data2,
closeOnSelect : !this.model.get( 'multiple' ),
multiple : this.model.get( 'multiple' ),
query : function( q ) {
self.matched_tags = {};
var pagesize = self.model.get( 'pagesize' );
var results = _.filter( self.data2, function ( e ) {
return !q.term || q.term == '' || e.text.toUpperCase().indexOf( q.term.toUpperCase() ) >= 0;
var found = false;
_.each( e.tags, function( tag ) {
if ( self._match( q.term, tag ) ) {
found = self.matched_tags[ tag ] = true;
}
});
return found || self._match( q.term, e.text );
});
q.callback({
results: results.slice( ( q.page - 1 ) * pagesize, q.page * pagesize ),
more : results.length >= q.page * pagesize
});
},
formatResult : function( result ) {
return _.escape( result.text ) +
'<div class="ui-tags">' +
_.reduce( result.tags, function( memo, tag ) {
if ( self.matched_tags[ tag ] ) {
return memo + '&nbsp;' +
'<div class="label label-info">' +
_.escape( tag ) +
'</div>'
}
return memo;
}, '' ) +
'</div>';
}
});
this.$( '.select2-container .select2-search input' ).off( 'blur' );
@@ -106,7 +106,7 @@ define( [ 'utils/utils' ], function( Utils ) {
_templateRow: function( options ) {
return '<tr class="upload-ftp-row">' +
'<td class="_has_collection" style="display: none;"><div class="icon"/></td>' +
'<td class="ftp-name">' + options.path + '</td>' +
'<td class="ftp-name">' + _.escape(options.path) + '</td>' +
'<td class="ftp-size">' + Utils.bytesToString( options.size ) + '</td>' +
'<td class="ftp-time">' + options.ctime + '</td>' +
'</tr>';
+1
View File
@@ -18,6 +18,7 @@ window.async_save_text = require( 'utils/async-save-text' );
var POPUPMENU = require( 'ui/popupmenu' );
window.make_popupmenu = POPUPMENU.make_popupmenu;
window.make_popup_menus = POPUPMENU.make_popup_menus;
window.toolform = require( 'mvc/tool/tool-form' );
window.init_tag_click_function = require( 'ui/autocom_tagging' );
var TOURS = require( 'mvc/tours' );
var QUERY_STRING = require( 'utils/query-string-parsing' );
+7
View File
@@ -221,6 +221,13 @@
}
}
}
span.nametags {
span.label {
display: inline-block;
margin-right: 2px;
text-decoration: none;
}
}
}
}
+5
View File
@@ -68,6 +68,11 @@
font-weight: bold;
}
.ui-tags {
word-wrap: break-word;
padding-right: 25px;
}
.ui-message {
padding: 2px 10px 2px 10px;
margin-top: @ui-margin-vertical-large;
+4
View File
@@ -598,6 +598,10 @@
<datatype extension="maskinfo-asn1-binary" type="galaxy.datatypes.binary:GenericAsn1Binary" mimetype="application/octet-stream" subclass="true" display_in_upload="true" />
<datatype extension="pssm-asn1" type="galaxy.datatypes.data:GenericAsn1" mimetype="text/plain" subclass="true" display_in_upload="true" />
<!-- PlantTribes datatypes -->
<datatype extension="ptalign" type="galaxy.datatypes.text:PlantTribesMultipleSequenceAlignment" />
<datatype extension="ptortho" type="galaxy.datatypes.text:PlantTribesOrtho" />
<datatype extension="ptorthocs" type="galaxy.datatypes.text:PlantTribesOrthoCodingSequence" />
<datatype extension="pttree" type="galaxy.datatypes.text:PlantTribesPhylogeneticTree" />
<datatype extension="smat" type="galaxy.datatypes.text:Smat" display_in_upload="true" />
</registration>
<sniffers>
+11 -1
View File
@@ -355,6 +355,16 @@ paste.app_factory = galaxy.web.buildapp:app_factory
# separated list.
#interactive_environment_plugins_directory =
# To run interactive environment containers in Docker Swarm mode (on an
# existing swarm), set this option to True and set `docker_connect_port` in the
# IE plugin config (ini) file(s) of any IE plugins you have enabled and ensure
# that you are not using any `docker run`-specific options in your plugins'
# `command_inject` options (swarm mode services run using `docker service
# create`, which has a different and more limited set of options). This option
# can be overridden on a per-plugin basis by using the `swarm_mode` option in
# the plugin's ini config file.
#interactive_environment_swarm_mode = False
# Interactive tour directory: where to store interactive tour definition files.
# Galaxy ships with several basic interface tours enabled, though a different
# directory with custom tours can be specified here. The path is relative to the
@@ -1191,7 +1201,7 @@ use_interactive = True
# walltime limits but did fail quickly (either while queueing or running). The
# commented out default below results in no default job resubmission condition,
# failing jobs are just failed outright.
#default_job_resubmission_condition =
#default_job_resubmission_condition =
# In multiprocess configurations, notification between processes about new jobs
# must be done via the database. In single process configurations, this can be
@@ -41,3 +41,15 @@ image = qiaoy/iobio-bundle.bam-iobio:1.0-ondemand
# share data between the IE and Galaxy.
#docker_galaxy_temp_dir = None
# If your Docker container exposes more then one port, Galaxy needs to know to
# which ports it needs to connect. With this option you can specify the port number
# inside your container to which Galaxy should connect the UI.
#docker_connect_port = None
# To run containers in Docker Swarm mode on (an existing swarm), set the
# following option to True *and*:
# - set docker_connect_port above. For qiaoy/iobio-bundle.bam-iobio the port
# should most likely be 8000.
# - If command_inject is uncommented and includes `--sig-proxy`, that option should
# be removed.
#swarm_mode = False
@@ -18,7 +18,7 @@
# The image argument was moved to "allowed_images.yml.sample"
# Additional arguments that are passed to the `docker run` command.
command_inject = --sig-proxy=true -e DEBUG=false -e DEFAULT_CONTAINER_RUNTIME=120
#command_inject = --sig-proxy=true -e DEBUG=false -e DEFAULT_CONTAINER_RUNTIME=120
# URL to access the Galaxy API with from the spawn Docker containter, if empty
# this falls back to galaxy.ini's galaxy_infrastructure_url and finally to the
@@ -43,4 +43,12 @@ command_inject = --sig-proxy=true -e DEBUG=false -e DEFAULT_CONTAINER_RUNTIME=12
# If your Docker container exposes more then one port, Galaxy needs to know to
# which ports it needs to connect. With this option you can specify the port number
# inside your container to which Galaxy should connect the UI.
# docker_connect_port = None
#docker_connect_port = None
# To run containers in Docker Swarm mode on (an existing swarm), set the
# following option to True *and*:
# - set docker_connect_port above. For Jupyter the # port should most likely be
# 8888.
# - If command_inject is uncommented and includes `--sig-proxy`, that option should
# be removed.
#swarm_mode = False
@@ -40,3 +40,16 @@ command_inject = --sig-proxy=true -e DEBUG=false -e DEFAULT_CONTAINER_RUNTIME=12
# you can have a shared sshfs share which you can use as temporary directory to
# share data between the IE and Galaxy.
#docker_galaxy_temp_dir = None
# If your Docker container exposes more then one port, Galaxy needs to know to
# which ports it needs to connect. With this option you can specify the port number
# inside your container to which Galaxy should connect the UI.
#docker_connect_port = None
# To run containers in Docker Swarm mode on (an existing swarm), set the
# following option to True *and*:
# - set docker_connect_port above. For thoba/neo4j_galaxy_ie the port
# should most likely be 7474.
# - If command_inject is uncommented and includes `--sig-proxy`, that option should
# be removed.
#swarm_mode = False
@@ -19,3 +19,16 @@ image = shiltemann/docker-phinch-galaxy:16.04
# The Docker hostname. It can be useful to run the Docker daemon on a different
# host than Galaxy.
#docker_hostname = localhost
# If your Docker container exposes more then one port, Galaxy needs to know to
# which ports it needs to connect. With this option you can specify the port number
# inside your container to which Galaxy should connect the UI.
#docker_connect_port = None
# To run containers in Docker Swarm mode on (an existing swarm), set the
# following option to True *and*:
# - set docker_connect_port above. For shiltemann/docker-phinch-galaxy the port
# should most likely be 80.
# - If command_inject is uncommented and includes `--sig-proxy`, that option should
# be removed.
#swarm_mode = False
@@ -41,3 +41,16 @@ password_auth = True
# you can have a shared sshfs share which you can use as temporary directory to
# share data between the IE and Galaxy.
#docker_galaxy_temp_dir = None
# If your Docker container exposes more then one port, Galaxy needs to know to
# which ports it needs to connect. With this option you can specify the port number
# inside your container to which Galaxy should connect the UI.
#docker_connect_port = None
# To run containers in Docker Swarm mode on (an existing swarm), set the
# following option to True *and*:
# - set docker_connect_port above. For erasche/docker-rstudio-notebook the port
# should most likely be 80.
# - If command_inject is uncommented and includes `--sig-proxy`, that option should
# be removed.
#swarm_mode = False
@@ -0,0 +1,22 @@
name: searchover
type:
- masthead
activate: true
icon: fa-search
tooltip: Click to activate search and press Ctrl + Alt + q to open the overlay
function: >
$.getJSON("/api/webhooks", function( data ) {
for( var item in data ) {
var webhook = data[item];
if( webhook.name === "searchover" ) {
if( webhook.script && !window.static_search ) {
$( '<script/>', { type: 'text/javascript' } ).text( webhook.script ).appendTo( 'head' );
$( '<style/>', { type: 'text/css' } ).text( webhook.styles ).appendTo( 'head' );
window.static_search = true;
}
break;
}
}
});
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,177 @@
.overlay-wrapper {
margin-top: -5%;
}
.search-screen {
position: fixed;
z-index: 202;
width:100%;
height:100%;
display:none;
}
.search-screen-overlay {
position: fixed;
top:0;
left:0;
background: rgba(224, 224, 224, 0.75);
z-index: 201;
width:100%;
height:100%;
display:none;
opacity: 2;
}
.overlay-filters {
display: table;
margin: 0 auto 5px;
}
.overlay-filters ul {
list-style-type: none;
margin: 0;
padding: 0;
overflow: hidden;
}
.overlay-filters li {
float: left;
}
.overlay-filters li a {
display: block;
text-decoration: none;
cursor: pointer;
font-weight: bold;
padding: 5px 5px;
}
.overlay-filters li a:hover i {
color: #212121;
}
.overlay-filters li a i {
font-size: 1.5em;
}
.search-header {
background-color: #e1e1e1;
background: -moz-linear-gradient(top, rgba(225, 225, 225, 1) 0%, rgba(238, 238, 238, 1) 37%, rgba(225, 225, 225, 1) 100%);
background: linear-gradient(to bottom, rgba(225, 225, 225, 1) 0%, rgba(238, 238, 238, 1) 37%, rgba(225, 225, 225, 1) 100%);
-moz-box-shadow: 0px 2px 5px 0px rgba(158, 158, 158, 0.75);
box-shadow: 0px 2px 5px 0px rgba(158, 158, 158, 0.75);
position: fixed;
top: 34px;
width: 100%;
z-index: 203;
}
.txtbx-search-data {
font-size: 12px;
text-align: center;
border-radius: 14px;
border: 1px solid #2c3143;
margin: 20px auto 10px;
width: 300px;
padding: 11px;
}
.search-section {
color: #007AB5;
margin-top: 20px;
font-weight: bold;
}
.search-section .section-title {
margin-left: 7px;
}
.link-tile {
background-color: #0070A8;
border: 1px solid #005A85;
border-radius: 5px;
font-size: 12px;
width: 19%;
height: 75px;
margin: 0.5%;
padding: 5px;
}
.link-tile.btn-primary:hover,
.link-tile.btn-primary:hover {
background-color: #005A85;
border-color: #005A85;
}
.link-tile.btn-primary:active,
.link-tile.btn-primary:focus {
background-color: #005A85;
border-color: #005A85;
}
.search-results,
.removed-items {
position: fixed;
top: 125px;
overflow-x: hidden;
overflow-y: auto;
padding: 0 15px;
width: 100%;
height: 83%;
display: none;
}
.item-actions {
padding: 5px;
}
.item-actions:hover {
color: gold;
}
.pin-item {
float: left;
}
.restore-item,
.remove-fav,
.remove-item {
float: right;
}
.filter-active i {
/*color: gold;*/
color: #616161;
}
.filter-active i:hover {
color: #212121;
}
.filter-inactive i {
font-size: 0.875em;
color: #9e9e9e;
}
.rotate {
transform: rotate(90deg);
}
.pinned-item {
color: gold;
transform: rotate(60deg);
}
.hide {
display: none;
}
.show {
display: block;
}
.no-results {
color: white;
margin-top: 0.8%;
}
+24
View File
@@ -0,0 +1,24 @@
#!/bin/bash
#
# When running Galaxy Interactive Environments on a swarm (using Docker Engine
# swarm mode), GIE sessions that have ended will leave behind "shut down"
# Docker services. These must be removed, which you can do with this script.
#
# Note that this is dependent on the specific ordering and output format of
# `docker service ls` and `docker service ps`. As of the time of writing
# (Docker version 1.13.1) these formats cannot be controlled as can be done
# with `docker ps` and the `--format` option, so be careful when upgrading
# Docker releases.
CONTAINER_NAME_PREFIX='galaxy_gie_'
LOG_PATH=${1:-'/tmp/galaxy_gie_service_clean.log'}
{
echo "Running cleanup at $(date)"
for service_name in $(docker service ls | awk "\$2 ~ /^$CONTAINER_NAME_PREFIX/ {print \$2}"); do
docker service ps --no-trunc $service_name | tail -1 | awk '{print $6}' | grep -q '^Shutdown$' && docker service rm $service_name;
done
echo "Done"
} >>$LOG_PATH
+76 -10
View File
@@ -201,7 +201,8 @@ You might want to run your IEs on a host different to the one that hosts your
Galaxy webserver, since IEs on the same host as the webserver compete for
resources with that webserver and introduce some security considerations which
could be mitigated by moving containers to a separate host. This feature has
been available since 15.07 and is used in production at the University of Freiburg.
been available since 15.07 and is used in production at the University of
Freiburg and on usegalaxy.org.
First you need to configure a second host to be Docker enabled. In the
following we call this host ``gx-docker`` You need to start the Docker daemon
@@ -213,9 +214,9 @@ you can start the daemon with
$ docker -H 0.0.0.0:4243 -d
On your client, the Galaxy webserver, you can now install a Docker client. This
can also be done on older Systems like Scientific-Linux, CentOS 6, which does
not have Docker support by default. The client just talks to the Docker daemon
on host ``gx-docker``, and does not run anything itself, locally. You can test
can also be done on older systems like Scientific-Linux, CentOS 6, which do not
have Docker support by default. The client just talks to the Docker daemon on
host ``gx-docker``, and does not run anything itself, locally. You can test
your configuration for example by starting busybox from your client on the
Docker host with
@@ -223,7 +224,13 @@ Docker host with
$ docker -H tcp://gx-docker:4243 run -it busybox sh
So far so good! Now we need to configure Galaxy to use our new Docker host
So far so good! Note, however, that unless restricted by a firewall, this mode
of operation is insecure, as any client could connect and run containers on
``gx-docker``. If this is a concern at your site, follow the instructions in
the Docker documentation to `Protect the Docker daemon socket
<https://docs.docker.com/engine/security/https/>`__.
Now we need to configure Galaxy to use our new Docker host
to start the Interactive Environments. For that we need to edit the Jupyter GIE
configuration, ``jupyter.ini`` to use our custom docker host
@@ -233,14 +240,18 @@ configuration, ``jupyter.ini`` to use our custom docker host
[docker]
command = docker -H tcp://gx-docker:4243 {docker_args}
image = bgruening/docker-ipython-notebook:dev
docker_hostname = gx-docker
Please adapt your ``command`` and the ``image`` as needed.
Please adapt your ``command`` as needed.
As next step we need to configure a share mount point between the Docker host
and Galaxy. Unfortunately, this can not be a NFS mount. Docker does not like
NFS yet. You could for example use a sshfs mount with the following script
The Jupyter GIE supports getting and fetching Galaxy history datasets entirely
through the Galaxy API so it is not necessary to share a filesystem with
``gx-docker``. However, other GIE plugins may still require this.
For those GIE plugins, we need to configure a share mount point between the
Docker host and Galaxy. Unfortunately, this can not be a NFS mount. Docker does
not like NFS yet. You could for example use a sshfs mount with the following
script
.. code-block:: bash
@@ -252,3 +263,58 @@ NFS yet. You could for example use a sshfs mount with the following script
fi
This will let Galaxy and the Docker host share temporary files.
Docker Engine Swarm Mode
^^^^^^^^^^^^^^^^^^^^^^^^
As of Docker Engine version 1.12, Docker Engine can be configured to provide a
cluster of Docker Engines in a configuration known as *Docker Engine swarm
mode*. This replaces the previous and similarly named *Docker Swarm*
clustering solution, which is not compatible with swarm mode.
`The Docker Engine swarm mode documentation
<https://docs.docker.com/engine/swarm/>`__ fully explains the differences, but
the major difference is that whereas under Docker Swarm one could run commands
on the swarm with ``docker run``, Docker Engine swarm mode requires one to
create persistent services with ``docker service create`` and to remove those
services once no longer in use with ``docker service rm``.
Galaxy supports both Docker Engine swarm mode and the legacy Docker Swarm
system. Legacy Docker Swarm is supported without any special configuration,
because the containers are still run with ``docker run`` as before. To support
Docker Engine swarm mode, additional configuration is required. Begin by
editing your GIE config plugin's ini configuration file (e.g. ``jupyter.ini``)
and set the ``docker_connect_port`` and ``swarm_mode options`` in addition to
any other relevant options. Unless you are using a non-standard Docker image,
the correct value for ``docker_connect_port`` should be suggested to you in the
sample configuration file:
.. code-block:: ini
[docker]
docker_connect_port = 8888
swarm_mode = True
Note that your Galaxy server does not need to be a member of the swarm itself.
It can use the method outlined above in the `Docker on Another Host`_ section
to connect as a client to a Docker daemon acting as a swarm mode manager.
Once configured, you should see that your GIE containers are started and run as
services, which you can inspect using the ``docker service ls`` command and
other ``docker service`` subcommands.
**Docker services are not cleaned up by Galaxy**. To clean them up, we have
provided a script that can be run from cron which will locate "shut down"
services (GIE containers which have stopped themselves) at
`cron/clean_docker_swarm_mode_services.sh
<https://github.com/galaxyproject/galaxy/blob/dev/cron/clean_docker_swarm_mode_services.sh>`__
in the Galaxy source. This script can be run from cron with a crontab entry
like this example which runs every 15 minutes:
.. code-block:: bash
*/15 * * * * bash /path/to/clean_docker_swarm_mode_services.sh /path/to/galaxy/log/dir/clean_docker_swarm_mode_services.log
This entry would be suitable to be run as ``root`` on a swarm mode manager. You
could also run it as the Galaxy user on the Galaxy server (with modifications
to set the correct daemon socket, if running remotely).
+12 -19
View File
@@ -577,6 +577,8 @@ class Configuration( object ):
elif ie_dirs:
self.visualization_plugins_directory += ",%s" % ie_dirs
self.gie_swarm_mode = string_as_bool( kwargs.get( 'interactive_environment_swarm_mode', False ) )
self.proxy_session_map = self.resolve_path( kwargs.get( "dynamic_proxy_session_map", "database/session_map.sqlite" ) )
self.manage_dynamic_proxy = string_as_bool( kwargs.get( "dynamic_proxy_manage", "True" ) ) # Set to false if being launched externally
self.dynamic_proxy_debug = string_as_bool( kwargs.get( "dynamic_proxy_debug", "False" ) )
@@ -901,34 +903,25 @@ class ConfiguresGalaxyMixin:
time.sleep(1)
def reload_toolbox(self):
# Initialize the tools, making sure the list of tool configs includes the reserved migrated_tools_conf.xml file.
tool_configs = self.config.tool_configs
if self.config.migrated_tools_config not in tool_configs:
tool_configs.append( self.config.migrated_tools_config )
from galaxy import tools
old_toolbox = self.toolbox
self.toolbox = tools.ToolBox( tool_configs, self.config.tool_path, self )
self.reindex_tool_search()
if old_toolbox:
old_toolbox.shutdown()
def _configure_toolbox( self ):
from galaxy import tools
from galaxy.managers.citations import CitationsManager
self.citations_manager = CitationsManager( self )
from galaxy.tools.deps import containers
from galaxy.tools.toolbox.cache import ToolCache
from galaxy.tools.toolbox.lineages.tool_shed import ToolVersionCache
self.citations_manager = CitationsManager( self )
self.tool_cache = ToolCache()
self.tool_version_cache = ToolVersionCache(self)
self._toolbox_lock = threading.RLock()
self.toolbox = None
self.reload_toolbox()
# Initialize the tools, making sure the list of tool configs includes the reserved migrated_tools_conf.xml file.
tool_configs = self.config.tool_configs
if self.config.migrated_tools_config not in tool_configs:
tool_configs.append( self.config.migrated_tools_config )
self.toolbox = tools.ToolBox( tool_configs, self.config.tool_path, self )
self.reindex_tool_search()
from galaxy.tools.deps import containers
galaxy_root_dir = os.path.abspath(self.config.root)
file_path = os.path.abspath(getattr(self.config, "file_path"))
app_info = containers.AppInfo(
+4 -2
View File
@@ -270,7 +270,8 @@ class AlignCheck(Tabular):
dataset.metadata.column_names = self.column_names
dataset.metadata.column_types = self.column_types
dataset.metadata.comment_lines = self.comment_lines
dataset.metadata.data_lines -= self.comment_lines
if isinstance(dataset.metadata.data_lines, int):
dataset.metadata.data_lines -= self.comment_lines
class AlignReport(Tabular):
@@ -735,7 +736,8 @@ class CountTable(Tabular):
dataset.metadata.groups = colnames[2:]
dataset.metadata.comment_lines = 1
dataset.metadata.data_lines -= 1
if isinstance(dataset.metadata.data_lines, int):
dataset.metadata.data_lines -= 1
class RefTaxonomy(Tabular):
+47
View File
@@ -605,3 +605,50 @@ class Smat(Text):
if re.match(r"[-+]?\d+$", item) is None:
return False
return True
class PlantTribesOrtho(Html):
"""
PlantTribes sequences classified into precomputed, orthologous gene family
clusters.
"""
file_ext = "ptortho"
def set_peek(self, dataset, is_multi_byte=False):
super(PlantTribesOrtho, self).set_peek(dataset, is_multi_byte=is_multi_byte)
dataset.blurb = "PlantTribes gene family clusters: %d files" % dataset.metadata.data_lines
class PlantTribesOrthoCodingSequence(Html):
"""
PlantTribes sequences classified into precomputed, orthologous gene family
clusters and corresponding coding sequences.
"""
file_ext = "ptorthocs"
def set_peek(self, dataset, is_multi_byte=False):
super(PlantTribesOrthoCodingSequence, self).set_peek(dataset, is_multi_byte=is_multi_byte)
dataset.blurb = "PlantTribes gene family clusters with corresponding coding sequences: %d files" % dataset.metadata.data_lines
class PlantTribesPhylogeneticTree(Html):
"""
PlantTribes multiple sequence alignments and inferred maximum likelihood
phylogenies for orthogroups.
"""
file_ext = "pttree"
def set_peek(self, dataset, is_multi_byte=False):
super(PlantTribesPhylogeneticTree, self).set_peek(dataset, is_multi_byte=is_multi_byte)
dataset.blurb = "PlantTribes phylogenetic trees: %d files" % dataset.metadata.data_lines
class PlantTribesMultipleSequenceAlignment(Html):
"""
PlantTribes multiple sequence alignments for orthogroups.
"""
file_ext = "ptalign"
def set_peek(self, dataset, is_multi_byte=False):
super(PlantTribesMultipleSequenceAlignment, self).set_peek(dataset, is_multi_byte=is_multi_byte)
dataset.blurb = "PlantTribes multiple sequence alignments: %d files" % dataset.metadata.data_lines
+23 -6
View File
@@ -254,13 +254,18 @@ class HDASerializer( # datasets._UnflattenedMetadataDatasetAssociationSerialize
'id',
'type_id',
'name',
'history_id', 'hid',
'history_id',
'hid',
'history_content_type',
'dataset_id',
'state', 'extension',
'state',
'extension',
'deleted', 'purged', 'visible',
'type', 'url',
'create_time', 'update_time',
'nametags',
'type',
'url',
'create_time',
'update_time',
])
self.add_view( 'detailed', [
'model_class',
@@ -281,6 +286,7 @@ class HDASerializer( # datasets._UnflattenedMetadataDatasetAssociationSerialize
'creating_job',
'rerunnable',
'tags',
'uuid',
'permissions',
'file_name',
@@ -292,7 +298,7 @@ class HDASerializer( # datasets._UnflattenedMetadataDatasetAssociationSerialize
# 'url',
'download_url',
'annotation', 'tags',
'annotation',
'api_type'
], include_keys_from='summary' )
@@ -326,7 +332,7 @@ class HDASerializer( # datasets._UnflattenedMetadataDatasetAssociationSerialize
'misc_blurb' : self._remap_from( 'blurb' ),
'file_ext' : self._remap_from( 'extension' ),
'file_path' : self._remap_from( 'file_name' ),
'nametags' : self.serialize_nametags,
'resubmitted' : lambda i, k, **c: self.hda_manager.has_been_resubmitted( i ),
'display_apps' : self.serialize_display_apps,
'display_types' : self.serialize_old_display_applications,
@@ -380,6 +386,17 @@ class HDASerializer( # datasets._UnflattenedMetadataDatasetAssociationSerialize
return display_apps
def serialize_nametags( self, hda, key, trans=None, **context ):
"""
Return list of 'name' child tags attached to this dataset.
TODO: investigate faster ways to fetch 'name' tags and values
"""
nametags = []
for tag in hda.tags:
if tag.tag.name == 'name':
nametags.append(tag.value)
return nametags
def serialize_old_display_applications( self, hda, key, trans=None, **context ):
"""
Return dictionary containing old-style display app urls.
+1 -3
View File
@@ -745,9 +745,7 @@ class WorkflowContentsManager(UsesAnnotations):
del step_dict['tool_id']
del step_dict['tool_version']
del step_dict['tool_inputs']
workflow = step.subworkflow
step_dict['stored_workflow_id'] = encode(workflow.stored_workflow.id)
step_dict['workflow_id'] = encode(workflow.id)
step_dict['workflow_id'] = encode(step.subworkflow.id)
for conn in step.input_connections:
step_id = step.id if legacy else step.order_index
+1
View File
@@ -1416,6 +1416,7 @@ class History( object, Dictifiable, UsesAnnotations, HasName ):
.options( joinedload("dataset"),
joinedload("dataset.actions"),
joinedload("dataset.actions.role"),
joinedload("tags"),
))
self._active_datasets_and_roles = query.all()
return self._active_datasets_and_roles
+2 -2
View File
@@ -226,13 +226,13 @@ class GalaxyQueueWorker(ConsumerMixin, threading.Thread):
if body.get('noop', None) != self.app.config.server_name:
try:
f = self.task_mapping[body['task']]
log.info("Instance '%s' recieved '%s' task, executing now.", self.app.config.server_name, body['task'])
log.info("Instance '%s' received '%s' task, executing now.", self.app.config.server_name, body['task'])
f(self.app, **body['kwargs'])
except Exception:
# this shouldn't ever throw an exception, but...
log.exception("Error running control task type: %s" % body['task'])
else:
log.warning("Recieved a malformed task message:\n%s" % body)
log.warning("Received a malformed task message:\n%s" % body)
message.ack()
def shutdown(self):
+7
View File
@@ -214,6 +214,7 @@ class DefaultToolAction( object ):
# format.
input_ext = 'data' if tool.profile < 16.04 else "input"
input_dbkey = incoming.get( "dbkey", "?" )
preserved_tags = []
for name, data in reversed(inp_data.items()):
if not data:
data = NoneDataset( datatypes_registry=app.datatypes_registry )
@@ -234,6 +235,9 @@ class DefaultToolAction( object ):
if identifier is not None:
incoming[ "%s|__identifier__" % name ] = identifier
for tag in data.tags:
preserved_tags.append(tag)
# Collect chromInfo dataset and add as parameters to incoming
( chrom_info, db_dataset ) = app.genome_builds.get_chrom_info( input_dbkey, trans=trans, custom_build_hack_get_len_from_fasta_conversion=tool.id != 'CONVERTER_fasta_to_len' )
if db_dataset:
@@ -303,6 +307,9 @@ class DefaultToolAction( object ):
trans.sa_session.add( data )
trans.app.security_agent.set_all_dataset_permissions( data.dataset, output_permissions, new=True )
for tag in preserved_tags:
data.tags.append(tag.copy())
# Must flush before setting object store id currently.
# TODO: optimize this.
trans.sa_session.flush()
+4 -1
View File
@@ -215,16 +215,19 @@ class CondaContext(installable.InstallableContext):
def exec_command(self, operation, args):
command = self.command(operation, args)
env = {'HOME': self.conda_prefix} # We don't want to pollute ~/.conda, which may not even be writable
env = {}
condarc_override = self.condarc_override
if condarc_override:
env["CONDARC"] = condarc_override
log.debug("Executing command: %s", command)
env['HOME'] = tempfile.mkdtemp(prefix='conda_exec_home_') # We don't want to pollute ~/.conda, which may not even be writable
try:
return self.shell_exec(command, env=env)
except commands.CommandLineException as e:
log.warning(e)
return e.returncode
finally:
shutil.rmtree(env['HOME'], ignore_errors=True)
def exec_create(self, args):
create_base_args = [
+1 -1
View File
@@ -232,7 +232,7 @@ class CondaDependencyResolver(DependencyResolver, MultipleDependencyResolver, Li
if job_directory:
conda_environment = os.path.join(job_directory, conda_env)
else:
conda_environment = None
conda_environment = self.conda_context.env_path(conda_target.install_environment)
return CondaDependency(
self.conda_context,
+20 -16
View File
@@ -2,7 +2,6 @@
Basic tool parameters.
"""
import logging
import numbers
import os
import os.path
import re
@@ -131,8 +130,6 @@ class ToolParameter( object, Dictifiable ):
def to_python( self, value, app ):
"""Convert a value created with to_json back to an object representation"""
if isinstance( value, numbers.Number ):
return unicodify( value )
return value
def value_to_basic( self, value, app, use_security=False ):
@@ -1767,8 +1764,13 @@ class DataToolParameter( BaseDataToolParameter ):
multiple = self.multiple
# build and append a new select option
def append( list, id, hid, name, src, keep=False ):
return list.append( { 'id' : trans.security.encode_id( id ), 'hid' : hid, 'name' : name, 'src' : src, 'keep': keep } )
def append( list, hda, name, src, keep=False ):
return list.append( { 'id' : trans.security.encode_id( hda.id ),
'hid' : hda.hid,
'name' : name,
'tags' : [ t.user_tname if not t.value else "%s:%s" % (t.user_tname, t.value) for t in hda.tags ],
'src' : src,
'keep' : keep } )
# add datasets
visible_hda = other_values.get( self.name )
@@ -1779,7 +1781,7 @@ class DataToolParameter( BaseDataToolParameter ):
m = match.hda
has_matched = has_matched or visible_hda == m or visible_hda == hda
m_name = '%s (as %s)' % ( match.original_hda.name, match.target_ext ) if match.implicit_conversion else m.name
append( d[ 'options' ][ 'hda' ], m.id, m.hid, m_name, 'hda' )
append( d[ 'options' ][ 'hda' ], m, m_name, 'hda' )
if not has_matched and hasattr( visible_hda, 'hid' ):
if visible_hda.deleted:
hda_state = 'deleted'
@@ -1787,13 +1789,13 @@ class DataToolParameter( BaseDataToolParameter ):
hda_state = 'hidden'
else:
hda_state = 'unavailable'
append( d[ 'options' ][ 'hda' ], visible_hda.id, visible_hda.hid, '(%s) %s' % ( hda_state, visible_hda.name ), 'hda', True )
append( d[ 'options' ][ 'hda' ], visible_hda, '(%s) %s' % ( hda_state, visible_hda.name ), 'hda', True )
# add dataset collections
dataset_collection_matcher = DatasetCollectionMatcher( dataset_matcher )
for hdca in history.active_dataset_collections:
if dataset_collection_matcher.hdca_match( hdca, reduction=multiple ):
append( d[ 'options' ][ 'hdca' ], hdca.id, hdca.hid, hdca.name, 'hdca' )
append( d[ 'options' ][ 'hdca' ], hdca, hdca.name, 'hdca' )
# sort both lists
d['options']['hda'] = sorted(d['options']['hda'], key=lambda k: k['hid'], reverse=True)
@@ -1920,20 +1922,22 @@ class DataCollectionToolParameter( BaseDataToolParameter ):
# append directly matched collections
for hdca in self.match_collections( trans, history, dataset_matcher ):
d['options']['hdca'].append({
'id': trans.security.encode_id( hdca.id ),
'hid': hdca.hid,
'name': hdca.name,
'src': 'hdca'
'id' : trans.security.encode_id( hdca.id ),
'hid' : hdca.hid,
'name' : hdca.name,
'src' : 'hdca',
'tags' : [ t.user_tname if not t.value else "%s:%s" % (t.user_tname, t.value) for t in hdca.tags ]
})
# append matching subcollections
for hdca in self.match_multirun_collections( trans, history, dataset_matcher ):
subcollection_type = self._history_query( trans ).can_map_over( hdca ).collection_type
d['options']['hdca'].append({
'id': trans.security.encode_id( hdca.id ),
'hid': hdca.hid,
'name': hdca.name,
'src': 'hdca',
'id' : trans.security.encode_id( hdca.id ),
'hid' : hdca.hid,
'name' : hdca.name,
'src' : 'hdca',
'tags' : [ t.user_tname if not t.value else "%s:%s" % (t.user_tname, t.value) for t in hdca.tags ],
'map_over_type': subcollection_type
})
+4 -1
View File
@@ -56,10 +56,13 @@ def swap_inf_nan( val ):
def safe_loads( arg ):
"""
This is a wrapper around loads that returns the parsed value instead of
raising a value error.
raising a value error. It also avoids autoconversion of non-iterables
i.e numeric and boolean values.
"""
try:
loaded = json.loads( arg )
if loaded is not None and not isinstance( loaded, collections.Iterable ):
loaded = arg
except ( TypeError, ValueError ):
loaded = arg
return loaded
+26 -2
View File
@@ -1,7 +1,7 @@
import logging
import os
from datetime import datetime, timedelta
from six import string_types
import six
from string import punctuation as PUNCTUATION
from sqlalchemy import and_, false, func, or_
@@ -1120,6 +1120,30 @@ class Admin( object ):
job=job,
message="<a href='jobs'>Back</a>" )
@web.expose
@web.require_admin
def manage_tool_dependencies( self, trans, install_dependencies=False, build_cache=False, install_for_tools=[], viewkey='View tool-centric dependencies'):
tools_by_id = trans.app.toolbox.tools_by_id
if install_dependencies:
# install the dependencies for the tools in the install_for_tools list
if not isinstance(install_for_tools, list):
install_for_tools = [install_for_tools]
requirements = set([tools_by_id[tid].tool_requirements for tid in install_for_tools])
[trans.app.toolbox.tools_by_id[install_for_tools[0]]._view.install_dependencies(r) for r in requirements]
view = six.next(six.itervalues(trans.app.toolbox.tools_by_id))._view
tool_ids_by_requirements = {}
for tid, tool in trans.app.toolbox.tools_by_id.items():
if tool.tool_requirements not in tool_ids_by_requirements:
tool_ids_by_requirements[tool.tool_requirements] = [tid]
else:
tool_ids_by_requirements[tool.tool_requirements].append(tid)
requirements_status = {r: view.get_requirements_status({tid: r}, tools_by_id[tids[0]].installed_tool_dependencies) for r, tids in tool_ids_by_requirements.items()}
return trans.fill_template( '/webapps/galaxy/admin/manage_dependencies.mako',
tools=tools_by_id,
requirements_status=requirements_status,
tool_ids_by_requirements=tool_ids_by_requirements,
viewkey=viewkey )
@web.expose
@web.require_admin
def sanitize_whitelist( self, trans, submit_whitelist=False, tools_to_whitelist=[]):
@@ -1127,7 +1151,7 @@ class Admin( object ):
# write the configured sanitize_whitelist_file with new whitelist
# and update in-memory list.
with open(trans.app.config.sanitize_whitelist_file, 'wt') as f:
if isinstance(tools_to_whitelist, string_types):
if isinstance(tools_to_whitelist, six.string_types):
tools_to_whitelist = [tools_to_whitelist]
new_whitelist = sorted([tid for tid in tools_to_whitelist if tid in trans.app.toolbox.tools_by_id])
f.write("\n".join(new_whitelist))
+105 -21
View File
@@ -6,8 +6,10 @@ import yaml
import stat
import random
import tempfile
import uuid
from subprocess import Popen, PIPE
from galaxy.util import string_as_bool_or_none
from galaxy.util.bunch import Bunch
from galaxy import web, model
from galaxy.managers import api_keys
@@ -17,6 +19,9 @@ import logging
log = logging.getLogger(__name__)
CONTAINER_NAME_PREFIX = 'galaxy_gie_'
class InteractiveEnvironmentRequest(object):
def __init__(self, trans, plugin):
@@ -44,6 +49,11 @@ class InteractiveEnvironmentRequest(object):
self.attr.docker_hostname = self.attr.viz_config.get("docker", "docker_hostname")
self.attr.docker_connect_port = self.attr.viz_config.get("docker", "docker_connect_port") or None
if string_as_bool_or_none(self.attr.viz_config.get("docker", "swarm_mode")) is not None:
self.attr.swarm_mode = string_as_bool_or_none(self.attr.viz_config.get("docker", "swarm_mode"))
else:
self.attr.swarm_mode = trans.app.config.gie_swarm_mode
# Generate per-request passwords the IE plugin can use to configure
# the destination container.
self.notebook_pw_salt = self.generate_password(length=12)
@@ -78,6 +88,10 @@ class InteractiveEnvironmentRequest(object):
if self.attr.proxy_prefix.startswith('/'):
self.attr.proxy_prefix = '/' + self.attr.proxy_prefix.lstrip('/')
assert not self.attr.swarm_mode or (self.attr.swarm_mode and
self.attr.docker_connect_port is not None), \
"Error: Docker swarm mode enabled but docker_connect_port is not set"
def load_allowed_images(self):
if os.path.exists(os.path.join(self.attr.our_config_dir, 'allowed_images.yml')):
fn = os.path.join(self.attr.our_config_dir, 'allowed_images.yml')
@@ -108,11 +122,12 @@ class InteractiveEnvironmentRequest(object):
# their defaults dictionary instead.
default_dict = {
'command': 'docker {docker_args}',
'command_inject': '--sig-proxy=true -e DEBUG=false',
'command_inject': '-e DEBUG=false -e DEFAULT_CONTAINER_RUNTIME=120',
'docker_hostname': 'localhost',
'wx_tempdir': 'False',
'docker_galaxy_temp_dir': None,
'docker_connect_port': None
'docker_connect_port': None,
'swarm_mode': None,
}
viz_config = ConfigParser.SafeConfigParser(default_dict)
conf_path = os.path.join( self.attr.our_config_dir, self.attr.viz_id + ".ini" )
@@ -211,33 +226,73 @@ class InteractiveEnvironmentRequest(object):
def volume(self, host_path, container_path, **kwds):
return DockerVolume(host_path, container_path, **kwds)
def docker_cmd(self, image, env_override={}, volumes=[]):
def docker_cmd(self, image, env_override=None, volumes=None):
"""
Generate and return the docker command to execute
"""
if env_override is None:
env_override = {}
if volumes is None:
volumes = []
temp_dir = self.temp_dir
conf = self.get_conf_dict()
conf.update(env_override)
env_str = ' '.join(['-e "%s=%s"' % (key.upper(), item) for key, item in conf.items()])
volume_str = ' '.join(['-v "%s"' % volume for volume in volumes])
import_volume_str = '-v "{temp_dir}:/import/"'.format(temp_dir=temp_dir) if self.attr.import_volume else ''
name = None
# This is the basic docker command such as "sudo -u docker docker {docker_args}"
# or just "docker {docker_args}"
command = self.attr.viz_config.get("docker", "command")
# Then we format in the entire docker command in place of
# {docker_args}, so as to let the admin not worry about which args are
# getting passed
command = command.format(docker_args='run {command_inject} {environment} -d -P {import_volume_str} {volume_str} {image}')
command_inject = self.attr.viz_config.get("docker", "command_inject")
# --name should really not be set, but we'll try to honor it anyway
if '--name' not in command_inject:
name = CONTAINER_NAME_PREFIX + uuid.uuid4().hex
if not self.attr.swarm_mode:
command = command.format(docker_args='run {command_inject} {name} {environment} -d -P {import_volume_str} {volume_str} {image}')
# --sig-proxy is not valid in the swarm mode context
if '--sig-proxy=' not in command_inject:
command_inject = '--sig-proxy=true ' + command_inject
else:
command = command.format(docker_args='service create --replicas 1 --restart-condition none {command_inject} {name} -p {docker_connect_port} {environment} {image}')
# Once that's available, we format again with all of our arguments
command = command.format(
command_inject=self.attr.viz_config.get("docker", "command_inject"),
command_inject=command_inject,
name='--name=%s' % name if name is not None else '',
environment=env_str,
import_volume_str=import_volume_str,
volume_str=volume_str,
image=image,
docker_connect_port=self.attr.docker_connect_port,
)
return command
def get_digest_image(self, image):
"""Get the digest image string for an image.
:type image: str
:param image: image name and optionally, tag
:returns: digest string, having the format `<name>@<hash_alg>:<digest>`, e.g.:
`'bgruening/docker-jupyter-notebook@sha256:3ec0bc9abc9d511aa602ee4fff2534d80dd9b1564482de52cb5de36cce6debae'`
"""
command = self.attr.viz_config.get("docker", "command")
command = command.format(docker_args="image inspect --format '{{{{(index .RepoDigests 0)}}}}' {image}".format(image=image))
p = Popen(command, stdout=PIPE, stderr=PIPE, close_fds=True, shell=True)
stdout, stderr = p.communicate()
digest = None
if p.returncode == 0:
digest = stdout.strip()
elif p.returncode == 1 and stderr.strip() == 'Error: No such image: {image}'.format(image=image):
log.warning("%s not pulled, cannot get digest", image)
else:
log.error( "%s\n%s" % (stdout, stderr) )
return digest or image
def _idsToVolumes(self, ids):
if len(ids.strip()) == 0:
return []
@@ -286,6 +341,11 @@ class InteractiveEnvironmentRequest(object):
raise Exception("Attempting to launch disallowed image! %s not in list of allowed images [%s]"
% (image, ', '.join(self.allowed_images)))
# The digest image is necessary if using swarm mode and the image's
# registry (e.g. docker hub, quay.io) is down. See:
# https://github.com/docker/docker/issues/31427
image = self.get_digest_image(image)
if additional_ids is not None:
volumes += self._idsToVolumes(additional_ids)
@@ -355,7 +415,10 @@ class InteractiveEnvironmentRequest(object):
:returns: inspect_data, a dict of docker inspect output
"""
command = self.attr.viz_config.get("docker", "command")
command = command.format(docker_args="inspect %s" % container_id)
if not self.attr.swarm_mode:
command = command.format(docker_args="inspect %s" % container_id)
else:
command = command.format(docker_args="service inspect %s" % container_id)
log.info("Inspecting docker container {0} with command [{1}]".format(
container_id,
command
@@ -368,15 +431,6 @@ class InteractiveEnvironmentRequest(object):
return None
inspect_data = json.loads(stdout)
# [{
# "NetworkSettings" : {
# "Ports" : {
# "3306/tcp" : [
# {
# "HostIp" : "127.0.0.1",
# "HostPort" : "3306"
# }
# ]
return inspect_data
def get_container_host(self, inspect_data):
@@ -410,13 +464,43 @@ class InteractiveEnvironmentRequest(object):
Someday code that calls this should be refactored whenever we get
containers with multiple ports working.
"""
# non-swarm:
# [{
# "NetworkSettings" : {
# "Ports" : {
# "3306/tcp" : [
# {
# "HostIp" : "127.0.0.1",
# "HostPort" : "3306"
# }
# ]
# swarm:
# [{
# "Endpoint": {
# "Ports": [
# {
# "Protocol": "tcp",
# "TargetPort": 8888,
# "PublishedPort": 30000,
# "PublishMode": "ingress"
# }
# ]
mappings = []
port_mappings = inspect_data[0]['NetworkSettings']['Ports']
for port_name in port_mappings:
for binding in port_mappings[port_name]:
if not self.attr.swarm_mode:
port_mappings = inspect_data[0]['NetworkSettings']['Ports']
for port_name in port_mappings:
for binding in port_mappings[port_name]:
mappings.append((
port_name.replace('/tcp', '').replace('/udp', ''),
binding['HostIp'],
binding['HostPort']
))
else:
port_mappings = inspect_data[0]['Endpoint']['Ports']
for binding in port_mappings:
mappings.append((
port_name.replace('/tcp', '').replace('/udp', ''),
binding['HostIp'],
binding['HostPort']
binding['TargetPort'],
'127.0.0.1', # use the routing mesh
binding['PublishedPort']
))
return mappings
+6 -1
View File
@@ -52,7 +52,12 @@ def edgelist_for_workflow_steps( steps ):
for step in steps:
edges.append( ( steps_to_index[step], steps_to_index[step] ) )
for conn in step.input_connections:
edges.append( ( steps_to_index[conn.output_step], steps_to_index[conn.input_step] ) )
output_index = steps_to_index[conn.output_step]
input_index = steps_to_index[conn.input_step]
# self connection - a cycle not detectable by topsort function.
if output_index == input_index:
raise CycleError([], 0, 0)
edges.append( ( output_index, input_index ) )
return edges
+38 -8
View File
@@ -8,7 +8,6 @@ rm -f run_functional_tests.log
show_help() {
cat <<EOF
'${0##*/} (test_path)' for testing all the tools in functional directory
'${0##*/} -id bbb' for testing one tool with id 'bbb' ('bbb' is the tool id)
'${0##*/} -sid ccc' for testing one section with sid 'ccc' ('ccc' is the string after 'section::')
'${0##*/} -list' for listing all the tool ids
@@ -24,14 +23,49 @@ cat <<EOF
'${0##*/} -qunit testname' for running single JavaScript test with given name
'${0##*/} -selenium' for running all selenium web tests (in test/selenium_tests)
'${0##*/} -selenium (test_path)' for running specified selenium web tests (use nosetest path)
'${0##*/} -casperjs (py_test_path)' for running casperjs JavaScript tests using a Python wrapper for consistency. py_test_path in casperjs_runner.py e.g. 'Test_04_HDAs' or 'Test_04_HDAs.test_00_HDA_states'.
This wrapper script largely serves as a point documentation and convenience -
most tests shipped with Galaxy can be run with nosetests or qunit directly.
The main test types are as follows:
- API: These tests are located in test/api and test various aspects of the Galaxy
API and test general backend aspects of Galaxy using the API.
- Integration: These tests are located in test/integration and test special
configurations of Galaxy. All API tests assume a particular Galaxy configuration
defined by test/base/driver_util.py and integration tests can be used to
launch and test Galaxy in other configurations.
- Framework: These tests are all Galaxy tool tests and can be found in
test/functional/tools. These are for the most part meant to test and
demonstrate features of the tool evaluation environment and of Galaxy tool XML
files.
- Unit: These are Python unit tests either defined as doctests or inside of
test/unit. These should generally not require a Galaxy instance and should
quickly test just a component or a few components of Galaxy's backend code.
- QUnit: These are JavaScript unit tests defined in test/qunit.
- Selenium: These are full stack tests meant to test the Galaxy UI with real
browsers and are located in test/selenium_tests.
- ToolShed: These are web tests that use the older Python web testing
framework twill to test ToolShed related functionality. These are
located in test/shed_functional.
Nose tests will allow specific tests to be selected per the documentation at
https://nose.readthedocs.org/en/latest/usage.html#selecting-tests. These are
indicated with the optional parameter (test_path). A few examples are:
Run all TestUserInfo functional tests:
./run_tests.sh test/functional/test_user_info.py:TestUserInfo
Run all API tests:
./run_tests.sh -api
The same test as above can be run using nosetests directly as follows:
nosetests test/api
However when using nosetests directly output options defined in this
file aren't respected and a new Galaxy instance will be created for each
TestCase class (this scripts optimizes it so all tests can share a Galaxy
instance).
Run a full class of API tests:
./run_tests.sh -api test/api/test_tools.py:ToolsTestCase
Run a specific API test:
./run_tests.sh -api test/api/test_tools.py:ToolsTestCase.test_map_over_with_output_format_actions
@@ -140,10 +174,6 @@ GALAXY_CONFIG_MASTER_KEY Master or admin API key to use as part of
testing with GALAXY_TEST_EXTERNAL.
GALAXY_TEST_USER_API_KEY User API key to use as part of testing with
GALAXY_TEST_EXTERNAL.
GALAXY_TEST_HISTORY_ID Point casperjs tests at specific external
history for testing.
GALAXY_TEST_WORKFLOW_FILE Point casperjs tests at specific workflow
file for testing.
GALAXY_TEST_VERBOSE_ERRORS Enable more verbose errors during API tests.
GALAXY_TEST_UPLOAD_ASYNC Upload tool test inputs asynchronously (may
overwhelm sqlite database).
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"analysis.js","sources":["../src/analysis.js"],"names":["jQuery","require","$","GalaxyApp","QUERY_STRING","PANEL","ToolPanel","HistoryPanel","PAGE","ToolForm","UserPreferences","Tours","window","app","options","bootstrapped","Galaxy","debug","config","toolPanel","el","userIsAnonymous","user","isAnonymous","toolbox","toolbox_in_panel","stored_workflow_menu_entries","nginx_upload_path","ftp_upload_site","default_genome","default_extension","centerPanel","CenterPanel","historyPanel","galaxyRoot","root","allow_user_dataset_purge","analysisPage","PageLayoutView","_","extend","left","center","right","page","params","tool_panel","upload","uploadButton","currHistoryPanel","historyView","listenToGalaxy","display","view","remove","router","Backbone","Router","initialize","this","execute","callback","args","name","queryObj","parse","pop","push","apply","routes","(/)","(/)root*","(/)tours(/)(:tour_id)","(/)users(/)","show_tours","tour_id","giveTour","ToursView","show_users","View","home","tool_id","job_id","show","_loadCenterIframe","_loadToolForm","workflow_id","m_c","m_a","id","url","prop","render","loadCurrentHistory","listenTo","fetch","urlRoot","connectToQuotaMeter","masthead","quotaMeter","history","start","pushState"],"mappings":"AACA,GAAIA,QAASC,QAAS,UAClBC,EAAIF,OACJG,UAAYF,QAAS,UAAWE,UAChCC,aAAeH,QAAS,8BACxBI,MAAQJ,QAAS,gBACjBK,UAAYL,QAAS,gBACrBM,aAAeN,QAAS,mBACxBO,KAAOP,QAAS,eAChBQ,SAAWR,QAAS,sBACpBS,gBAAkBT,QAAS,4BAC3BU,OAAQV,QAAS,aAarBW,OAAOC,IAAM,SAAcC,EAASC,GAChCH,OAAOI,OAAS,GAAIb,WAAWW,EAASC,GACxCC,OAAOC,MAAO,eAId,IAAIC,GAASJ,EAAQI,OACjBC,EAAY,GAAIb,YACZc,GAAsB,QACtBC,gBAAsBL,OAAOM,KAAKC,cAClCC,QAAsBN,EAAOM,QAC7BC,iBAAsBP,EAAOO,iBAC7BC,6BAA+BR,EAAOQ,6BACtCC,kBAAsBT,EAAOS,kBAC7BC,gBAAsBV,EAAOU,gBAC7BC,eAAsBX,EAAOW,eAC7BC,kBAAsBZ,EAAOY,oBAEjCC,EAAc,GAAI1B,OAAM2B,aACpBZ,GAAkB,YAEtBa,EAAe,GAAI1B,eACfa,GAAkB,SAClBc,WAAkBlB,OAAOmB,KACzBd,gBAAkBL,OAAOM,KAAKC,cAC9Ba,yBAA0BlB,EAAOkB,2BAErCC,EAAe,GAAI7B,MAAK8B,eAAgBC,EAAEC,OAAQ1B,GAC9CM,GAAkB,OAClBqB,KAAkBtB,EAClBuB,OAAkBX,EAClBY,MAAkBV,IAK1BjB,QAAO4B,KAAOP,EACdrB,OAAO6B,OAAS7B,OAAOE,OAAO2B,OAG9B7B,OAAOG,UAAYA,EAAU2B,WAC7B9B,OAAO+B,OAAS5B,EAAU6B,aAE1BhC,OAAOiC,iBAAmBhB,EAAaiB,YACvClC,OAAOiC,iBAAiBE,eAAgBnC,QAGxCA,OAAOH,KACHuC,QAAU,SAAUC,GAEhBnD,EAAG,8BAA+BoD,SAClCvB,EAAYqB,QAASC,KAM7BrC,OAAOuC,OAAS,IAAMC,SAASC,OAAOjB,QAGlCkB,WAAa,SAAU5C,GACnB6C,KAAK7C,QAAUA,GAInB8C,QAAS,SAAUC,EAAUC,EAAMC,GAC/B/C,OAAOC,MAAO,kBAAmB4C,EAAUC,EAAMC,EACjD,IAAIC,GAAW5D,aAAa6D,MAAOH,EAAKI,MACxCJ,GAAKK,KAAMH,GACPH,GACAA,EAASO,MAAOT,KAAMG,IAI9BO,QACIC,MAAQ,OAERC,WAAa,OACbC,wBAA0B,aAC1BC,cAAgB,cAGpBC,WAAa,SAAUC,GACdA,EACDhE,MAAMiE,SAAUD,GAEhB5C,EAAYqB,QAAS,GAAIzC,OAAMkE,YAIvCC,WAAa,WACT/C,EAAYqB,QAAS,GAAI1C,iBAAgBqE,OAI7CC,KAAO,SAAUnC,GAGTA,EAAOoC,SAAWpC,EAAOqC,OACD,YAAnBrC,EAAOoC,SACRjE,OAAO+B,OAAOoC,OACdxB,KAAKyB,kBAAmB,YAExBzB,KAAK0B,cAAexC,GAKpBc,KAAKyB,kBADLvC,EAAOyC,YACiB,mBAAqBzC,EAAOyC,YAE7CzC,EAAO0C,IACU1C,EAAO0C,IAAM,IAAM1C,EAAO2C,IAG1B,YAMpCH,cAAgB,SAAUxC,GAEtBA,EAAO4C,GAAK5C,EAAOoC,QACnBlD,EAAYqB,QAAS,GAAI3C,UAASsE,KAAMlC,KAI5CuC,kBAAoB,SAAUM,EAAKvD,GAC/BA,EAAOA,GAAQnB,OAAOmB,KACtBuD,EAAMvD,EAAOuD,EACb3D,EAAY7B,EAAG,gBAAiByF,KAAM,MAAOD,OAGhD5E,GAILZ,EAAE,WACEmC,EAAauD,SACbvD,EAAaM,MAAMO,YAAY2C,qBAM/B7E,OAAO8E,SAAUzD,EAAaM,MAAMO,YAAa,sBAAuB,WAEpElC,OAAOM,KAAKyE,OAAQL,IAAK1E,OAAOM,KAAK0E,UAAY,KAAQhF,OAAOM,KAAKmE,IAAM,eAE/EpD,EAAaM,MAAMO,YAAY+C,oBAAqB5D,EAAa6D,SAASC,YAG1E3C,SAAS4C,QAAQC,OACblE,KAAcnB,OAAOmB,KACrBmE,WAAc"}
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"app.js","sources":["../src/app.js"],"names":["define","Utils","Masthead","Modal","QuotaMeter","Backbone","View","extend","initialize","options","Galaxy","app","this","modal","masthead","setElement","_template","$el","append","$","render","require","Analysis","window","console","log","err","debug","initialize2","merge","params","$container","parent","attr","addClass","message_box_visible","show","show_inactivity_warning","menu","Menu","GalaxyMenu","config","quotaMeter","UserQuotaMeter","model","user","el","display","target","remove","panels","_buildPanels","Views","panel_ids","i","id","view","components","header","title","cls","buttons","body","$panel","_templatePanel","find","html","Panel","center","panel","drag","toggle","right","message_box_class","message_box_content","inactivity_box_content","root"],"mappings":"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"}
+1
View File
@@ -0,0 +1 @@
{"version":3,"file":"analysis.js","sources":["../../src/app/analysis.js"],"names":["define","Backbone","View","extend","initialize","options","this","Utils","merge","setElement","_template","params","$","prop","Galaxy","root","tool_id","param","workflow_id","m_c","m_a","config","require_login","user","id","self","on","show","empty","hide","display","$el","scrollTop","append","tool_search","Tools","ToolSearch","spinner_url","search_url","hidden","tools","ToolCollection","toolbox","tool_panel","ToolPanel","layout","toolbox_in_panel","tool_panel_view","ToolPanelView","model","toolPanel","get","size","render","prepend","_templateTool","title","href","i","stored_workflow_menu_entries","m","stored_workflow","name","encoded_stored_workflow_id","click","parent","handle_minwidth_hint","attr","upload","Upload","components","header","buttons","buttonRefresh","Ui","ButtonLink","cls","icon","onclick","top","currHistoryPanel","loadCurrentHistory","buttonOptions","target","buttonViewMulti","body","historyOptionsMenu","optionsMenu","anonymous","purgeAllowed","allow_user_dataset_purge","HistoryPanel","CurrentHistoryPanel","el","linkTarget","$scrollContainer","connectToQuotaMeter","quotaMeter","listenToGalaxy","left"],"mappings":"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"}
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"hda-li.js","sources":["../../../src/mvc/history/hda-li.js"],"names":["define","DATASET_LI","BASE_MVC","_l","_super","DatasetListItemView","HDAListItemView","extend","className","prototype","initialize","attributes","options","call","this","toString","modelString","model","templates","titleBarTemplate","wrapTemplate","warnings","_","hidden","titleBar"],"mappings":"AAAAA,QACI,yBACA,eACA,sBACD,SAAUC,EAAYC,EAAUC,GAEnC,YAGA,IAAIC,GAASH,EAAWI,oBAMpBC,EAAkBF,EAAOG,QAGzBC,UAAcJ,EAAOK,UAAUD,UAAY,mBAE3CE,WAAa,SAAUC,EAAYC,GAC/BR,EAAOK,UAAUC,WAAWG,KAAMC,KAAMH,EAAYC,IAKxDG,SAAW,WACP,GAAIC,GAAgBF,KAAW,MAAIA,KAAKG,MAAQ,GAAK,YACrD,OAAO,mBAAqBD,EAAc,MAwC9C,OAlCJV,GAAgBG,UAAUS,UAAa,WAEnC,GAAIC,GAAmBjB,EAASkB,cAE5B,6CACI,mCACA,sBAEI,+CACA,gDACJ,SACJ,UACD,WAECC,EAAWC,EAAEf,UAAYH,EAAOK,UAAUS,UAAUG,UACpDE,OAASrB,EAASkB,cAEd,gCACI,+CACIjB,EAAI,gCACR,SACJ,WACD,YAGP,OAAOmB,GAAEf,UAAYH,EAAOK,UAAUS,WAClCM,SAAWL,EACXE,SAAWA,QAQXf,gBAAmBA"}
{"version":3,"file":"hda-li.js","sources":["../../../src/mvc/history/hda-li.js"],"names":["define","DATASET_LI","BASE_MVC","_l","_super","DatasetListItemView","HDAListItemView","extend","className","prototype","initialize","attributes","options","call","this","toString","modelString","model","templates","titleBarTemplate","wrapTemplate","warnings","_","hidden","titleBar"],"mappings":"AAAAA,QACI,yBACA,eACA,sBACD,SAAUC,EAAYC,EAAUC,GAEnC,YAGA,IAAIC,GAASH,EAAWI,oBAMpBC,EAAkBF,EAAOG,QAGzBC,UAAcJ,EAAOK,UAAUD,UAAY,mBAE3CE,WAAa,SAAUC,EAAYC,GAC/BR,EAAOK,UAAUC,WAAWG,KAAMC,KAAMH,EAAYC,IAKxDG,SAAW,WACP,GAAIC,GAAgBF,KAAW,MAAIA,KAAKG,MAAQ,GAAK,YACrD,OAAO,mBAAqBD,EAAc,MA8C9C,OAxCJV,GAAgBG,UAAUS,UAAa,WAEnC,GAAIC,GAAmBjB,EAASkB,cAE5B,6CACI,mCACA,sBAEI,+CACA,gDACJ,SACA,QACA,0BACI,gDACI,mDACJ,YACJ,UACJ,UACD,WAECC,EAAWC,EAAEf,UAAYH,EAAOK,UAAUS,UAAUG,UACpDE,OAASrB,EAASkB,cAEd,gCACI,+CACIjB,EAAI,gCACR,SACJ,WACD,YAGP,OAAOmB,GAAEf,UAAYH,EAAOK,UAAUS,WAClCM,SAAWL,EACXE,SAAWA,QAQXf,gBAAmBA"}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"upload-ftp.js","sources":["../../../src/mvc/upload/upload-ftp.js"],"names":["define","Utils","Backbone","View","extend","initialize","options","self","this","merge","class_add","class_remove","class_partial","collection","onchange","onadd","onremove","setElement","_template","rows","get","url","Galaxy","root","success","ftp_files","_fill","error","length","$","html","_templateTable","size","index","push","_add","bytesToString","show","$select_all","addClass","on","add","hasClass","ftp_file","model_index","_find","trigger","_refresh","_templateInfo","hide","$it","_templateRow","$icon","find","append","removeClass","filtered","where","file_mode","enabled","item","findWhere","file_path","path","ctime","ftp_upload_site"],"mappings":"AACAA,QAAU,eAAiB,SAAUC,GACjC,MAAOC,UAASC,KAAKC,QACjBC,WAAY,SAAUC,GAClB,GAAIC,GAAOC,IACXA,MAAKF,QAAUL,EAAMQ,MAAOH,GACxBI,UAAkB,oCAClBC,aAAkB,0CAClBC,cAAkB,0CAClBC,WAAkB,KAClBC,SAAkB,aAClBC,MAAkB,aAClBC,SAAkB,eAEtBR,KAAKK,WAAaL,KAAKF,QAAQO,WAC/BL,KAAKS,WAAYT,KAAKU,aACtBV,KAAKW,QACLlB,EAAMmB,KACFC,IAAUC,OAAOC,KAAO,mBACxBC,QAAU,SAAUC,GAAclB,EAAKmB,MAAOD,IAC9CE,MAAU,WAAapB,EAAKmB,YAKpCA,MAAO,SAAUD,GACb,GAAKA,GAAaA,EAAUG,OAAS,EAAI,CACrCpB,KAAKqB,EAAG,uBAAwBC,KAAMD,EAAGrB,KAAKuB,kBAC9C,IAAIC,GAAO,CACX,KAAMC,QAASR,GACXjB,KAAKW,KAAKe,KAAM1B,KAAK2B,KAAMV,EAAWQ,SACtCD,GAAQP,EAAWQ,OAAQD,IAI/B,IAFAxB,KAAKqB,EAAG,sBAAuBC,KAAML,EAAUG,OAAS,UACxDpB,KAAKqB,EAAG,oBAAqBC,KAAM7B,EAAMmC,cAAgBJ,GAAM,IAC1DxB,KAAKK,WAAa,CACnB,GAAIN,GAAOC,IACXA,MAAKqB,EAAG,oBAAqBQ,OAC7B7B,KAAK8B,YAAc9B,KAAKqB,EAAG,qBAAsBU,SAAU/B,KAAKF,QAAQI,WACxEF,KAAK8B,YAAYE,GAAI,QAAS,WAC1B,GAAIC,GAAMlC,EAAK+B,YAAYI,SAAUnC,EAAKD,QAAQI,UAClD,KAAMuB,QAASR,GAAY,CACvB,GAAIkB,GAAWlB,EAAWQ,OACtBW,EAAcrC,EAAKsC,MAAOF,KACzBC,GAAeH,GAAOG,IAAgBH,IACvClC,EAAKY,KAAMc,OAAQa,QAAS,YAIxCtC,KAAKuC,gBAGTvC,MAAKqB,EAAG,uBAAwBC,KAAMD,EAAGrB,KAAKwC,iBAElDxC,MAAKqB,EAAG,oBAAqBoB,QAIjCd,KAAM,SAAUQ,GACZ,GAAIpC,GAAOC,KACP0C,EAAMrB,EAAGrB,KAAK2C,aAAcR,IAC5BS,EAAQF,EAAIG,KAAM,QAmBtB,OAlBA7C,MAAKqB,EAAG,SAAUyB,OAAQJ,GACrB1C,KAAKK,YACNuC,EAAMb,SAAU/B,KAAKqC,MAAOF,GAAanC,KAAKF,QAAQK,aAAeH,KAAKF,QAAQI,WAClFwC,EAAIV,GAAG,QAAS,WACZ,GAAII,GAAcrC,EAAKsC,MAAOF,EAC9BS,GAAMG,cACAX,GAIFrC,EAAKD,QAAQU,SAAU4B,GACvBQ,EAAMb,SAAUhC,EAAKD,QAAQI,aAJ7BH,EAAKD,QAAQS,MAAO4B,GACpBS,EAAMb,SAAUhC,EAAKD,QAAQK,eAKjCJ,EAAKwC,cAGTG,EAAIV,GAAG,QAAS,WAAajC,EAAKD,QAAQQ,SAAU6B,KAEjDO,GAIXH,SAAU,WACN,GAAIS,GAAWhD,KAAKK,WAAW4C,OAASC,UAAW,MAAOC,SAAS,GACnEnD,MAAK8B,YAAYiB,cAEb/C,KAAK8B,YAAYC,SADG,GAAnBiB,EAAS5B,OACiBpB,KAAKF,QAAQI,UAEb8C,EAAS5B,QAAUpB,KAAKW,KAAKS,OAASpB,KAAKF,QAAQK,aAAeH,KAAKF,QAAQM,gBAKlHiC,MAAO,SAAUF,GACb,GAAIiB,GAAOpD,KAAKK,WAAWgD,WACvBC,UAAcnB,EAASoB,KACvBL,UAAc,MACdC,SAAc,GAElB,OAAOC,IAAQA,EAAKxC,IAAI,OAI5B+B,aAAc,SAAU7C,GACpB,MAAQ,8HAE8BA,EAAQyD,KAAO,6BACf9D,EAAMmC,cAAe9B,EAAQ0B,MAAS,6BACtC1B,EAAQ0D,MAAQ,cAK1DjC,eAAgB,WACZ,MAAQ,mfAqBZiB,cAAe,WACX,MAAQ,uGAMZ9B,UAAW,WACP,MAAQ,6NAEuJV,KAAKF,QAAQ2D,gBAAkB"}
{"version":3,"file":"upload-ftp.js","sources":["../../../src/mvc/upload/upload-ftp.js"],"names":["define","Utils","Backbone","View","extend","initialize","options","self","this","merge","class_add","class_remove","class_partial","collection","onchange","onadd","onremove","setElement","_template","rows","get","url","Galaxy","root","success","ftp_files","_fill","error","length","$","html","_templateTable","size","index","push","_add","bytesToString","show","$select_all","addClass","on","add","hasClass","ftp_file","model_index","_find","trigger","_refresh","_templateInfo","hide","$it","_templateRow","$icon","find","append","removeClass","filtered","where","file_mode","enabled","item","findWhere","file_path","path","_","escape","ctime","ftp_upload_site"],"mappings":"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"}
+1 -1
View File
@@ -1 +1 @@
{"version":3,"file":"onload.js","sources":["../src/onload.js"],"names":["replace_big_select_inputs","min_length","max_length","select_elts","refresh_select2","element","select_elt","$","options","placeholder","closeOnSelect","is","dropdownAutoWidth","containerCssClass","select2","jQuery","fn","undefined","each","this","not","num_options","find","length","hasClass","init_refresh_on_change","off","change","select_field","select_val","val","ref_on_change_vals","attr","split","last_selected_value","inArray","window","trigger","document","get","form","submit","click","confirm","_","Backbone","panels","require","extend","async_save_text","POPUPMENU","make_popupmenu","make_popup_menus","init_tag_click_function","TOURS","QUERY_STRING","ready","tooltip","placement","anchor","galaxy_main_exists","parent","frames","galaxy_main","href","indexOf","et","JSON","parse","sessionStorage","getItem","hooked_tour_from_data","steps","self","top","tour","Tour","tour_opts","init","restart"],"mappings":"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"}
{"version":3,"file":"onload.js","sources":["../src/onload.js"],"names":["replace_big_select_inputs","min_length","max_length","select_elts","refresh_select2","element","select_elt","$","options","placeholder","closeOnSelect","is","dropdownAutoWidth","containerCssClass","select2","jQuery","fn","undefined","each","this","not","num_options","find","length","hasClass","init_refresh_on_change","off","change","select_field","select_val","val","ref_on_change_vals","attr","split","last_selected_value","inArray","window","trigger","document","get","form","submit","click","confirm","_","Backbone","panels","require","extend","async_save_text","POPUPMENU","make_popupmenu","make_popup_menus","toolform","init_tag_click_function","TOURS","QUERY_STRING","ready","tooltip","placement","anchor","galaxy_main_exists","parent","frames","galaxy_main","href","indexOf","et","JSON","parse","sessionStorage","getItem","hooked_tour_from_data","steps","self","top","tour","Tour","tour_opts","init","restart"],"mappings":"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"}
+2
View File
@@ -0,0 +1,2 @@
var jQuery=require("jquery"),$=jQuery,GalaxyApp=require("galaxy").GalaxyApp,QUERY_STRING=require("utils/query-string-parsing"),PANEL=require("layout/panel"),ToolPanel=require("./tool-panel"),HistoryPanel=require("./history-panel"),PAGE=require("layout/page"),ToolForm=require("mvc/tool/tool-form"),UserPreferences=require("mvc/user/user-preferences");Tours=require("mvc/tours"),window.app=function(a,b){window.Galaxy=new GalaxyApp(a,b),Galaxy.debug("analysis app");var c=a.config,d=new ToolPanel({el:"#left",userIsAnonymous:Galaxy.user.isAnonymous(),toolbox:c.toolbox,toolbox_in_panel:c.toolbox_in_panel,stored_workflow_menu_entries:c.stored_workflow_menu_entries,nginx_upload_path:c.nginx_upload_path,ftp_upload_site:c.ftp_upload_site,default_genome:c.default_genome,default_extension:c.default_extension}),e=new PANEL.CenterPanel({el:"#center"}),f=new HistoryPanel({el:"#right",galaxyRoot:Galaxy.root,userIsAnonymous:Galaxy.user.isAnonymous(),allow_user_dataset_purge:c.allow_user_dataset_purge}),g=new PAGE.PageLayoutView(_.extend(a,{el:"body",left:d,center:e,right:f}));Galaxy.page=g,Galaxy.params=Galaxy.config.params,Galaxy.toolPanel=d.tool_panel,Galaxy.upload=d.uploadButton,Galaxy.currHistoryPanel=f.historyView,Galaxy.currHistoryPanel.listenToGalaxy(Galaxy),Galaxy.app={display:function(a){$(".select2-hidden-accessible").remove(),e.display(a)}},Galaxy.router=new(Backbone.Router.extend({initialize:function(a){this.options=a},execute:function(a,b,c){Galaxy.debug("router execute:",a,b,c);var d=QUERY_STRING.parse(b.pop());b.push(d),a&&a.apply(this,b)},routes:{"(/)":"home","(/)root*":"home","(/)tours(/)(:tour_id)":"show_tours","(/)users(/)":"show_users"},show_tours:function(a){a?Tours.giveTour(a):e.display(new Tours.ToursView)},show_users:function(){e.display(new UserPreferences.View)},home:function(a){a.tool_id||a.job_id?"upload1"===a.tool_id?(Galaxy.upload.show(),this._loadCenterIframe("welcome")):this._loadToolForm(a):this._loadCenterIframe(a.workflow_id?"workflow/run?id="+a.workflow_id:a.m_c?a.m_c+"/"+a.m_a:"welcome")},_loadToolForm:function(a){a.id=a.tool_id,e.display(new ToolForm.View(a))},_loadCenterIframe:function(a,b){b=b||Galaxy.root,a=b+a,e.$("#galaxy_main").prop("src",a)}}))(a),$(function(){g.render(),g.right.historyView.loadCurrentHistory(),Galaxy.listenTo(g.right.historyView,"history-size-change",function(){Galaxy.user.fetch({url:Galaxy.user.urlRoot()+"/"+(Galaxy.user.id||"current")})}),g.right.historyView.connectToQuotaMeter(g.masthead.quotaMeter),Backbone.history.start({root:Galaxy.root,pushState:!0})})};
//# sourceMappingURL=../maps/analysis.js.map
+2
View File
@@ -0,0 +1,2 @@
define(["utils/utils","layout/masthead","mvc/ui/ui-modal","mvc/ui/ui-modal","mvc/user/user-quotameter"],function(a,b,c,d){return Backbone.View.extend({initialize:function(a){Galaxy.app=this,Galaxy.modal=new c.View,Galaxy.masthead=new b.View(a),this.setElement(this._template(a)),this.$el.append(Galaxy.masthead.$el),$("body").append(this.$el),this.render()},render:function(){require(["app/analysis"],function(a){window.console.log(a)},function(a){console.debug(a)})},initialize2:function(e){this.options=a.merge(e,{}),this.params=this.options.params,this.setElement(this._template(e)),Galaxy.app=this,$("body").append(this.$el);var f=$(this.$el.parent()).attr("scroll","no").addClass("full-content");this.options.message_box_visible&&(f.addClass("has-message-box"),this.$("#messagebox").show()),this.options.show_inactivity_warning&&(f.addClass("has-inactivity-box"),this.$("#inactivebox").show()),Galaxy.masthead||(Galaxy.masthead=new b.View(e),Galaxy.modal=new c.View,Galaxy.menu=new Menu.GalaxyMenu({masthead:Galaxy.masthead,config:e}),Galaxy.quotaMeter=new d.UserQuotaMeter({model:Galaxy.user,el:Galaxy.masthead.$(".quota-meter-container")}).render())},display:function(a,b){$(".select2-hidden-accessible").remove(),this.panels&&this.panels[b||"center"].display(a)},_buildPanels:function(b,c){this.panels=[];var d=["left","center","right"];for(var e in d){var f=d[e],g=this.panels[f]=new b[f](c);if("center"==f)this.$("#center").append(g.$el);else{var h=a.merge(g.components,{header:{title:"",cls:"",buttons:[]},body:{cls:""}}),i=$(this._templatePanel(f));i.find(".panel-header-text").html(h.header.title),i.find(".unified-panel-header-inner").addClass(h.header.cls);for(var e in h.header.buttons)i.find(".panel-header-buttons").append(h.header.buttons[e].$el);i.find(".unified-panel-body").addClass(h.body.cls).append(g.$el);{new Panel({center:this.$("#center"),panel:i,drag:i.find(".unified-panel-footer > .drag"),toggle:i.find(".unified-panel-footer > .panel-collapse"),right:"right"==f})}this.$el.append(i)}}},_templatePanel:function(a){return'<div id="'+a+'"><div class="unified-panel-header" unselectable="on"><div class="unified-panel-header-inner"><div class="panel-header-buttons" style="float: right"/><div class="panel-header-text"/></div></div><div class="unified-panel-body"/><div class="unified-panel-footer"><div class="panel-collapse '+a+'"/><div class="drag"/></div></div>'},_template:function(){return'<div id="everything" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%;"><div id="background"/><div id="messagebox" class="panel-'+Galaxy.config.message_box_class+'-message" style="display: none;">'+Galaxy.config.message_box_content+'</div><div id="inactivebox" class="panel-warning-message" style="display: none;">'+Galaxy.config.inactivity_box_content+' <a href="'+Galaxy.root+'user/resend_verification">Resend verification.</a></div><div id="center" class="inbound"/></div>'}})});
//# sourceMappingURL=../maps/app.js.map
+2
View File
@@ -0,0 +1,2 @@
define([],function(){Backbone.View.extend({initialize:function(a){this.options=Utils.merge(a,{}),this.setElement(this._template());var b=this.options.params;this.$("#galaxy_main").prop("src",Galaxy.root+(b.tool_id&&"tool_runner?"+$.param(b)||b.workflow_id&&"workflow/run?id="+b.workflow_id||b.m_c&&b.m_c+"/"+b.m_a||Galaxy.config.require_login&&!Galaxy.user.id&&"user/login"||"root/welcome"));var c=this;this.$("#galaxy_main").on("load",function(){$(this).show(),c.$("#center-panel").empty().hide()})},display:function(a){this.$("#galaxy_main").hide(),this.$("#center-panel").empty().scrollTop(0).append(a).show()},_template:function(){return'<div style="position: absolute; width: 100%; height: 100%"><iframe name="galaxy_main" id="galaxy_main" frameborder="0" style="position: absolute; width: 100%; height: 100%;"/><div id="center-panel" style="position: absolute; width: 100%; height: 100%; padding: 10px; overflow: auto;"/></div>'}}),Backbone.View.extend({initialize:function(a){if(this.options=Utils.merge(a,{}),this.setElement(this._template()),Galaxy.user.id||!Galaxy.config.require_login){var b=new Tools.ToolSearch({spinner_url:a.spinner_url,search_url:a.search_url,hidden:!1}),c=new Tools.ToolCollection(a.toolbox),d=new Tools.ToolPanel({tool_search:b,tools:c,layout:a.toolbox_in_panel});tool_panel_view=new Tools.ToolPanelView({model:d}),Galaxy.toolPanel=d,d.get("layout").size()>0&&(tool_panel_view.render(),this.$(".toolMenu").show()),this.$el.prepend(tool_panel_view.$el),this.$("#internal-workflows").append(this._templateTool({title:"All workflows",href:"workflow/list_for_run"}));for(var e in a.stored_workflow_menu_entries){var f=a.stored_workflow_menu_entries[e];this.$("#internal-workflows").append(this._templateTool({title:f.stored_workflow.name,href:"workflow/run?id="+f.encoded_stored_workflow_id}))}this.$("a[minsizehint]").click(function(){parent.handle_minwidth_hint&&parent.handle_minwidth_hint($(this).attr("minsizehint"))}),Galaxy.upload=new Upload(a),this.components={header:{title:"Tools",buttons:[Galaxy.upload]}}}},_templateTool:function(a){return'<div class="toolTitle"><a href="'+Galaxy.root+a.href+'" target="galaxy_main">'+a.title+"</a></div>"},_template:function(){return'<div class="toolMenuContainer"><div class="toolMenu" style="display: none"><div id="search-no-results" style="display: none; padding-top: 5px"><em><strong>Search did not match any tools.</strong></em></div></div><div class="toolSectionPad"/><div class="toolSectionPad"/><div class="toolSectionTitle" id="title_XXinternalXXworkflow"><span>Workflows</span></div><div id="internal-workflows" class="toolSectionBody"><div class="toolSectionBg"/></div></div>'}}),Backbone.View.extend({initialize:function(a){this.options=Utils.merge(a,{}),this.setElement(this._template());var b=new Ui.ButtonLink({id:"history-refresh-button",title:"Refresh history",cls:"panel-header-button",icon:"fa fa-refresh",onclick:function(){top.Galaxy&&top.Galaxy.currHistoryPanel&&top.Galaxy.currHistoryPanel.loadCurrentHistory()}}),c=new Ui.ButtonLink({id:"history-options-button",title:"History options",cls:"panel-header-button",target:"galaxy_main",icon:"fa fa-cog",href:Galaxy.root+"root/history_options"}),d=new Ui.ButtonLink({id:"history-view-multi-button",title:"View all histories",cls:"panel-header-button",icon:"fa fa-columns",href:Galaxy.root+"history/view_multiple"});this.components={header:{title:"History",cls:"history-panel-header",buttons:[b,c,d]},body:{cls:"unified-panel-body-background"}},Galaxy.historyOptionsMenu=optionsMenu(c.$el,{anonymous:Galaxy.user.id&&"true"||"false",purgeAllowed:Galaxy.config.allow_user_dataset_purge&&"true"||"false",root:Galaxy.root}),Galaxy.currHistoryPanel=new HistoryPanel.CurrentHistoryPanel({el:this.$el,purgeAllowed:Galaxy.config.allow_user_dataset_purge,linkTarget:"galaxy_main",$scrollContainer:function(){return this.$el.parent()}}),Galaxy.currHistoryPanel.connectToQuotaMeter(Galaxy.quotaMeter),Galaxy.currHistoryPanel.listenToGalaxy(Galaxy),Galaxy.currHistoryPanel.loadCurrentHistory()},_template:function(){return'<div id="current-history-panel" class="history-panel"/>'}});return{left:Backbone.View.extend({initialize:function(){}})}});
//# sourceMappingURL=../../maps/app/analysis.js.map
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,2 +1,2 @@
webpackJsonp([4],[function(e,r,n){(function(e){var r=n(1),a=r,i=n(57).GalaxyApp,o=n(10),t=n(5),l=n(59);window.app=function(n,c){window.Galaxy=new i(n,c),Galaxy.debug("login app");var d=encodeURI(n.redirect);if(!n.show_welcome_with_login){var w=r.param({use_panels:"True",redirect:d});return void(window.location.href=Galaxy.root+"user/login?"+w)}var p=new l.PageLayoutView(e.extend(n,{el:"body",center:new o.CenterPanel({el:"#center"}),right:new o.RightPanel({title:t("Login required"),el:"#right"})}));a(function(){var e=r.param({redirect:d}),a=Galaxy.root+"user/login?"+e;p.render(),p.center.$("#galaxy_main").prop("src",n.welcome_url),p.right.$(".unified-panel-body").css("overflow","hidden").html('<iframe src="'+a+'" frameborder="0" style="width: 100%; height: 100%;"/>')})}}).call(r,n(2))}]);
webpackJsonp([4],[function(e,r,n){(function(e){var r=n(1),a=r,i=n(36).GalaxyApp,o=n(9),t=n(4),l=n(38);window.app=function(n,c){window.Galaxy=new i(n,c),Galaxy.debug("login app");var d=encodeURI(n.redirect);if(!n.show_welcome_with_login){var w=r.param({use_panels:"True",redirect:d});return void(window.location.href=Galaxy.root+"user/login?"+w)}var p=new l.PageLayoutView(e.extend(n,{el:"body",center:new o.CenterPanel({el:"#center"}),right:new o.RightPanel({title:t("Login required"),el:"#right"})}));a(function(){var e=r.param({redirect:d}),a=Galaxy.root+"user/login?"+e;p.render(),p.center.$("#galaxy_main").prop("src",n.welcome_url),p.right.$(".unified-panel-body").css("overflow","hidden").html('<iframe src="'+a+'" frameborder="0" style="width: 100%; height: 100%;"/>')})}}).call(r,n(2))}]);
//# sourceMappingURL=login.bundled.js.map
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,2 +1,2 @@
define(["mvc/dataset/dataset-li","mvc/base-mvc","utils/localization"],function(a,b,c){"use strict";var d=a.DatasetListItemView,e=d.extend({className:d.prototype.className+" history-content",initialize:function(a,b){d.prototype.initialize.call(this,a,b)},toString:function(){var a=this.model?this.model+"":"(no model)";return"HDAListItemView("+a+")"}});return e.prototype.templates=function(){var a=b.wrapTemplate(['<div class="title-bar clear" tabindex="0">','<span class="state-icon"></span>','<div class="title">','<span class="hid"><%- dataset.hid %></span> ','<span class="name"><%- dataset.name %></span>',"</div>","</div>"],"dataset"),e=_.extend({},d.prototype.templates.warnings,{hidden:b.wrapTemplate(["<% if( !dataset.visible ){ %>",'<div class="hidden-msg warningmessagesmall">',c("This dataset has been hidden"),"</div>","<% } %>"],"dataset")});return _.extend({},d.prototype.templates,{titleBar:a,warnings:e})}(),{HDAListItemView:e}});
define(["mvc/dataset/dataset-li","mvc/base-mvc","utils/localization"],function(a,b,c){"use strict";var d=a.DatasetListItemView,e=d.extend({className:d.prototype.className+" history-content",initialize:function(a,b){d.prototype.initialize.call(this,a,b)},toString:function(){var a=this.model?this.model+"":"(no model)";return"HDAListItemView("+a+")"}});return e.prototype.templates=function(){var a=b.wrapTemplate(['<div class="title-bar clear" tabindex="0">','<span class="state-icon"></span>','<div class="title">','<span class="hid"><%- dataset.hid %></span> ','<span class="name"><%- dataset.name %></span>',"</div>","</br>",'<span class="nametags">',"<% _.each(dataset.nametags, function(tag){ %>",'<span class="label label-info"><%- tag %></span>',"<% }); %>","</span>","</div>"],"dataset"),e=_.extend({},d.prototype.templates.warnings,{hidden:b.wrapTemplate(["<% if( !dataset.visible ){ %>",'<div class="hidden-msg warningmessagesmall">',c("This dataset has been hidden"),"</div>","<% } %>"],"dataset")});return _.extend({},d.prototype.templates,{titleBar:a,warnings:e})}(),{HDAListItemView:e}});
//# sourceMappingURL=../../../maps/mvc/history/hda-li.js.map
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,2 +1,2 @@
define(["utils/utils"],function(a){return Backbone.View.extend({initialize:function(b){var c=this;this.options=a.merge(b,{class_add:"upload-icon-button fa fa-square-o",class_remove:"upload-icon-button fa fa-check-square-o",class_partial:"upload-icon-button fa fa-minus-square-o",collection:null,onchange:function(){},onadd:function(){},onremove:function(){}}),this.collection=this.options.collection,this.setElement(this._template()),this.rows=[],a.get({url:Galaxy.root+"api/remote_files",success:function(a){c._fill(a)},error:function(){c._fill()}})},_fill:function(b){if(b&&b.length>0){this.$(".upload-ftp-content").html($(this._templateTable()));var c=0;for(index in b)this.rows.push(this._add(b[index])),c+=b[index].size;if(this.$(".upload-ftp-number").html(b.length+" files"),this.$(".upload-ftp-disk").html(a.bytesToString(c,!0)),this.collection){var d=this;this.$("._has_collection").show(),this.$select_all=this.$(".upload-selectall").addClass(this.options.class_add),this.$select_all.on("click",function(){var a=d.$select_all.hasClass(d.options.class_add);for(index in b){var c=b[index],e=d._find(c);(!e&&a||e&&!a)&&d.rows[index].trigger("click")}}),this._refresh()}}else this.$(".upload-ftp-content").html($(this._templateInfo()));this.$(".upload-ftp-wait").hide()},_add:function(a){var b=this,c=$(this._templateRow(a)),d=c.find(".icon");return this.$("tbody").append(c),this.collection?(d.addClass(this._find(a)?this.options.class_remove:this.options.class_add),c.on("click",function(){var c=b._find(a);d.removeClass(),c?(b.options.onremove(c),d.addClass(b.options.class_add)):(b.options.onadd(a),d.addClass(b.options.class_remove)),b._refresh()})):c.on("click",function(){b.options.onchange(a)}),c},_refresh:function(){var a=this.collection.where({file_mode:"ftp",enabled:!0});this.$select_all.removeClass(),this.$select_all.addClass(0==a.length?this.options.class_add:a.length==this.rows.length?this.options.class_remove:this.options.class_partial)},_find:function(a){var b=this.collection.findWhere({file_path:a.path,file_mode:"ftp",enabled:!0});return b&&b.get("id")},_templateRow:function(b){return'<tr class="upload-ftp-row"><td class="_has_collection" style="display: none;"><div class="icon"/></td><td class="ftp-name">'+b.path+'</td><td class="ftp-size">'+a.bytesToString(b.size)+'</td><td class="ftp-time">'+b.ctime+"</td></tr>"},_templateTable:function(){return'<span style="whitespace: nowrap; float: left;">Available files: </span><span style="whitespace: nowrap; float: right;"><span class="upload-icon fa fa-file-text-o"/><span class="upload-ftp-number"/>&nbsp;&nbsp;<span class="upload-icon fa fa-hdd-o"/><span class="upload-ftp-disk"/></span><table class="grid" style="float: left;"><thead><tr><th class="_has_collection" style="display: none;"><div class="upload-selectall"></th><th>Name</th><th>Size</th><th>Created</th></tr></thead><tbody/></table>'},_templateInfo:function(){return'<div class="upload-ftp-warning warningmessage">Your FTP directory does not contain any files.</div>'},_template:function(){return'<div class="upload-ftp"><div class="upload-ftp-wait fa fa-spinner fa-spin"/><div class="upload-ftp-help">This Galaxy server allows you to upload files via FTP. To upload some files, log in to the FTP server at <strong>'+this.options.ftp_upload_site+'</strong> using your Galaxy credentials (email address and password).</div><div class="upload-ftp-content"/><div>'}})});
define(["utils/utils"],function(a){return Backbone.View.extend({initialize:function(b){var c=this;this.options=a.merge(b,{class_add:"upload-icon-button fa fa-square-o",class_remove:"upload-icon-button fa fa-check-square-o",class_partial:"upload-icon-button fa fa-minus-square-o",collection:null,onchange:function(){},onadd:function(){},onremove:function(){}}),this.collection=this.options.collection,this.setElement(this._template()),this.rows=[],a.get({url:Galaxy.root+"api/remote_files",success:function(a){c._fill(a)},error:function(){c._fill()}})},_fill:function(b){if(b&&b.length>0){this.$(".upload-ftp-content").html($(this._templateTable()));var c=0;for(index in b)this.rows.push(this._add(b[index])),c+=b[index].size;if(this.$(".upload-ftp-number").html(b.length+" files"),this.$(".upload-ftp-disk").html(a.bytesToString(c,!0)),this.collection){var d=this;this.$("._has_collection").show(),this.$select_all=this.$(".upload-selectall").addClass(this.options.class_add),this.$select_all.on("click",function(){var a=d.$select_all.hasClass(d.options.class_add);for(index in b){var c=b[index],e=d._find(c);(!e&&a||e&&!a)&&d.rows[index].trigger("click")}}),this._refresh()}}else this.$(".upload-ftp-content").html($(this._templateInfo()));this.$(".upload-ftp-wait").hide()},_add:function(a){var b=this,c=$(this._templateRow(a)),d=c.find(".icon");return this.$("tbody").append(c),this.collection?(d.addClass(this._find(a)?this.options.class_remove:this.options.class_add),c.on("click",function(){var c=b._find(a);d.removeClass(),c?(b.options.onremove(c),d.addClass(b.options.class_add)):(b.options.onadd(a),d.addClass(b.options.class_remove)),b._refresh()})):c.on("click",function(){b.options.onchange(a)}),c},_refresh:function(){var a=this.collection.where({file_mode:"ftp",enabled:!0});this.$select_all.removeClass(),this.$select_all.addClass(0==a.length?this.options.class_add:a.length==this.rows.length?this.options.class_remove:this.options.class_partial)},_find:function(a){var b=this.collection.findWhere({file_path:a.path,file_mode:"ftp",enabled:!0});return b&&b.get("id")},_templateRow:function(b){return'<tr class="upload-ftp-row"><td class="_has_collection" style="display: none;"><div class="icon"/></td><td class="ftp-name">'+_.escape(b.path)+'</td><td class="ftp-size">'+a.bytesToString(b.size)+'</td><td class="ftp-time">'+b.ctime+"</td></tr>"},_templateTable:function(){return'<span style="whitespace: nowrap; float: left;">Available files: </span><span style="whitespace: nowrap; float: right;"><span class="upload-icon fa fa-file-text-o"/><span class="upload-ftp-number"/>&nbsp;&nbsp;<span class="upload-icon fa fa-hdd-o"/><span class="upload-ftp-disk"/></span><table class="grid" style="float: left;"><thead><tr><th class="_has_collection" style="display: none;"><div class="upload-selectall"></th><th>Name</th><th>Size</th><th>Created</th></tr></thead><tbody/></table>'},_templateInfo:function(){return'<div class="upload-ftp-warning warningmessage">Your FTP directory does not contain any files.</div>'},_template:function(){return'<div class="upload-ftp"><div class="upload-ftp-wait fa fa-spinner fa-spin"/><div class="upload-ftp-help">This Galaxy server allows you to upload files via FTP. To upload some files, log in to the FTP server at <strong>'+this.options.ftp_upload_site+'</strong> using your Galaxy credentials (email address and password).</div><div class="upload-ftp-content"/><div>'}})});
//# sourceMappingURL=../../../maps/mvc/upload/upload-ftp.js.map
+1 -1
View File
@@ -1,2 +1,2 @@
function replace_big_select_inputs(a,b,c){function d(a){var b=$(a),c={placeholder:"Click to select",closeOnSelect:!b.is("[MULTIPLE]"),dropdownAutoWidth:!0,containerCssClass:"select2-minwidth"};return a.select2(c)}jQuery.fn.select2&&(void 0===a&&(a=20),void 0===b&&(b=3e3),c=c||$("select"),c.each(function(){var c=$(this).not("[multiple]"),e=c.find("option").length;a>e||e>b||c.hasClass("no-autocomplete")||d(c)}))}function init_refresh_on_change(){$("select[refresh_on_change='true']").off("change").change(function(){var a=$(this),b=a.val(),c=a.attr("refresh_on_change_values");if(c){c=c.split(",");var d=a.attr("last_selected_value");if(-1===$.inArray(b,c)&&-1===$.inArray(d,c))return}$(window).trigger("refresh_on_change"),$(document).trigger("convert_to_values"),a.get(0).form.submit()}),$(":checkbox[refresh_on_change='true']").off("click").click(function(){var a=$(this),b=a.val(),c=a.attr("refresh_on_change_values");if(c){c=c.split(",");var d=a.attr("last_selected_value");if(-1===$.inArray(b,c)&&-1===$.inArray(d,c))return}$(window).trigger("refresh_on_change"),a.get(0).form.submit()}),$("a[confirm]").off("click").click(function(){return confirm($(this).attr("confirm"))})}window.jQuery=jQuery,window.$=jQuery,window._=_,window.Backbone=Backbone,window.panels=require("layout/panel"),_.extend(window,require("layout/modal")),window.async_save_text=require("utils/async-save-text");var POPUPMENU=require("ui/popupmenu");window.make_popupmenu=POPUPMENU.make_popupmenu,window.make_popup_menus=POPUPMENU.make_popup_menus,window.init_tag_click_function=require("ui/autocom_tagging");var TOURS=require("mvc/tours"),QUERY_STRING=require("utils/query-string-parsing");window.init_refresh_on_change=init_refresh_on_change,$(document).ready(function(){init_refresh_on_change(),$.fn.tooltip&&($(".unified-panel-header [title]").tooltip({placement:"bottom"}),$("[title]").tooltip()),make_popup_menus(),replace_big_select_inputs(20,1500),$("a").click(function(){var a=$(this),b=parent.frames&&parent.frames.galaxy_main;if("galaxy_main"==a.attr("target")&&!b){var c=a.attr("href");c+=-1==c.indexOf("?")?"?":"&",c+="use_panels=True",a.attr("href",c),a.attr("target","_self")}return a});var a=JSON.parse(sessionStorage.getItem("activeGalaxyTour"));if(a&&(a=TOURS.hooked_tour_from_data(a),a&&a.steps&&window&&window.self===window.top)){var b=new Tour(_.extend({steps:a.steps},TOURS.tour_opts));b.init(),b.restart()}});
function replace_big_select_inputs(a,b,c){function d(a){var b=$(a),c={placeholder:"Click to select",closeOnSelect:!b.is("[MULTIPLE]"),dropdownAutoWidth:!0,containerCssClass:"select2-minwidth"};return a.select2(c)}jQuery.fn.select2&&(void 0===a&&(a=20),void 0===b&&(b=3e3),c=c||$("select"),c.each(function(){var c=$(this).not("[multiple]"),e=c.find("option").length;a>e||e>b||c.hasClass("no-autocomplete")||d(c)}))}function init_refresh_on_change(){$("select[refresh_on_change='true']").off("change").change(function(){var a=$(this),b=a.val(),c=a.attr("refresh_on_change_values");if(c){c=c.split(",");var d=a.attr("last_selected_value");if(-1===$.inArray(b,c)&&-1===$.inArray(d,c))return}$(window).trigger("refresh_on_change"),$(document).trigger("convert_to_values"),a.get(0).form.submit()}),$(":checkbox[refresh_on_change='true']").off("click").click(function(){var a=$(this),b=a.val(),c=a.attr("refresh_on_change_values");if(c){c=c.split(",");var d=a.attr("last_selected_value");if(-1===$.inArray(b,c)&&-1===$.inArray(d,c))return}$(window).trigger("refresh_on_change"),a.get(0).form.submit()}),$("a[confirm]").off("click").click(function(){return confirm($(this).attr("confirm"))})}window.jQuery=jQuery,window.$=jQuery,window._=_,window.Backbone=Backbone,window.panels=require("layout/panel"),_.extend(window,require("layout/modal")),window.async_save_text=require("utils/async-save-text");var POPUPMENU=require("ui/popupmenu");window.make_popupmenu=POPUPMENU.make_popupmenu,window.make_popup_menus=POPUPMENU.make_popup_menus,window.toolform=require("mvc/tool/tool-form"),window.init_tag_click_function=require("ui/autocom_tagging");var TOURS=require("mvc/tours"),QUERY_STRING=require("utils/query-string-parsing");window.init_refresh_on_change=init_refresh_on_change,$(document).ready(function(){init_refresh_on_change(),$.fn.tooltip&&($(".unified-panel-header [title]").tooltip({placement:"bottom"}),$("[title]").tooltip()),make_popup_menus(),replace_big_select_inputs(20,1500),$("a").click(function(){var a=$(this),b=parent.frames&&parent.frames.galaxy_main;if("galaxy_main"==a.attr("target")&&!b){var c=a.attr("href");c+=-1==c.indexOf("?")?"?":"&",c+="use_panels=True",a.attr("href",c),a.attr("target","_self")}return a});var a=JSON.parse(sessionStorage.getItem("activeGalaxyTour"));if(a&&(a=TOURS.hooked_tour_from_data(a),a&&a.steps&&window&&window.self===window.top)){var b=new Tour(_.extend({steps:a.steps},TOURS.tour_opts));b.init(),b.restart()}});
//# sourceMappingURL=../maps/onload.js.map
File diff suppressed because one or more lines are too long
@@ -78,6 +78,7 @@
<div class="toolTitle"><a href="${h.url_for( controller='admin', action='review_tool_migration_stages' )}" target="galaxy_main">Review tool migration stages</a></div>
<div class="toolTitle"><a href="${h.url_for( controller='admin', action='tool_errors' )}" target="galaxy_main">View Tool Error Logs</a></div>
<div class="toolTitle"><a href="${h.url_for( controller='admin', action='sanitize_whitelist' )}" target="galaxy_main">Manage Display Whitelist</a></div>
<div class="toolTitle"><a href="${h.url_for( controller='admin', action='manage_tool_dependencies' )}" target="galaxy_main">Manage Tool Dependencies</a></div>
</div>
</div>
<div class="toolSectionPad"></div>
@@ -0,0 +1,114 @@
<%inherit file="/base.mako"/>
<%namespace file="/webapps/tool_shed/repository/common.mako" import="render_dependency_status"/>
<%namespace file="/message.mako" import="render_msg" />
<%def name="render_tool_dependencies( requirements_status, ctr=False, ncols_extra=4, show_environment_path=False )">
%for i, dependency in enumerate(requirements_status):
%if i != 0:
</tr>
%if ctr % 2 == 1:
<tr class="odd_row">
%else:
<tr class="tr">
%endif
%for i in range(ncols_extra-1):
<td></td>
%endfor
%endif
%if show_environment_path:
<td>${dependency.get('environment_path', '') | h}</td>
%endif
${render_dependency_status(dependency)}
%endfor
</%def>
<%def name="render_tool_centric_table( tools, requirements_status)">
<tr>
<th bgcolor="#D8D8D8">Install</th>
<th bgcolor="#D8D8D8">Name</th>
<th bgcolor="#D8D8D8">ID</th>
<th bgcolor="#D8D8D8">Requirement</th>
<th bgcolor="#D8D8D8">Version</th>
<th bgcolor="#D8D8D8">Resolver</th>
<th bgcolor="#D8D8D8">Exact</th>
<th bgcolor="#D8D8D8"></th>
</tr>
<% ctr = 0 %>
%for tool in tools.values():
%if tool.tool_requirements:
%if ctr % 2 == 1:
<tr class="odd_row">
%else:
<tr class="tr">
%endif
<td>
<input type="checkbox" name="install_for_tools" value="${tool.id}"/>
</td>
<td>${ tool.name | h }</td>
<td>${ tool.id | h }</td>
${render_tool_dependencies( requirements_status[tool.tool_requirements], ctr=ctr) }
</tr>
<% ctr += 1 %>
%endif
%endfor
</%def>
<%def name="render_dependencies_details( tools, requirements_status, tool_ids_by_requirements)">
<tr>
<th bgcolor="#D8D8D8">Install</th>
<th bgcolor="#D8D8D8">Used by</th>
<th bgcolor="#D8D8D8">Environment Path</th>
<th bgcolor="#D8D8D8">Requirement</th>
<th bgcolor="#D8D8D8">Version</th>
<th bgcolor="#D8D8D8">Resolver</th>
<th bgcolor="#D8D8D8">Exact</th>
<th bgcolor="#D8D8D8"></th>
</tr>
<% ctr = 0 %>
%for requirements, r_status in requirements_status.items():
%if requirements:
<% tool_ids = tool_ids_by_requirements[requirements] %>
%if ctr % 2 == 1:
<tr class="odd_row">
%else:
<tr class="tr">
%endif
<td>
<input type="checkbox" name="install_for_tools" value="${tool_ids[0]}"/>
</td>
<td>${ ", ".join([tools[tid].name for tid in tool_ids]) | h }</td>
${render_tool_dependencies( r_status, ctr=ctr, show_environment_path=True, ncols_extra=3) }
</tr>
%endif
<% ctr += 1 %>
%endfor
</%def>
%if message:
${render_msg( message, status )}
%endif
<h2>Manage Tool Dependencies</h2>
<p>This page gives an overview of all tool dependencies required by all tools currently loaded, including tools not installed through the Tool Shed.</p>
<form name="manage_tool_dependencies" action="${h.url_for( controller='admin', action='manage_tool_dependencies' )}">
%if viewkey == "Switch to tool-centric view":
<input type="submit" name="viewkey" value="Switch to details view"/>
<div class="toolForm">
<div class="toolFormTitle">Tool-centric dependencies</div>
<div class="toolFormBody">
<table class="manage-table colored" border="0" cellspacing="0" cellpadding="0" width="100%">
${render_tool_centric_table(tools, requirements_status)}
%else:
<input type="submit" name="viewkey" value="Switch to tool-centric view"/>
<div class="toolForm">
<div class="toolFormTitle">Dependency details</div>
<div class="toolFormBody">
<table class="manage-table colored" border="0" cellspacing="0" cellpadding="0" width="100%">
${render_dependencies_details(tools, requirements_status, tool_ids_by_requirements)}
%endif
</table>
</div>
</div>
<input type="submit" name="install_dependencies" value="Install checked dependencies using Conda"/>
</form>
@@ -1026,6 +1026,38 @@
%>
</%def>
<%def name="render_dependency_status( dependency, prepare_for_install=False)">
<td>${dependency['name'] | h}</td>
<td>${dependency['version'] | h}</td>
%if not prepare_for_install:
%if dependency['dependency_type']:
<td>${dependency['dependency_type'].title() | h}</td>
%else:
<td>${dependency['dependency_type'] | h}</td>
%endif
<td>${dependency['exact'] | h}</td>
%endif
%if dependency['dependency_type'] == None:
<td>
<img src="${h.url_for('/static')}/images/icon_error_sml.gif" title='Dependency not resolved'/>
%if prepare_for_install:
Not Installed
%endif
</td>
%elif not dependency['exact']:
<td>
<img src="${h.url_for('/static')}/images/icon_warning_sml.gif" title='Dependency resolved, but version ${dependency['version']} not found'/>
</td>
%else:
<td>
<img src="${h.url_for('/static')}/june_2007_style/blue/ok_small.png"/>
%if prepare_for_install:
Installed through ${dependency['dependency_type'].title() | h}
%endif
</td>
%endif
</%def>
<%def name="render_tool_dependency_resolver( requirements_status, prepare_for_install=False )">
<tr class="datasetRow">
<td style="padding-left: 20 px;">
@@ -1043,37 +1075,8 @@
</head>
<body>
%for dependency in requirements_status:
${render_dependency_status(dependency, prepare_for_install)}
<tr>
<td>${dependency['name'] | h}</td>
<td>${dependency['version'] | h}</td>
%if not prepare_for_install:
%if dependency['dependency_type']:
<td>${dependency['dependency_type'].title() | h}</td>
%else:
<td>${dependency['dependency_type'] | h}</td>
%endif
<td>${dependency['exact'] | h}</td>
%endif
%if dependency['dependency_type'] == None:
<td>
<img src="${h.url_for('/static')}/images/icon_error_sml.gif" title='Dependency not resolved'/>
%if prepare_for_install:
Not Installed
%endif
</td>
%elif not dependency['exact']:
<td>
<img src="${h.url_for('/static')}/images/icon_warning_sml.gif" title='Dependency resolved, but version ${dependency['version']} not found'/>
</td>
%else:
<td>
<img src="${h.url_for('/static')}/june_2007_style/blue/ok_small.png"/>
%if prepare_for_install:
Installed through ${dependency['dependency_type'].title() | h}
%endif
</td>
%endif
</tr>
%endfor
</body>
</table>
+2 -3
View File
@@ -2,6 +2,5 @@ Galaxy Testing
==============
The Galaxy code base is large and contains many kinds of tests. Please
consult the [Galaxy
wiki](http://wiki.galaxyproject.org/Admin/Running%20Tests) for more
information on testing Galaxy.
run the command ``sh run_tests.sh --help`` from Galaxy's root for a
description of each test type and location.
+1 -3
View File
@@ -1005,9 +1005,7 @@ steps:
assert invocation[ 'state' ] != 'scheduled'
self.__review_paused_steps( uploaded_workflow_id, invocation_id, order_index=4, action=True )
time.sleep( 5 )
self.dataset_populator.wait_for_history( history_id, assert_ok=True )
self.wait_for_invocation_and_jobs( history_id, uploaded_workflow_id, invocation_id )
invocation = self._invocation_details( uploaded_workflow_id, invocation_id )
assert invocation[ 'state' ] == 'scheduled'
self.assertEqual("reviewed\n1\nreviewed\n4\n", self.dataset_populator.get_history_dataset_content( history_id ) )
+53 -14
View File
@@ -6,6 +6,7 @@ attribute.
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as ec
from selenium.webdriver.support.ui import WebDriverWait
@@ -14,6 +15,7 @@ UNSPECIFIED_TIMEOUT = object()
class HasDriver:
TimeoutException = TimeoutException
def assert_xpath(self, xpath):
assert self.driver.find_element_by_xpath(xpath)
@@ -30,36 +32,66 @@ class HasDriver:
assert len(self.driver.find_elements_by_css_selector(selector)) == 0
def wait_for_xpath(self, xpath):
wait = self.wait()
element = wait.until(ec.presence_of_element_located((By.XPATH, xpath)))
element = self._wait_on(
ec.presence_of_element_located((By.XPATH, xpath)),
"XPATH selector [%s] to become present" % xpath,
)
return element
def wait_for_xpath_visible(self, xpath):
wait = self.wait()
element = wait.until(ec.visibility_of_element_located((By.XPATH, xpath)))
element = self._wait_on(
ec.visibility_of_element_located((By.XPATH, xpath)),
"XPATH selector [%s] to become visible" % xpath,
)
return element
def wait_for_selector(self, selector):
wait = self.wait()
element = wait.until(ec.presence_of_element_located((By.CSS_SELECTOR, selector)))
element = self._wait_on(
ec.presence_of_element_located((By.CSS_SELECTOR, selector)),
"CSS selector [%s] to become present" % selector,
)
return element
def wait_for_selector_visible(self, selector):
wait = self.wait()
return wait.until(ec.visibility_of_element_located((By.CSS_SELECTOR, selector)))
element = self._wait_on(
ec.visibility_of_element_located((By.CSS_SELECTOR, selector)),
"CSS selector [%s] to become visible" % selector,
)
return element
def wait_for_selector_clickable(self, selector):
element = self._wait_on(
ec.element_to_be_clickable((By.CSS_SELECTOR, selector)),
"CSS selector [%s] to become clickable" % selector,
)
return element
def wait_for_selector_absent_or_hidden(self, selector):
wait = self.wait()
return wait.until(ec.invisibility_of_element_located((By.CSS_SELECTOR, selector)))
element = self._wait_on(
ec.invisibility_of_element_located((By.CSS_SELECTOR, selector)),
"CSS selector [%s] to become absent or hidden" % selector,
)
return element
def wait_for_selector_absent(self, selector):
wait = self.wait()
return wait.until(lambda driver: len(driver.find_elements_by_css_selector(selector)) == 0)
element = self._wait_on(
lambda driver: len(driver.find_elements_by_css_selector(selector)) == 0,
"CSS selector [%s] to become absent" % selector,
)
return element
def wait_for_id(self, id):
return self._wait_on(
ec.presence_of_element_located((By.ID, id)),
"presence of DOM ID [%s]" % id,
)
def _wait_on(self, condition, on_str=None):
if on_str is None:
on_str = str(condition)
message = "Timeout waiting on %s." % on_str
wait = self.wait()
element = wait.until(ec.presence_of_element_located((By.ID, id)))
return element
return wait.until(condition, message)
def action_chains(self):
return ActionChains(self.driver)
@@ -95,3 +127,10 @@ class HasDriver:
def click_submit(self, form):
submit_button = form.find_element_by_css_selector("input[type='submit']")
submit_button.click()
def prepend_timeout_message(self, timeout_exception, message):
return TimeoutException(
msg=message + (timeout_exception.msg or ''),
screen=timeout_exception.screen,
stacktrace=timeout_exception.stacktrace,
)
+44 -3
View File
@@ -107,7 +107,10 @@ class NavigatesGalaxy(HasDriver):
assert final_state == "ok", final_state
return final_state
def history_panel_wait_for_hid_ok(self, hid, timeout=30):
def history_panel_wait_for_hid_ok(self, hid, timeout=60):
self.history_panel_wait_for_hid_state(hid, 'ok', timeout=timeout)
def history_panel_wait_for_hid_state(self, hid, state, timeout=60):
current_history_id = self.current_history_id()
def history_has_hid(driver):
@@ -117,8 +120,21 @@ class NavigatesGalaxy(HasDriver):
self.wait(timeout).until(history_has_hid)
contents = self.api_get("histories/%s/contents" % current_history_id)
history_item = [d for d in contents if d["hid"] == hid][0]
history_item_selector_okay = "#%s-%s.state-ok" % (history_item["history_content_type"], history_item["id"])
self.wait_for_selector_visible(history_item_selector_okay)
history_item_selector = "#%s-%s" % (history_item["history_content_type"], history_item["id"])
self.wait_for_selector_visible(history_item_selector)
history_item_selector_state = "%s.state-%s" % (history_item_selector, state)
try:
self.wait_for_selector_visible(history_item_selector_state)
except self.TimeoutException as e:
history_item = self.driver.find_element_by_css_selector(history_item_selector)
current_state = "UNKNOWN"
classes = history_item.get_attribute("class").split(" ")
for clazz in classes:
if clazz.startswith("state-"):
current_state = clazz[len("state-"):]
template = "Failed waiting on history item %d state to change to [%s] current state [%s]. "
message = template % (hid, state, current_state)
raise self.prepend_timeout_message(e, message)
def get_logged_in_user(self):
return self.api_get("users/current")
@@ -301,6 +317,31 @@ class NavigatesGalaxy(HasDriver):
menu_selector = self.test_data["historyOptions"]["selectors"]["menu"]
return menu_selector
def history_panel_multi_operations_selector(self):
return self.test_data["historyPanel"]["selectors"]["history"]["multiOperationsIcon"]
def history_panel_multi_operations_show(self):
operations_selector = self.history_panel_multi_operations_selector()
operations_element = self.wait_for_selector_clickable(operations_selector)
operations_element.click()
def history_panel_muli_operation_select_hid(self, hid):
item_selector = self.history_panel_item_selector(hid, wait=True)
operation_radio_selector = "%s .selector" % item_selector
element = self.wait_for_selector_clickable(operation_radio_selector)
element.click()
def history_panel_multi_operation_action_selector(self):
return self.test_data["historyPanel"]["selectors"]["history"]["multiOperationsActionBtn"]
def history_panel_multi_operation_action_click(self, action):
time.sleep(5)
button_element = self.wait_for_selector_clickable(self.history_panel_multi_operation_action_selector())
button_element.click()
menu_element = self.wait_for_selector_visible(".list-action-menu.open")
action_element = menu_element.find_element_by_link_text(action)
action_element.click()
def history_panel_item_selector(self, hid, wait=False):
current_history_id = self.current_history_id()
contents = self.api_get("histories/%s/contents" % current_history_id)
+2
View File
@@ -107,6 +107,8 @@ historyPanel:
nameEditableTextInput : '.name input'
subtitle : '.subtitle'
size : '.history-size'
multiOperationsIcon: '.actions .show-selectors-btn'
multiOperationsActionBtn: '.list-action-menu .list-action-menu-btn'
tagIcon : '.actions .history-tag-btn'
tagArea : '.controls .tags-display'
annoIcon : '.actions .history-annotate-btn'
@@ -0,0 +1,39 @@
from .framework import SeleniumTestCase
from .framework import selenium_test
class CollectionBuildersTestCase(SeleniumTestCase):
ensure_registered = True
@selenium_test
def test_build_list_simple(self):
self.perform_upload(self.get_filename("1.fasta"))
self.history_panel_wait_for_hid_ok(1)
self.history_panel_multi_operations_show()
self.history_panel_muli_operation_select_hid(1)
self.history_panel_multi_operation_action_click("Build Dataset List")
name_element = self.wait_for_selector_visible("input.collection-name")
name_element.send_keys("my cool list")
create_element = self.wait_for_selector_clickable("button.create-collection")
create_element.click()
self.history_panel_wait_for_hid_ok(2)
@selenium_test
def test_build_pair_simple(self):
self.perform_upload(self.get_filename("1.tabular"))
self.perform_upload(self.get_filename("2.tabular"))
self.history_panel_wait_for_hid_ok(1)
self.history_panel_wait_for_hid_ok(2)
self.history_panel_multi_operations_show()
self.history_panel_muli_operation_select_hid(1)
self.history_panel_muli_operation_select_hid(2)
self.history_panel_multi_operation_action_click("Build Dataset Pair")
name_element = self.wait_for_selector_visible("input.collection-name")
name_element.send_keys("my awesome pair")
create_element = self.wait_for_selector_clickable("button.create-collection")
create_element.click()
self.history_panel_wait_for_hid_ok(3)
+1 -1
View File
@@ -204,11 +204,11 @@ class MockHistoryDatasetAssociation( object ):
)
self.dbkey = "hg19"
self.implicitly_converted_parent_datasets = False
self.name = name
self.hid = id
self.id = id
self.children = []
self.tags = []
@property
def state( self ):