diff --git a/.ci/pep8_sources.txt b/.ci/pep8_sources.txt
index 0ff00105a65..01ed8dca4cd 100644
--- a/.ci/pep8_sources.txt
+++ b/.ci/pep8_sources.txt
@@ -19,10 +19,11 @@ lib/galaxy/tools/toolbox
lib/galaxy/tools/{errors,loader_directory,test}.py
lib/galaxy/util/{__init__,json,permutations,plugin_config,properties,simplegraph,sockets,sleeper,streamball,submodules}.py
lib/galaxy/web/{proxy,security}
+lib/galaxy/web/base/{__init__,interactive_environments}.py
lib/galaxy/web/formatting.py
lib/galaxy/webapps/__init__.py
lib/galaxy/webapps/galaxy/__init__.py
-lib/galaxy/webapps/galaxy/api/{__init__,dataset_collections,datatypes,job_files,provenance,users}.py
+lib/galaxy/webapps/galaxy/api/{__init__,authenticate,dataset_collections,datatypes,folder_contents,folders,lda_datasets,job_files,libraries,library_contents,provenance,remote_files,search,users}.py
lib/galaxy/webapps/galaxy/controllers/{__init__,admin,cloudlaunch,workflow}.py
lib/galaxy/webapps/reports/app.py
lib/galaxy/webapps/reports/controllers/{__init__,jobs,query,workflows}.py
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 38f5c527afd..7888a623415 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,8 +1,9 @@
# Contributing
-This document briefly describes how to contribute to the
-galaxy-central core project - also checkout our 2013 Galaxy Community
-Conference presentation] on the topic
+This document briefly describes how to contribute to the [core
+galaxy project](https://github.com/galaxyproject/galaxy) -
+also checkout our 2013 Galaxy Community
+Conference presentation on the topic
([video](http://vimeo.com/channels/581875/73486255),
[presentation](https://wiki.galaxyproject.org/Documents/Presentations/GCC2013?action=AttachFile&do=view&target=BakerContribute.pdf)). For
information on contributing more broadly to the Galaxy ecosystem and a
@@ -25,6 +26,11 @@ the [development mailing list](http://dev.list.galaxyproject.org/).
## How to Contribute
+* All changes to the [core galaxy project](https://github.com/galaxyproject/galaxy)
+ should be made through pull requests to this repository except when
+ serious security vulnerabilities must simulatenously be made to multiple
+ previously released versions of Galaxy.
+
* If you are new to Git - please check out the very useful tutorials on the [GitHub training hub](https://training.github.com/kit/)
* Make sure you have a free [GitHub account](https://github.com/)
@@ -42,7 +48,7 @@ the [development mailing list](http://dev.list.galaxyproject.org/).
checkout dev`).
* Most bug fixes to previously release components (things in galaxy-dist)
- should be made against the `master` branch (`git checkout master`).
+ should be made against the recent `release_XX.XX` branch (`git checkout release_XX.XX`).
* Serious security problems should not be fixed via pull request -
please responsibly disclose these by e-mailing them (with or
@@ -66,11 +72,12 @@ the [development mailing list](http://dev.list.galaxyproject.org/).
tests as part of the pull request review process and may request the
output of these tests.
-* Commit and push your changes to your Bitbucket fork.
+* Commit and push your changes to your
+ [fork](https://help.github.com/articles/pushing-to-a-remote/).
* Open a [pull
- request](https://confluence.atlassian.com/display/BITBUCKET/Fork+a+Repo,+Compare+Code,+and+Create+a+Pull+Request)
- with these changes. You pull request message should include:
+ request](https://help.github.com/articles/creating-a-pull-request/)
+ with these changes. You pull request message ideally should include:
* A description of why the change should be made.
diff --git a/client/GruntFile.js b/client/GruntFile.js
index 3065871ef90..918c2dec8af 100644
--- a/client/GruntFile.js
+++ b/client/GruntFile.js
@@ -85,7 +85,6 @@ module.exports = function(grunt) {
"ravenjs": [ "dist/raven.js", "raven.js" ],
"underscore": [ "underscore.js", "underscore.js" ],
"handlebars": [ "handlebars.runtime.js", "handlebars.runtime.js" ],
- "lunr.js": [ "lunr.js", "lunr.js" ],
"backbone": [ "backbone.js", "backbone/backbone.js" ],
// these need to be updated and tested
diff --git a/client/bower.json b/client/bower.json
index f5f22afbdfb..c1c9f187fa9 100644
--- a/client/bower.json
+++ b/client/bower.json
@@ -32,8 +32,7 @@
"jquery-ui": "git://github.com/jquery/jquery-ui.git#~1.11.2",
"threedubmedia.jquery.event": "*",
"handlebars": "~2.0.0",
- "jquery-migrate": "~1.2.1",
- "lunr.js": "git://github.com/olivernn/lunr.js.git#~0.5.7"
+ "jquery-migrate": "~1.2.1"
},
"resolutions": {
"jquery": "~1.11.1"
diff --git a/client/galaxy/scripts/libs/lunr.js b/client/galaxy/scripts/libs/lunr.js
deleted file mode 100644
index b5bacd97960..00000000000
--- a/client/galaxy/scripts/libs/lunr.js
+++ /dev/null
@@ -1,1910 +0,0 @@
-/**
- * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.5.7
- * Copyright (C) 2014 Oliver Nightingale
- * MIT Licensed
- * @license
- */
-
-(function(){
-
-/**
- * Convenience function for instantiating a new lunr index and configuring it
- * with the default pipeline functions and the passed config function.
- *
- * When using this convenience function a new index will be created with the
- * following functions already in the pipeline:
- *
- * lunr.StopWordFilter - filters out any stop words before they enter the
- * index
- *
- * lunr.stemmer - stems the tokens before entering the index.
- *
- * Example:
- *
- * var idx = lunr(function () {
- * this.field('title', 10)
- * this.field('tags', 100)
- * this.field('body')
- *
- * this.ref('cid')
- *
- * this.pipeline.add(function () {
- * // some custom pipeline function
- * })
- *
- * })
- *
- * @param {Function} config A function that will be called with the new instance
- * of the lunr.Index as both its context and first parameter. It can be used to
- * customize the instance of new lunr.Index.
- * @namespace
- * @module
- * @returns {lunr.Index}
- *
- */
-var lunr = function (config) {
- var idx = new lunr.Index
-
- idx.pipeline.add(
- lunr.trimmer,
- lunr.stopWordFilter,
- lunr.stemmer
- )
-
- if (config) config.call(idx, idx)
-
- return idx
-}
-
-lunr.version = "0.5.7"
-/*!
- * lunr.utils
- * Copyright (C) 2014 Oliver Nightingale
- */
-
-/**
- * A namespace containing utils for the rest of the lunr library
- */
-lunr.utils = {}
-
-/**
- * Print a warning message to the console.
- *
- * @param {String} message The message to be printed.
- * @memberOf Utils
- */
-lunr.utils.warn = (function (global) {
- return function (message) {
- if (global.console && console.warn) {
- console.warn(message)
- }
- }
-})(this)
-
-/*!
- * lunr.EventEmitter
- * Copyright (C) 2014 Oliver Nightingale
- */
-
-/**
- * lunr.EventEmitter is an event emitter for lunr. It manages adding and removing event handlers and triggering events and their handlers.
- *
- * @constructor
- */
-lunr.EventEmitter = function () {
- this.events = {}
-}
-
-/**
- * Binds a handler function to a specific event(s).
- *
- * Can bind a single function to many different events in one call.
- *
- * @param {String} [eventName] The name(s) of events to bind this function to.
- * @param {Function} handler The function to call when an event is fired.
- * @memberOf EventEmitter
- */
-lunr.EventEmitter.prototype.addListener = function () {
- var args = Array.prototype.slice.call(arguments),
- fn = args.pop(),
- names = args
-
- if (typeof fn !== "function") throw new TypeError ("last argument must be a function")
-
- names.forEach(function (name) {
- if (!this.hasHandler(name)) this.events[name] = []
- this.events[name].push(fn)
- }, this)
-}
-
-/**
- * Removes a handler function from a specific event.
- *
- * @param {String} eventName The name of the event to remove this function from.
- * @param {Function} handler The function to remove from an event.
- * @memberOf EventEmitter
- */
-lunr.EventEmitter.prototype.removeListener = function (name, fn) {
- if (!this.hasHandler(name)) return
-
- var fnIndex = this.events[name].indexOf(fn)
- this.events[name].splice(fnIndex, 1)
-
- if (!this.events[name].length) delete this.events[name]
-}
-
-/**
- * Calls all functions bound to the given event.
- *
- * Additional data can be passed to the event handler as arguments to `emit`
- * after the event name.
- *
- * @param {String} eventName The name of the event to emit.
- * @memberOf EventEmitter
- */
-lunr.EventEmitter.prototype.emit = function (name) {
- if (!this.hasHandler(name)) return
-
- var args = Array.prototype.slice.call(arguments, 1)
-
- this.events[name].forEach(function (fn) {
- fn.apply(undefined, args)
- })
-}
-
-/**
- * Checks whether a handler has ever been stored against an event.
- *
- * @param {String} eventName The name of the event to check.
- * @private
- * @memberOf EventEmitter
- */
-lunr.EventEmitter.prototype.hasHandler = function (name) {
- return name in this.events
-}
-
-/*!
- * lunr.tokenizer
- * Copyright (C) 2014 Oliver Nightingale
- */
-
-/**
- * A function for splitting a string into tokens ready to be inserted into
- * the search index.
- *
- * @module
- * @param {String} obj The string to convert into tokens
- * @returns {Array}
- */
-lunr.tokenizer = function (obj) {
- if (!arguments.length || obj == null || obj == undefined) return []
- if (Array.isArray(obj)) return obj.map(function (t) { return t.toLowerCase() })
-
- var str = obj.toString().replace(/^\s+/, '')
-
- for (var i = str.length - 1; i >= 0; i--) {
- if (/\S/.test(str.charAt(i))) {
- str = str.substring(0, i + 1)
- break
- }
- }
-
- return str
- .split(/(?:\s+|\-)/)
- .filter(function (token) {
- return !!token
- })
- .map(function (token) {
- return token.toLowerCase()
- })
-}
-/*!
- * lunr.Pipeline
- * Copyright (C) 2014 Oliver Nightingale
- */
-
-/**
- * lunr.Pipelines maintain an ordered list of functions to be applied to all
- * tokens in documents entering the search index and queries being ran against
- * the index.
- *
- * An instance of lunr.Index created with the lunr shortcut will contain a
- * pipeline with a stop word filter and an English language stemmer. Extra
- * functions can be added before or after either of these functions or these
- * default functions can be removed.
- *
- * When run the pipeline will call each function in turn, passing a token, the
- * index of that token in the original list of all tokens and finally a list of
- * all the original tokens.
- *
- * The output of functions in the pipeline will be passed to the next function
- * in the pipeline. To exclude a token from entering the index the function
- * should return undefined, the rest of the pipeline will not be called with
- * this token.
- *
- * For serialisation of pipelines to work, all functions used in an instance of
- * a pipeline should be registered with lunr.Pipeline. Registered functions can
- * then be loaded. If trying to load a serialised pipeline that uses functions
- * that are not registered an error will be thrown.
- *
- * If not planning on serialising the pipeline then registering pipeline functions
- * is not necessary.
- *
- * @constructor
- */
-lunr.Pipeline = function () {
- this._stack = []
-}
-
-lunr.Pipeline.registeredFunctions = {}
-
-/**
- * Register a function with the pipeline.
- *
- * Functions that are used in the pipeline should be registered if the pipeline
- * needs to be serialised, or a serialised pipeline needs to be loaded.
- *
- * Registering a function does not add it to a pipeline, functions must still be
- * added to instances of the pipeline for them to be used when running a pipeline.
- *
- * @param {Function} fn The function to check for.
- * @param {String} label The label to register this function with
- * @memberOf Pipeline
- */
-lunr.Pipeline.registerFunction = function (fn, label) {
- if (label in this.registeredFunctions) {
- lunr.utils.warn('Overwriting existing registered function: ' + label)
- }
-
- fn.label = label
- lunr.Pipeline.registeredFunctions[fn.label] = fn
-}
-
-/**
- * Warns if the function is not registered as a Pipeline function.
- *
- * @param {Function} fn The function to check for.
- * @private
- * @memberOf Pipeline
- */
-lunr.Pipeline.warnIfFunctionNotRegistered = function (fn) {
- var isRegistered = fn.label && (fn.label in this.registeredFunctions)
-
- if (!isRegistered) {
- lunr.utils.warn('Function is not registered with pipeline. This may cause problems when serialising the index.\n', fn)
- }
-}
-
-/**
- * Loads a previously serialised pipeline.
- *
- * All functions to be loaded must already be registered with lunr.Pipeline.
- * If any function from the serialised data has not been registered then an
- * error will be thrown.
- *
- * @param {Object} serialised The serialised pipeline to load.
- * @returns {lunr.Pipeline}
- * @memberOf Pipeline
- */
-lunr.Pipeline.load = function (serialised) {
- var pipeline = new lunr.Pipeline
-
- serialised.forEach(function (fnName) {
- var fn = lunr.Pipeline.registeredFunctions[fnName]
-
- if (fn) {
- pipeline.add(fn)
- } else {
- throw new Error ('Cannot load un-registered function: ' + fnName)
- }
- })
-
- return pipeline
-}
-
-/**
- * Adds new functions to the end of the pipeline.
- *
- * Logs a warning if the function has not been registered.
- *
- * @param {Function} functions Any number of functions to add to the pipeline.
- * @memberOf Pipeline
- */
-lunr.Pipeline.prototype.add = function () {
- var fns = Array.prototype.slice.call(arguments)
-
- fns.forEach(function (fn) {
- lunr.Pipeline.warnIfFunctionNotRegistered(fn)
- this._stack.push(fn)
- }, this)
-}
-
-/**
- * Adds a single function after a function that already exists in the
- * pipeline.
- *
- * Logs a warning if the function has not been registered.
- *
- * @param {Function} existingFn A function that already exists in the pipeline.
- * @param {Function} newFn The new function to add to the pipeline.
- * @memberOf Pipeline
- */
-lunr.Pipeline.prototype.after = function (existingFn, newFn) {
- lunr.Pipeline.warnIfFunctionNotRegistered(newFn)
-
- var pos = this._stack.indexOf(existingFn) + 1
- this._stack.splice(pos, 0, newFn)
-}
-
-/**
- * Adds a single function before a function that already exists in the
- * pipeline.
- *
- * Logs a warning if the function has not been registered.
- *
- * @param {Function} existingFn A function that already exists in the pipeline.
- * @param {Function} newFn The new function to add to the pipeline.
- * @memberOf Pipeline
- */
-lunr.Pipeline.prototype.before = function (existingFn, newFn) {
- lunr.Pipeline.warnIfFunctionNotRegistered(newFn)
-
- var pos = this._stack.indexOf(existingFn)
- this._stack.splice(pos, 0, newFn)
-}
-
-/**
- * Removes a function from the pipeline.
- *
- * @param {Function} fn The function to remove from the pipeline.
- * @memberOf Pipeline
- */
-lunr.Pipeline.prototype.remove = function (fn) {
- var pos = this._stack.indexOf(fn)
- this._stack.splice(pos, 1)
-}
-
-/**
- * Runs the current list of functions that make up the pipeline against the
- * passed tokens.
- *
- * @param {Array} tokens The tokens to run through the pipeline.
- * @returns {Array}
- * @memberOf Pipeline
- */
-lunr.Pipeline.prototype.run = function (tokens) {
- var out = [],
- tokenLength = tokens.length,
- stackLength = this._stack.length
-
- for (var i = 0; i < tokenLength; i++) {
- var token = tokens[i]
-
- for (var j = 0; j < stackLength; j++) {
- token = this._stack[j](token, i, tokens)
- if (token === void 0) break
- };
-
- if (token !== void 0) out.push(token)
- };
-
- return out
-}
-
-/**
- * Resets the pipeline by removing any existing processors.
- *
- * @memberOf Pipeline
- */
-lunr.Pipeline.prototype.reset = function () {
- this._stack = []
-}
-
-/**
- * Returns a representation of the pipeline ready for serialisation.
- *
- * Logs a warning if the function has not been registered.
- *
- * @returns {Array}
- * @memberOf Pipeline
- */
-lunr.Pipeline.prototype.toJSON = function () {
- return this._stack.map(function (fn) {
- lunr.Pipeline.warnIfFunctionNotRegistered(fn)
-
- return fn.label
- })
-}
-/*!
- * lunr.Vector
- * Copyright (C) 2014 Oliver Nightingale
- */
-
-/**
- * lunr.Vectors implement vector related operations for
- * a series of elements.
- *
- * @constructor
- */
-lunr.Vector = function () {
- this._magnitude = null
- this.list = undefined
- this.length = 0
-}
-
-/**
- * lunr.Vector.Node is a simple struct for each node
- * in a lunr.Vector.
- *
- * @private
- * @param {Number} The index of the node in the vector.
- * @param {Object} The data at this node in the vector.
- * @param {lunr.Vector.Node} The node directly after this node in the vector.
- * @constructor
- * @memberOf Vector
- */
-lunr.Vector.Node = function (idx, val, next) {
- this.idx = idx
- this.val = val
- this.next = next
-}
-
-/**
- * Inserts a new value at a position in a vector.
- *
- * @param {Number} The index at which to insert a value.
- * @param {Object} The object to insert in the vector.
- * @memberOf Vector.
- */
-lunr.Vector.prototype.insert = function (idx, val) {
- var list = this.list
-
- if (!list) {
- this.list = new lunr.Vector.Node (idx, val, list)
- return this.length++
- }
-
- var prev = list,
- next = list.next
-
- while (next != undefined) {
- if (idx < next.idx) {
- prev.next = new lunr.Vector.Node (idx, val, next)
- return this.length++
- }
-
- prev = next, next = next.next
- }
-
- prev.next = new lunr.Vector.Node (idx, val, next)
- return this.length++
-}
-
-/**
- * Calculates the magnitude of this vector.
- *
- * @returns {Number}
- * @memberOf Vector
- */
-lunr.Vector.prototype.magnitude = function () {
- if (this._magniture) return this._magnitude
- var node = this.list,
- sumOfSquares = 0,
- val
-
- while (node) {
- val = node.val
- sumOfSquares += val * val
- node = node.next
- }
-
- return this._magnitude = Math.sqrt(sumOfSquares)
-}
-
-/**
- * Calculates the dot product of this vector and another vector.
- *
- * @param {lunr.Vector} otherVector The vector to compute the dot product with.
- * @returns {Number}
- * @memberOf Vector
- */
-lunr.Vector.prototype.dot = function (otherVector) {
- var node = this.list,
- otherNode = otherVector.list,
- dotProduct = 0
-
- while (node && otherNode) {
- if (node.idx < otherNode.idx) {
- node = node.next
- } else if (node.idx > otherNode.idx) {
- otherNode = otherNode.next
- } else {
- dotProduct += node.val * otherNode.val
- node = node.next
- otherNode = otherNode.next
- }
- }
-
- return dotProduct
-}
-
-/**
- * Calculates the cosine similarity between this vector and another
- * vector.
- *
- * @param {lunr.Vector} otherVector The other vector to calculate the
- * similarity with.
- * @returns {Number}
- * @memberOf Vector
- */
-lunr.Vector.prototype.similarity = function (otherVector) {
- return this.dot(otherVector) / (this.magnitude() * otherVector.magnitude())
-}
-/*!
- * lunr.SortedSet
- * Copyright (C) 2014 Oliver Nightingale
- */
-
-/**
- * lunr.SortedSets are used to maintain an array of uniq values in a sorted
- * order.
- *
- * @constructor
- */
-lunr.SortedSet = function () {
- this.length = 0
- this.elements = []
-}
-
-/**
- * Loads a previously serialised sorted set.
- *
- * @param {Array} serialisedData The serialised set to load.
- * @returns {lunr.SortedSet}
- * @memberOf SortedSet
- */
-lunr.SortedSet.load = function (serialisedData) {
- var set = new this
-
- set.elements = serialisedData
- set.length = serialisedData.length
-
- return set
-}
-
-/**
- * Inserts new items into the set in the correct position to maintain the
- * order.
- *
- * @param {Object} The objects to add to this set.
- * @memberOf SortedSet
- */
-lunr.SortedSet.prototype.add = function () {
- Array.prototype.slice.call(arguments).forEach(function (element) {
- if (~this.indexOf(element)) return
- this.elements.splice(this.locationFor(element), 0, element)
- }, this)
-
- this.length = this.elements.length
-}
-
-/**
- * Converts this sorted set into an array.
- *
- * @returns {Array}
- * @memberOf SortedSet
- */
-lunr.SortedSet.prototype.toArray = function () {
- return this.elements.slice()
-}
-
-/**
- * Creates a new array with the results of calling a provided function on every
- * element in this sorted set.
- *
- * Delegates to Array.prototype.map and has the same signature.
- *
- * @param {Function} fn The function that is called on each element of the
- * set.
- * @param {Object} ctx An optional object that can be used as the context
- * for the function fn.
- * @returns {Array}
- * @memberOf SortedSet
- */
-lunr.SortedSet.prototype.map = function (fn, ctx) {
- return this.elements.map(fn, ctx)
-}
-
-/**
- * Executes a provided function once per sorted set element.
- *
- * Delegates to Array.prototype.forEach and has the same signature.
- *
- * @param {Function} fn The function that is called on each element of the
- * set.
- * @param {Object} ctx An optional object that can be used as the context
- * @memberOf SortedSet
- * for the function fn.
- */
-lunr.SortedSet.prototype.forEach = function (fn, ctx) {
- return this.elements.forEach(fn, ctx)
-}
-
-/**
- * Returns the index at which a given element can be found in the
- * sorted set, or -1 if it is not present.
- *
- * @param {Object} elem The object to locate in the sorted set.
- * @param {Number} start An optional index at which to start searching from
- * within the set.
- * @param {Number} end An optional index at which to stop search from within
- * the set.
- * @returns {Number}
- * @memberOf SortedSet
- */
-lunr.SortedSet.prototype.indexOf = function (elem, start, end) {
- var start = start || 0,
- end = end || this.elements.length,
- sectionLength = end - start,
- pivot = start + Math.floor(sectionLength / 2),
- pivotElem = this.elements[pivot]
-
- if (sectionLength <= 1) {
- if (pivotElem === elem) {
- return pivot
- } else {
- return -1
- }
- }
-
- if (pivotElem < elem) return this.indexOf(elem, pivot, end)
- if (pivotElem > elem) return this.indexOf(elem, start, pivot)
- if (pivotElem === elem) return pivot
-}
-
-/**
- * Returns the position within the sorted set that an element should be
- * inserted at to maintain the current order of the set.
- *
- * This function assumes that the element to search for does not already exist
- * in the sorted set.
- *
- * @param {Object} elem The elem to find the position for in the set
- * @param {Number} start An optional index at which to start searching from
- * within the set.
- * @param {Number} end An optional index at which to stop search from within
- * the set.
- * @returns {Number}
- * @memberOf SortedSet
- */
-lunr.SortedSet.prototype.locationFor = function (elem, start, end) {
- var start = start || 0,
- end = end || this.elements.length,
- sectionLength = end - start,
- pivot = start + Math.floor(sectionLength / 2),
- pivotElem = this.elements[pivot]
-
- if (sectionLength <= 1) {
- if (pivotElem > elem) return pivot
- if (pivotElem < elem) return pivot + 1
- }
-
- if (pivotElem < elem) return this.locationFor(elem, pivot, end)
- if (pivotElem > elem) return this.locationFor(elem, start, pivot)
-}
-
-/**
- * Creates a new lunr.SortedSet that contains the elements in the intersection
- * of this set and the passed set.
- *
- * @param {lunr.SortedSet} otherSet The set to intersect with this set.
- * @returns {lunr.SortedSet}
- * @memberOf SortedSet
- */
-lunr.SortedSet.prototype.intersect = function (otherSet) {
- var intersectSet = new lunr.SortedSet,
- i = 0, j = 0,
- a_len = this.length, b_len = otherSet.length,
- a = this.elements, b = otherSet.elements
-
- while (true) {
- if (i > a_len - 1 || j > b_len - 1) break
-
- if (a[i] === b[j]) {
- intersectSet.add(a[i])
- i++, j++
- continue
- }
-
- if (a[i] < b[j]) {
- i++
- continue
- }
-
- if (a[i] > b[j]) {
- j++
- continue
- }
- };
-
- return intersectSet
-}
-
-/**
- * Makes a copy of this set
- *
- * @returns {lunr.SortedSet}
- * @memberOf SortedSet
- */
-lunr.SortedSet.prototype.clone = function () {
- var clone = new lunr.SortedSet
-
- clone.elements = this.toArray()
- clone.length = clone.elements.length
-
- return clone
-}
-
-/**
- * Creates a new lunr.SortedSet that contains the elements in the union
- * of this set and the passed set.
- *
- * @param {lunr.SortedSet} otherSet The set to union with this set.
- * @returns {lunr.SortedSet}
- * @memberOf SortedSet
- */
-lunr.SortedSet.prototype.union = function (otherSet) {
- var longSet, shortSet, unionSet
-
- if (this.length >= otherSet.length) {
- longSet = this, shortSet = otherSet
- } else {
- longSet = otherSet, shortSet = this
- }
-
- unionSet = longSet.clone()
-
- unionSet.add.apply(unionSet, shortSet.toArray())
-
- return unionSet
-}
-
-/**
- * Returns a representation of the sorted set ready for serialisation.
- *
- * @returns {Array}
- * @memberOf SortedSet
- */
-lunr.SortedSet.prototype.toJSON = function () {
- return this.toArray()
-}
-/*!
- * lunr.Index
- * Copyright (C) 2014 Oliver Nightingale
- */
-
-/**
- * lunr.Index is object that manages a search index. It contains the indexes
- * and stores all the tokens and document lookups. It also provides the main
- * user facing API for the library.
- *
- * @constructor
- */
-lunr.Index = function () {
- this._fields = []
- this._ref = 'id'
- this.pipeline = new lunr.Pipeline
- this.documentStore = new lunr.Store
- this.tokenStore = new lunr.TokenStore
- this.corpusTokens = new lunr.SortedSet
- this.eventEmitter = new lunr.EventEmitter
-
- this._idfCache = {}
-
- this.on('add', 'remove', 'update', (function () {
- this._idfCache = {}
- }).bind(this))
-}
-
-/**
- * Bind a handler to events being emitted by the index.
- *
- * The handler can be bound to many events at the same time.
- *
- * @param {String} [eventName] The name(s) of events to bind the function to.
- * @param {Function} handler The serialised set to load.
- * @memberOf Index
- */
-lunr.Index.prototype.on = function () {
- var args = Array.prototype.slice.call(arguments)
- return this.eventEmitter.addListener.apply(this.eventEmitter, args)
-}
-
-/**
- * Removes a handler from an event being emitted by the index.
- *
- * @param {String} eventName The name of events to remove the function from.
- * @param {Function} handler The serialised set to load.
- * @memberOf Index
- */
-lunr.Index.prototype.off = function (name, fn) {
- return this.eventEmitter.removeListener(name, fn)
-}
-
-/**
- * Loads a previously serialised index.
- *
- * Issues a warning if the index being imported was serialised
- * by a different version of lunr.
- *
- * @param {Object} serialisedData The serialised set to load.
- * @returns {lunr.Index}
- * @memberOf Index
- */
-lunr.Index.load = function (serialisedData) {
- if (serialisedData.version !== lunr.version) {
- lunr.utils.warn('version mismatch: current ' + lunr.version + ' importing ' + serialisedData.version)
- }
-
- var idx = new this
-
- idx._fields = serialisedData.fields
- idx._ref = serialisedData.ref
-
- idx.documentStore = lunr.Store.load(serialisedData.documentStore)
- idx.tokenStore = lunr.TokenStore.load(serialisedData.tokenStore)
- idx.corpusTokens = lunr.SortedSet.load(serialisedData.corpusTokens)
- idx.pipeline = lunr.Pipeline.load(serialisedData.pipeline)
-
- return idx
-}
-
-/**
- * Adds a field to the list of fields that will be searchable within documents
- * in the index.
- *
- * An optional boost param can be passed to affect how much tokens in this field
- * rank in search results, by default the boost value is 1.
- *
- * Fields should be added before any documents are added to the index, fields
- * that are added after documents are added to the index will only apply to new
- * documents added to the index.
- *
- * @param {String} fieldName The name of the field within the document that
- * should be indexed
- * @param {Number} boost An optional boost that can be applied to terms in this
- * field.
- * @returns {lunr.Index}
- * @memberOf Index
- */
-lunr.Index.prototype.field = function (fieldName, opts) {
- var opts = opts || {},
- field = { name: fieldName, boost: opts.boost || 1 }
-
- this._fields.push(field)
- return this
-}
-
-/**
- * Sets the property used to uniquely identify documents added to the index,
- * by default this property is 'id'.
- *
- * This should only be changed before adding documents to the index, changing
- * the ref property without resetting the index can lead to unexpected results.
- *
- * @param {String} refName The property to use to uniquely identify the
- * documents in the index.
- * @param {Boolean} emitEvent Whether to emit add events, defaults to true
- * @returns {lunr.Index}
- * @memberOf Index
- */
-lunr.Index.prototype.ref = function (refName) {
- this._ref = refName
- return this
-}
-
-/**
- * Add a document to the index.
- *
- * This is the way new documents enter the index, this function will run the
- * fields from the document through the index's pipeline and then add it to
- * the index, it will then show up in search results.
- *
- * An 'add' event is emitted with the document that has been added and the index
- * the document has been added to. This event can be silenced by passing false
- * as the second argument to add.
- *
- * @param {Object} doc The document to add to the index.
- * @param {Boolean} emitEvent Whether or not to emit events, default true.
- * @memberOf Index
- */
-lunr.Index.prototype.add = function (doc, emitEvent) {
- var docTokens = {},
- allDocumentTokens = new lunr.SortedSet,
- docRef = doc[this._ref],
- emitEvent = emitEvent === undefined ? true : emitEvent
-
- this._fields.forEach(function (field) {
- var fieldTokens = this.pipeline.run(lunr.tokenizer(doc[field.name]))
-
- docTokens[field.name] = fieldTokens
- lunr.SortedSet.prototype.add.apply(allDocumentTokens, fieldTokens)
- }, this)
-
- this.documentStore.set(docRef, allDocumentTokens)
- lunr.SortedSet.prototype.add.apply(this.corpusTokens, allDocumentTokens.toArray())
-
- for (var i = 0; i < allDocumentTokens.length; i++) {
- var token = allDocumentTokens.elements[i]
- var tf = this._fields.reduce(function (memo, field) {
- var fieldLength = docTokens[field.name].length
-
- if (!fieldLength) return memo
-
- var tokenCount = docTokens[field.name].filter(function (t) { return t === token }).length
-
- return memo + (tokenCount / fieldLength * field.boost)
- }, 0)
-
- this.tokenStore.add(token, { ref: docRef, tf: tf })
- };
-
- if (emitEvent) this.eventEmitter.emit('add', doc, this)
-}
-
-/**
- * Removes a document from the index.
- *
- * To make sure documents no longer show up in search results they can be
- * removed from the index using this method.
- *
- * The document passed only needs to have the same ref property value as the
- * document that was added to the index, they could be completely different
- * objects.
- *
- * A 'remove' event is emitted with the document that has been removed and the index
- * the document has been removed from. This event can be silenced by passing false
- * as the second argument to remove.
- *
- * @param {Object} doc The document to remove from the index.
- * @param {Boolean} emitEvent Whether to emit remove events, defaults to true
- * @memberOf Index
- */
-lunr.Index.prototype.remove = function (doc, emitEvent) {
- var docRef = doc[this._ref],
- emitEvent = emitEvent === undefined ? true : emitEvent
-
- if (!this.documentStore.has(docRef)) return
-
- var docTokens = this.documentStore.get(docRef)
-
- this.documentStore.remove(docRef)
-
- docTokens.forEach(function (token) {
- this.tokenStore.remove(token, docRef)
- }, this)
-
- if (emitEvent) this.eventEmitter.emit('remove', doc, this)
-}
-
-/**
- * Updates a document in the index.
- *
- * When a document contained within the index gets updated, fields changed,
- * added or removed, to make sure it correctly matched against search queries,
- * it should be updated in the index.
- *
- * This method is just a wrapper around `remove` and `add`
- *
- * An 'update' event is emitted with the document that has been updated and the index.
- * This event can be silenced by passing false as the second argument to update. Only
- * an update event will be fired, the 'add' and 'remove' events of the underlying calls
- * are silenced.
- *
- * @param {Object} doc The document to update in the index.
- * @param {Boolean} emitEvent Whether to emit update events, defaults to true
- * @see Index.prototype.remove
- * @see Index.prototype.add
- * @memberOf Index
- */
-lunr.Index.prototype.update = function (doc, emitEvent) {
- var emitEvent = emitEvent === undefined ? true : emitEvent
-
- this.remove(doc, false)
- this.add(doc, false)
-
- if (emitEvent) this.eventEmitter.emit('update', doc, this)
-}
-
-/**
- * Calculates the inverse document frequency for a token within the index.
- *
- * @param {String} token The token to calculate the idf of.
- * @see Index.prototype.idf
- * @private
- * @memberOf Index
- */
-lunr.Index.prototype.idf = function (term) {
- var cacheKey = "@" + term
- if (Object.prototype.hasOwnProperty.call(this._idfCache, cacheKey)) return this._idfCache[cacheKey]
-
- var documentFrequency = this.tokenStore.count(term),
- idf = 1
-
- if (documentFrequency > 0) {
- idf = 1 + Math.log(this.tokenStore.length / documentFrequency)
- }
-
- return this._idfCache[cacheKey] = idf
-}
-
-/**
- * Searches the index using the passed query.
- *
- * Queries should be a string, multiple words are allowed and will lead to an
- * AND based query, e.g. `idx.search('foo bar')` will run a search for
- * documents containing both 'foo' and 'bar'.
- *
- * All query tokens are passed through the same pipeline that document tokens
- * are passed through, so any language processing involved will be run on every
- * query term.
- *
- * Each query term is expanded, so that the term 'he' might be expanded to
- * 'hello' and 'help' if those terms were already included in the index.
- *
- * Matching documents are returned as an array of objects, each object contains
- * the matching document ref, as set for this index, and the similarity score
- * for this document against the query.
- *
- * @param {String} query The query to search the index with.
- * @returns {Object}
- * @see Index.prototype.idf
- * @see Index.prototype.documentVector
- * @memberOf Index
- */
-lunr.Index.prototype.search = function (query) {
- var queryTokens = this.pipeline.run(lunr.tokenizer(query)),
- queryVector = new lunr.Vector,
- documentSets = [],
- fieldBoosts = this._fields.reduce(function (memo, f) { return memo + f.boost }, 0)
-
- var hasSomeToken = queryTokens.some(function (token) {
- return this.tokenStore.has(token)
- }, this)
-
- if (!hasSomeToken) return []
-
- queryTokens
- .forEach(function (token, i, tokens) {
- var tf = 1 / tokens.length * this._fields.length * fieldBoosts,
- self = this
-
- var set = this.tokenStore.expand(token).reduce(function (memo, key) {
- var pos = self.corpusTokens.indexOf(key),
- idf = self.idf(key),
- similarityBoost = 1,
- set = new lunr.SortedSet
-
- // if the expanded key is not an exact match to the token then
- // penalise the score for this key by how different the key is
- // to the token.
- if (key !== token) {
- var diff = Math.max(3, key.length - token.length)
- similarityBoost = 1 / Math.log(diff)
- }
-
- // calculate the query tf-idf score for this token
- // applying an similarityBoost to ensure exact matches
- // these rank higher than expanded terms
- if (pos > -1) queryVector.insert(pos, tf * idf * similarityBoost)
-
- // add all the documents that have this key into a set
- Object.keys(self.tokenStore.get(key)).forEach(function (ref) { set.add(ref) })
-
- return memo.union(set)
- }, new lunr.SortedSet)
-
- documentSets.push(set)
- }, this)
-
- var documentSet = documentSets.reduce(function (memo, set) {
- return memo.intersect(set)
- })
-
- return documentSet
- .map(function (ref) {
- return { ref: ref, score: queryVector.similarity(this.documentVector(ref)) }
- }, this)
- .sort(function (a, b) {
- return b.score - a.score
- })
-}
-
-/**
- * Generates a vector containing all the tokens in the document matching the
- * passed documentRef.
- *
- * The vector contains the tf-idf score for each token contained in the
- * document with the passed documentRef. The vector will contain an element
- * for every token in the indexes corpus, if the document does not contain that
- * token the element will be 0.
- *
- * @param {Object} documentRef The ref to find the document with.
- * @returns {lunr.Vector}
- * @private
- * @memberOf Index
- */
-lunr.Index.prototype.documentVector = function (documentRef) {
- var documentTokens = this.documentStore.get(documentRef),
- documentTokensLength = documentTokens.length,
- documentVector = new lunr.Vector
-
- for (var i = 0; i < documentTokensLength; i++) {
- var token = documentTokens.elements[i],
- tf = this.tokenStore.get(token)[documentRef].tf,
- idf = this.idf(token)
-
- documentVector.insert(this.corpusTokens.indexOf(token), tf * idf)
- };
-
- return documentVector
-}
-
-/**
- * Returns a representation of the index ready for serialisation.
- *
- * @returns {Object}
- * @memberOf Index
- */
-lunr.Index.prototype.toJSON = function () {
- return {
- version: lunr.version,
- fields: this._fields,
- ref: this._ref,
- documentStore: this.documentStore.toJSON(),
- tokenStore: this.tokenStore.toJSON(),
- corpusTokens: this.corpusTokens.toJSON(),
- pipeline: this.pipeline.toJSON()
- }
-}
-
-/**
- * Applies a plugin to the current index.
- *
- * A plugin is a function that is called with the index as its context.
- * Plugins can be used to customise or extend the behaviour the index
- * in some way. A plugin is just a function, that encapsulated the custom
- * behaviour that should be applied to the index.
- *
- * The plugin function will be called with the index as its argument, additional
- * arguments can also be passed when calling use. The function will be called
- * with the index as its context.
- *
- * Example:
- *
- * var myPlugin = function (idx, arg1, arg2) {
- * // `this` is the index to be extended
- * // apply any extensions etc here.
- * }
- *
- * var idx = lunr(function () {
- * this.use(myPlugin, 'arg1', 'arg2')
- * })
- *
- * @param {Function} plugin The plugin to apply.
- * @memberOf Index
- */
-lunr.Index.prototype.use = function (plugin) {
- var args = Array.prototype.slice.call(arguments, 1)
- args.unshift(this)
- plugin.apply(this, args)
-}
-/*!
- * lunr.Store
- * Copyright (C) 2014 Oliver Nightingale
- */
-
-/**
- * lunr.Store is a simple key-value store used for storing sets of tokens for
- * documents stored in index.
- *
- * @constructor
- * @module
- */
-lunr.Store = function () {
- this.store = {}
- this.length = 0
-}
-
-/**
- * Loads a previously serialised store
- *
- * @param {Object} serialisedData The serialised store to load.
- * @returns {lunr.Store}
- * @memberOf Store
- */
-lunr.Store.load = function (serialisedData) {
- var store = new this
-
- store.length = serialisedData.length
- store.store = Object.keys(serialisedData.store).reduce(function (memo, key) {
- memo[key] = lunr.SortedSet.load(serialisedData.store[key])
- return memo
- }, {})
-
- return store
-}
-
-/**
- * Stores the given tokens in the store against the given id.
- *
- * @param {Object} id The key used to store the tokens against.
- * @param {Object} tokens The tokens to store against the key.
- * @memberOf Store
- */
-lunr.Store.prototype.set = function (id, tokens) {
- if (!this.has(id)) this.length++
- this.store[id] = tokens
-}
-
-/**
- * Retrieves the tokens from the store for a given key.
- *
- * @param {Object} id The key to lookup and retrieve from the store.
- * @returns {Object}
- * @memberOf Store
- */
-lunr.Store.prototype.get = function (id) {
- return this.store[id]
-}
-
-/**
- * Checks whether the store contains a key.
- *
- * @param {Object} id The id to look up in the store.
- * @returns {Boolean}
- * @memberOf Store
- */
-lunr.Store.prototype.has = function (id) {
- return id in this.store
-}
-
-/**
- * Removes the value for a key in the store.
- *
- * @param {Object} id The id to remove from the store.
- * @memberOf Store
- */
-lunr.Store.prototype.remove = function (id) {
- if (!this.has(id)) return
-
- delete this.store[id]
- this.length--
-}
-
-/**
- * Returns a representation of the store ready for serialisation.
- *
- * @returns {Object}
- * @memberOf Store
- */
-lunr.Store.prototype.toJSON = function () {
- return {
- store: this.store,
- length: this.length
- }
-}
-
-/*!
- * lunr.stemmer
- * Copyright (C) 2014 Oliver Nightingale
- * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt
- */
-
-/**
- * lunr.stemmer is an english language stemmer, this is a JavaScript
- * implementation of the PorterStemmer taken from http://tartaurs.org/~martin
- *
- * @module
- * @param {String} str The string to stem
- * @returns {String}
- * @see lunr.Pipeline
- */
-lunr.stemmer = (function(){
- var step2list = {
- "ational" : "ate",
- "tional" : "tion",
- "enci" : "ence",
- "anci" : "ance",
- "izer" : "ize",
- "bli" : "ble",
- "alli" : "al",
- "entli" : "ent",
- "eli" : "e",
- "ousli" : "ous",
- "ization" : "ize",
- "ation" : "ate",
- "ator" : "ate",
- "alism" : "al",
- "iveness" : "ive",
- "fulness" : "ful",
- "ousness" : "ous",
- "aliti" : "al",
- "iviti" : "ive",
- "biliti" : "ble",
- "logi" : "log"
- },
-
- step3list = {
- "icate" : "ic",
- "ative" : "",
- "alize" : "al",
- "iciti" : "ic",
- "ical" : "ic",
- "ful" : "",
- "ness" : ""
- },
-
- c = "[^aeiou]", // consonant
- v = "[aeiouy]", // vowel
- C = c + "[^aeiouy]*", // consonant sequence
- V = v + "[aeiou]*", // vowel sequence
-
- mgr0 = "^(" + C + ")?" + V + C, // [C]VC... is m>0
- meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$", // [C]VC[V] is m=1
- mgr1 = "^(" + C + ")?" + V + C + V + C, // [C]VCVC... is m>1
- s_v = "^(" + C + ")?" + v; // vowel in stem
-
- var re_mgr0 = new RegExp(mgr0);
- var re_mgr1 = new RegExp(mgr1);
- var re_meq1 = new RegExp(meq1);
- var re_s_v = new RegExp(s_v);
-
- var re_1a = /^(.+?)(ss|i)es$/;
- var re2_1a = /^(.+?)([^s])s$/;
- var re_1b = /^(.+?)eed$/;
- var re2_1b = /^(.+?)(ed|ing)$/;
- var re_1b_2 = /.$/;
- var re2_1b_2 = /(at|bl|iz)$/;
- var re3_1b_2 = new RegExp("([^aeiouylsz])\\1$");
- var re4_1b_2 = new RegExp("^" + C + v + "[^aeiouwxy]$");
-
- var re_1c = /^(.+?[^aeiou])y$/;
- var re_2 = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;
-
- var re_3 = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;
-
- var re_4 = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;
- var re2_4 = /^(.+?)(s|t)(ion)$/;
-
- var re_5 = /^(.+?)e$/;
- var re_5_1 = /ll$/;
- var re3_5 = new RegExp("^" + C + v + "[^aeiouwxy]$");
-
- var porterStemmer = function porterStemmer(w) {
- var stem,
- suffix,
- firstch,
- re,
- re2,
- re3,
- re4;
-
- if (w.length < 3) { return w; }
-
- firstch = w.substr(0,1);
- if (firstch == "y") {
- w = firstch.toUpperCase() + w.substr(1);
- }
-
- // Step 1a
- re = re_1a
- re2 = re2_1a;
-
- if (re.test(w)) { w = w.replace(re,"$1$2"); }
- else if (re2.test(w)) { w = w.replace(re2,"$1$2"); }
-
- // Step 1b
- re = re_1b;
- re2 = re2_1b;
- if (re.test(w)) {
- var fp = re.exec(w);
- re = re_mgr0;
- if (re.test(fp[1])) {
- re = re_1b_2;
- w = w.replace(re,"");
- }
- } else if (re2.test(w)) {
- var fp = re2.exec(w);
- stem = fp[1];
- re2 = re_s_v;
- if (re2.test(stem)) {
- w = stem;
- re2 = re2_1b_2;
- re3 = re3_1b_2;
- re4 = re4_1b_2;
- if (re2.test(w)) { w = w + "e"; }
- else if (re3.test(w)) { re = re_1b_2; w = w.replace(re,""); }
- else if (re4.test(w)) { w = w + "e"; }
- }
- }
-
- // Step 1c - replace suffix y or Y by i if preceded by a non-vowel which is not the first letter of the word (so cry -> cri, by -> by, say -> say)
- re = re_1c;
- if (re.test(w)) {
- var fp = re.exec(w);
- stem = fp[1];
- w = stem + "i";
- }
-
- // Step 2
- re = re_2;
- if (re.test(w)) {
- var fp = re.exec(w);
- stem = fp[1];
- suffix = fp[2];
- re = re_mgr0;
- if (re.test(stem)) {
- w = stem + step2list[suffix];
- }
- }
-
- // Step 3
- re = re_3;
- if (re.test(w)) {
- var fp = re.exec(w);
- stem = fp[1];
- suffix = fp[2];
- re = re_mgr0;
- if (re.test(stem)) {
- w = stem + step3list[suffix];
- }
- }
-
- // Step 4
- re = re_4;
- re2 = re2_4;
- if (re.test(w)) {
- var fp = re.exec(w);
- stem = fp[1];
- re = re_mgr1;
- if (re.test(stem)) {
- w = stem;
- }
- } else if (re2.test(w)) {
- var fp = re2.exec(w);
- stem = fp[1] + fp[2];
- re2 = re_mgr1;
- if (re2.test(stem)) {
- w = stem;
- }
- }
-
- // Step 5
- re = re_5;
- if (re.test(w)) {
- var fp = re.exec(w);
- stem = fp[1];
- re = re_mgr1;
- re2 = re_meq1;
- re3 = re3_5;
- if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) {
- w = stem;
- }
- }
-
- re = re_5_1;
- re2 = re_mgr1;
- if (re.test(w) && re2.test(w)) {
- re = re_1b_2;
- w = w.replace(re,"");
- }
-
- // and turn initial Y back to y
-
- if (firstch == "y") {
- w = firstch.toLowerCase() + w.substr(1);
- }
-
- return w;
- };
-
- return porterStemmer;
-})();
-
-lunr.Pipeline.registerFunction(lunr.stemmer, 'stemmer')
-/*!
- * lunr.stopWordFilter
- * Copyright (C) 2014 Oliver Nightingale
- */
-
-/**
- * lunr.stopWordFilter is an English language stop word list filter, any words
- * contained in the list will not be passed through the filter.
- *
- * This is intended to be used in the Pipeline. If the token does not pass the
- * filter then undefined will be returned.
- *
- * @module
- * @param {String} token The token to pass through the filter
- * @returns {String}
- * @see lunr.Pipeline
- */
-lunr.stopWordFilter = function (token) {
- if (lunr.stopWordFilter.stopWords.indexOf(token) === -1) return token
-}
-
-lunr.stopWordFilter.stopWords = new lunr.SortedSet
-lunr.stopWordFilter.stopWords.length = 119
-lunr.stopWordFilter.stopWords.elements = [
- "",
- "a",
- "able",
- "about",
- "across",
- "after",
- "all",
- "almost",
- "also",
- "am",
- "among",
- "an",
- "and",
- "any",
- "are",
- "as",
- "at",
- "be",
- "because",
- "been",
- "but",
- "by",
- "can",
- "cannot",
- "could",
- "dear",
- "did",
- "do",
- "does",
- "either",
- "else",
- "ever",
- "every",
- "for",
- "from",
- "get",
- "got",
- "had",
- "has",
- "have",
- "he",
- "her",
- "hers",
- "him",
- "his",
- "how",
- "however",
- "i",
- "if",
- "in",
- "into",
- "is",
- "it",
- "its",
- "just",
- "least",
- "let",
- "like",
- "likely",
- "may",
- "me",
- "might",
- "most",
- "must",
- "my",
- "neither",
- "no",
- "nor",
- "not",
- "of",
- "off",
- "often",
- "on",
- "only",
- "or",
- "other",
- "our",
- "own",
- "rather",
- "said",
- "say",
- "says",
- "she",
- "should",
- "since",
- "so",
- "some",
- "than",
- "that",
- "the",
- "their",
- "them",
- "then",
- "there",
- "these",
- "they",
- "this",
- "tis",
- "to",
- "too",
- "twas",
- "us",
- "wants",
- "was",
- "we",
- "were",
- "what",
- "when",
- "where",
- "which",
- "while",
- "who",
- "whom",
- "why",
- "will",
- "with",
- "would",
- "yet",
- "you",
- "your"
-]
-
-lunr.Pipeline.registerFunction(lunr.stopWordFilter, 'stopWordFilter')
-/*!
- * lunr.trimmer
- * Copyright (C) 2014 Oliver Nightingale
- */
-
-/**
- * lunr.trimmer is a pipeline function for trimming non word
- * characters from the begining and end of tokens before they
- * enter the index.
- *
- * This implementation may not work correctly for non latin
- * characters and should either be removed or adapted for use
- * with languages with non-latin characters.
- *
- * @module
- * @param {String} token The token to pass through the filter
- * @returns {String}
- * @see lunr.Pipeline
- */
-lunr.trimmer = function (token) {
- return token
- .replace(/^\W+/, '')
- .replace(/\W+$/, '')
-}
-
-lunr.Pipeline.registerFunction(lunr.trimmer, 'trimmer')
-/*!
- * lunr.stemmer
- * Copyright (C) 2014 Oliver Nightingale
- * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt
- */
-
-/**
- * lunr.TokenStore is used for efficient storing and lookup of the reverse
- * index of token to document ref.
- *
- * @constructor
- */
-lunr.TokenStore = function () {
- this.root = { docs: {} }
- this.length = 0
-}
-
-/**
- * Loads a previously serialised token store
- *
- * @param {Object} serialisedData The serialised token store to load.
- * @returns {lunr.TokenStore}
- * @memberOf TokenStore
- */
-lunr.TokenStore.load = function (serialisedData) {
- var store = new this
-
- store.root = serialisedData.root
- store.length = serialisedData.length
-
- return store
-}
-
-/**
- * Adds a new token doc pair to the store.
- *
- * By default this function starts at the root of the current store, however
- * it can start at any node of any token store if required.
- *
- * @param {String} token The token to store the doc under
- * @param {Object} doc The doc to store against the token
- * @param {Object} root An optional node at which to start looking for the
- * correct place to enter the doc, by default the root of this lunr.TokenStore
- * is used.
- * @memberOf TokenStore
- */
-lunr.TokenStore.prototype.add = function (token, doc, root) {
- var root = root || this.root,
- key = token[0],
- rest = token.slice(1)
-
- if (!(key in root)) root[key] = {docs: {}}
-
- if (rest.length === 0) {
- root[key].docs[doc.ref] = doc
- this.length += 1
- return
- } else {
- return this.add(rest, doc, root[key])
- }
-}
-
-/**
- * Checks whether this key is contained within this lunr.TokenStore.
- *
- * By default this function starts at the root of the current store, however
- * it can start at any node of any token store if required.
- *
- * @param {String} token The token to check for
- * @param {Object} root An optional node at which to start
- * @memberOf TokenStore
- */
-lunr.TokenStore.prototype.has = function (token) {
- if (!token) return false
-
- var node = this.root
-
- for (var i = 0; i < token.length; i++) {
- if (!node[token[i]]) return false
-
- node = node[token[i]]
- }
-
- return true
-}
-
-/**
- * Retrieve a node from the token store for a given token.
- *
- * By default this function starts at the root of the current store, however
- * it can start at any node of any token store if required.
- *
- * @param {String} token The token to get the node for.
- * @param {Object} root An optional node at which to start.
- * @returns {Object}
- * @see TokenStore.prototype.get
- * @memberOf TokenStore
- */
-lunr.TokenStore.prototype.getNode = function (token) {
- if (!token) return {}
-
- var node = this.root
-
- for (var i = 0; i < token.length; i++) {
- if (!node[token[i]]) return {}
-
- node = node[token[i]]
- }
-
- return node
-}
-
-/**
- * Retrieve the documents for a node for the given token.
- *
- * By default this function starts at the root of the current store, however
- * it can start at any node of any token store if required.
- *
- * @param {String} token The token to get the documents for.
- * @param {Object} root An optional node at which to start.
- * @returns {Object}
- * @memberOf TokenStore
- */
-lunr.TokenStore.prototype.get = function (token, root) {
- return this.getNode(token, root).docs || {}
-}
-
-lunr.TokenStore.prototype.count = function (token, root) {
- return Object.keys(this.get(token, root)).length
-}
-
-/**
- * Remove the document identified by ref from the token in the store.
- *
- * By default this function starts at the root of the current store, however
- * it can start at any node of any token store if required.
- *
- * @param {String} token The token to get the documents for.
- * @param {String} ref The ref of the document to remove from this token.
- * @param {Object} root An optional node at which to start.
- * @returns {Object}
- * @memberOf TokenStore
- */
-lunr.TokenStore.prototype.remove = function (token, ref) {
- if (!token) return
- var node = this.root
-
- for (var i = 0; i < token.length; i++) {
- if (!(token[i] in node)) return
- node = node[token[i]]
- }
-
- delete node.docs[ref]
-}
-
-/**
- * Find all the possible suffixes of the passed token using tokens
- * currently in the store.
- *
- * @param {String} token The token to expand.
- * @returns {Array}
- * @memberOf TokenStore
- */
-lunr.TokenStore.prototype.expand = function (token, memo) {
- var root = this.getNode(token),
- docs = root.docs || {},
- memo = memo || []
-
- if (Object.keys(docs).length) memo.push(token)
-
- Object.keys(root)
- .forEach(function (key) {
- if (key === 'docs') return
-
- memo.concat(this.expand(token + key, memo))
- }, this)
-
- return memo
-}
-
-/**
- * Returns a representation of the token store ready for serialisation.
- *
- * @returns {Object}
- * @memberOf TokenStore
- */
-lunr.TokenStore.prototype.toJSON = function () {
- return {
- root: this.root,
- length: this.length
- }
-}
-
-
- /**
- * export the module via AMD, CommonJS or as a browser global
- * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js
- */
- ;(function (root, factory) {
- if (typeof define === 'function' && define.amd) {
- // AMD. Register as an anonymous module.
- define(factory)
- } else if (typeof exports === 'object') {
- /**
- * Node. Does not work with strict CommonJS, but
- * only CommonJS-like enviroments that support module.exports,
- * like Node.
- */
- module.exports = factory()
- } else {
- // Browser globals (root is window)
- root.lunr = factory()
- }
- }(this, function () {
- /**
- * Just return a value to define the module export.
- * This example returns an object, but the module
- * can return a function as the exported value.
- */
- return lunr
- }))
-})()
diff --git a/client/galaxy/scripts/mvc/tools.js b/client/galaxy/scripts/mvc/tools.js
index 032d6fbe051..abd017b075b 100644
--- a/client/galaxy/scripts/mvc/tools.js
+++ b/client/galaxy/scripts/mvc/tools.js
@@ -2,8 +2,8 @@
* Model, view, and controller objects for Galaxy tools and tool panel.
*/
- define( ["libs/underscore", "viz/trackster/util", "mvc/data", "libs/lunr" ],
- function(_, util, data, lunr) {
+ define( ["libs/underscore", "viz/trackster/util", "mvc/data" ],
+ function(_, util, data) {
/**
* Mixin for tracking model visibility.
@@ -340,11 +340,6 @@ _.extend(ToolSection.prototype, VisibilityMixin);
* indicates that query was not run; if not null, results are from search using
* query.
*/
-
-/**
- * TODO: Integrate lunr search here with tools from API instead of making
- * repeated requests.
- */
var ToolSearch = Backbone.Model.extend({
defaults: {
search_hint_string: "search tools",
diff --git a/client/galaxy/scripts/viz/circster.js b/client/galaxy/scripts/viz/circster.js
index a673d971891..756d8e3f085 100644
--- a/client/galaxy/scripts/viz/circster.js
+++ b/client/galaxy/scripts/viz/circster.js
@@ -1,16 +1,20 @@
// load required libraries
-require(
-[
+require([
'utils/utils',
- 'mvc/ui/icon-button',
- 'libs/farbtastic',
-], function(mod_utils, mod_icon_btn)
+], function(mod_utils)
{
// load css
mod_utils.cssLoadFile("static/style/circster.css");
});
-define(["libs/underscore", "libs/d3", "viz/visualization", "utils/config"], function(_, d3, visualization, config) {
+define([
+ "libs/underscore",
+ "libs/d3",
+ "viz/visualization",
+ "utils/config",
+ 'mvc/ui/icon-button',
+ 'libs/farbtastic'
+], function(_, d3, visualization, config, mod_icon_btn) {
/**
* Utility class for working with SVG.
@@ -71,7 +75,7 @@ var UsesTicks = {
else {
tick_coords = [1, 0, 4, 0];
text_coords = [0, 4, ".35em", ""];
-
+
}
ticks.append("line")
@@ -80,7 +84,7 @@ var UsesTicks = {
.attr("x2", tick_coords[2])
.attr("y1", tick_coords[3])
.style("stroke", "#000");
-
+
return ticks.append("text")
.attr("x", text_coords[0])
.attr("y", text_coords[1])
@@ -98,11 +102,11 @@ var UsesTicks = {
// Use default of 2 sig. digits.
if (sigDigits === undefined)
sigDigits = 2;
-
+
// Verify input number
if (num === null)
return null;
-
+
// Calculate return value
var rval = null;
if (Math.abs(num) < 1) {
@@ -141,7 +145,7 @@ var CircsterLabelTrack = Backbone.Model.extend({});
*/
var CircsterView = Backbone.View.extend({
className: 'circster',
-
+
initialize: function(options) {
this.genome = options.genome;
this.label_arc_height = 50;
@@ -188,7 +192,7 @@ var CircsterView = Backbone.View.extend({
track_gap = this.model.get('config').get_value('track_gap'),
// Subtract 20 to make sure chrom labels are on screen.
min_dimension = Math.min(this.$el.width(), this.$el.height()) - 20,
- // Compute radius start based on model, will be centered
+ // Compute radius start based on model, will be centered
// and fit entirely inside element by default.
radius_start = min_dimension / 2 -
circular_tracks.length * (dataset_arc_height + track_gap) +
@@ -198,14 +202,14 @@ var CircsterView = Backbone.View.extend({
// Compute range of track starting radii.
tracks_start_radii = d3.range(radius_start, min_dimension / 2, dataset_arc_height + track_gap);
-
+
// Map from track start to bounds.
var self = this;
return _.map(tracks_start_radii, function(radius) {
return [radius, radius + dataset_arc_height];
});
},
-
+
/**
* Renders circular tracks, chord tracks, and label tracks.
*/
@@ -254,7 +258,7 @@ var CircsterView = Backbone.View.extend({
}))
.attr("transform", "translate(" + width / 2 + "," + height / 2 + ")")
.append('svg:g').attr('class', 'tracks');
-
+
// -- Render circular tracks. --
// Create a view for each track in the visualization and render.
@@ -266,12 +270,12 @@ var CircsterView = Backbone.View.extend({
genome: self.genome,
total_gap: total_gap
});
-
+
view.render();
-
+
return view;
});
-
+
// -- Render chords tracks. --
this.chords_views = chords_tracks.map(function(track) {
@@ -289,10 +293,10 @@ var CircsterView = Backbone.View.extend({
});
// -- Render label track. --
-
+
// Track bounds are:
// (a) outer radius of last circular track;
- // (b)
+ // (b)
var outermost_radius = this.circular_views[this.circular_views.length-1].radius_bounds[1],
track_bounds = [
outermost_radius,
@@ -305,7 +309,7 @@ var CircsterView = Backbone.View.extend({
genome: self.genome,
total_gap: total_gap
});
-
+
this.label_track_view.render();
},
@@ -356,7 +360,7 @@ var CircsterView = Backbone.View.extend({
// Update label track.
/*
- FIXME: should never have to update label track because vis always expands to fit area
+ FIXME: should never have to update label track because vis always expands to fit area
within label track.
var track_bounds = new_track_bounds[ new_track_bounds.length-1 ];
track_bounds[1] = track_bounds[0];
@@ -373,7 +377,7 @@ var CircsterView = Backbone.View.extend({
var track_view = this.circular_views[options.index];
this.circular_views.splice(options.index, 1);
track_view.$el.remove();
-
+
// Recompute and update track bounds.
var new_track_bounds = this.get_tracks_bounds();
_.each(this.circular_views, function(track_view, i) {
@@ -392,7 +396,7 @@ var CircsterView = Backbone.View.extend({
_.each(this.chords_views, function(track_view) {
track_view.update_radius_bounds(new_track_bounds[0]);
});
-
+
}
});
@@ -455,7 +459,7 @@ var CircsterTrackView = Backbone.View.extend({
// Append titles to paths.
chroms_paths.append("title").text(function(d) { return d.data.chrom; });
-
+
// -- Render track data and, when track data is rendered, apply preferences and update chrom_elts fill. --
var self = this,
@@ -490,7 +494,7 @@ var CircsterTrackView = Backbone.View.extend({
var new_d = d3.svg.arc()
.innerRadius(this.radius_bounds[0])
.outerRadius(this.radius_bounds[1]);
-
+
this.parent_elt.selectAll('g>path.chrom-background').transition().duration(1000).attr('d', new_d);
this._transition_chrom_data();
@@ -511,7 +515,7 @@ var CircsterTrackView = Backbone.View.extend({
}
// -- Scale increased, so render visible data with more detail. --
-
+
var self = this,
utils = new SVGUtils();
@@ -539,7 +543,7 @@ var CircsterTrackView = Backbone.View.extend({
$.when(data_deferred).then(function(data) {
// Remove current data path.
path_elt.remove();
-
+
// Update data bounds with new data.
self._update_data_bounds();
@@ -598,12 +602,12 @@ var CircsterTrackView = Backbone.View.extend({
_transition_labels: function() {},
/**
- * Update data bounds. If there are new_bounds, use them; otherwise use
+ * Update data bounds. If there are new_bounds, use them; otherwise use
* default data bounds.
*/
_update_data_bounds: function(new_bounds) {
var old_bounds = this.data_bounds;
- this.data_bounds = new_bounds ||
+ this.data_bounds = new_bounds ||
this.get_data_bounds(this.track.get('data_manager').get_genome_wide_data(this.genome));
this._transition_chrom_data();
},
@@ -624,7 +628,7 @@ var CircsterTrackView = Backbone.View.extend({
// Set min, max value in config so that they can be adjusted. Make this silent
// because these attributes are watched for changes and the viz is updated
- // accordingly (set up in initialize). Because we are setting up, we don't want
+ // accordingly (set up in initialize). Because we are setting up, we don't want
// the watch to trigger events here.
track.get('config').set_value('min_value', self.data_bounds[0], {silent: true});
track.get('config').set_value('max_value', self.data_bounds[1], {silent: true});
@@ -660,7 +664,7 @@ var CircsterTrackView = Backbone.View.extend({
_get_path_function: function(chrom_arc, chrom_data) {},
/**
- * Returns arc layouts for genome's chromosomes/contigs. Arcs are arranged in a circle
+ * Returns arc layouts for genome's chromosomes/contigs. Arcs are arranged in a circle
* separated by gaps.
*/
_chroms_layout: function() {
@@ -700,14 +704,14 @@ var CircsterChromLabelTrackView = CircsterTrackView.extend({
* Render labels.
*/
_render_data: function(svg) {
- // -- Add chromosome label where it will fit; an alternative labeling mechanism
+ // -- Add chromosome label where it will fit; an alternative labeling mechanism
// would be nice for small chromosomes. --
var self = this,
chrom_arcs = svg.selectAll('g');
chrom_arcs.selectAll('path')
.attr('id', function(d) { return 'label-' + d.data.chrom; });
-
+
chrom_arcs.append("svg:text")
.filter(function(d) {
return d.endAngle - d.startAngle > self.min_arc_len;
@@ -857,12 +861,12 @@ var CircsterQuantitativeTrackView = CircsterTrackView.extend({
return "rotate(90)";
};
- // FIXME:
+ // FIXME:
// (1) using min_max class below is needed for _update_min_max, which could be improved.
// (2) showing config on tick click should be replaced by proper track config icon.
// Draw min, max on first chrom only.
- var ticks = this.drawTicks(this.parent_elt, [ this.chroms_layout[0] ],
+ var ticks = this.drawTicks(this.parent_elt, [ this.chroms_layout[0] ],
this._data_bounds_ticks_fn(), textTransform, true)
.classed('min_max', true);
@@ -872,7 +876,7 @@ var CircsterQuantitativeTrackView = CircsterTrackView.extend({
var view = new config.ConfigSettingCollectionView({
collection: self.track.get('config')
});
- view.render_in_modal('Configure Track');
+ view.render_in_modal('Configure Track');
});
});
@@ -951,7 +955,7 @@ _.extend(CircsterQuantitativeTrackView.prototype, UsesTicks);
var CircsterBigWigTrackView = CircsterQuantitativeTrackView.extend({
get_data_bounds: function(data) {
- // Set max across dataset by extracting all values, flattening them into a
+ // Set max across dataset by extracting all values, flattening them into a
// single array, and getting third quartile.
var values = _.flatten( _.map(data, function(d) {
if (d) {
@@ -965,8 +969,8 @@ var CircsterBigWigTrackView = CircsterQuantitativeTrackView.extend({
return 0;
}
}) );
-
- // For max, use 98% quantile in attempt to avoid very large values. However, this max may be 0
+
+ // For max, use 98% quantile in attempt to avoid very large values. However, this max may be 0
// for sparsely populated data, so use max in that case.
return [ _.min(values), this._quantile(values, 0.98) || _.max(values) ];
}
@@ -1068,13 +1072,13 @@ var Circster = Backbone.View.extend(
genome : genome,
model : vis
});
-
+
// Render vizualization
viz_view.render();
-
+
// setup title
$('#center .unified-panel-header-inner').append(galaxy_config.app.viz_config.title + " " + galaxy_config.app.viz_config.dbkey);
-
+
// setup menu
var menu = mod_icon_btn.create_icon_buttons_menu([
{
@@ -1100,7 +1104,7 @@ var Circster = Backbone.View.extend(
{
// show saving dialog box
Galaxy.modal.show({title: "Saving...", body: "progress" });
-
+
// send to server
$.ajax({
url: galaxy_config.root + "visualization/save",
@@ -1132,11 +1136,11 @@ var Circster = Backbone.View.extend(
window.location = galaxy_config.root + "visualization/list";
}
}], { tooltip_config: { placement: 'bottom' } });
-
+
// add menu
menu.$el.attr("style", "float: right");
$("#center .unified-panel-header-inner").append(menu.$el);
-
+
// manual tooltip config because default gravity is S and cannot be changed
$(".menu-button").tooltip( { placement: 'bottom' } );
}
diff --git a/config/datatypes_conf.xml.sample b/config/datatypes_conf.xml.sample
index 65bfb9ebdac..726f231384c 100644
--- a/config/datatypes_conf.xml.sample
+++ b/config/datatypes_conf.xml.sample
@@ -93,6 +93,7 @@
+
diff --git a/config/plugins/interactive_environments/ipython/templates/ipython.mako b/config/plugins/interactive_environments/ipython/templates/ipython.mako
index f4c169bcb60..8f3a3d6655a 100644
--- a/config/plugins/interactive_environments/ipython/templates/ipython.mako
+++ b/config/plugins/interactive_environments/ipython/templates/ipython.mako
@@ -35,6 +35,7 @@ notebook_access_url = ie_request.url_template('${PROXY_URL}/ipython/${PORT}/note
notebook_login_url = ie_request.url_template('${PROXY_URL}/ipython/${PORT}/login?next=%2Fipython%2F${PORT}%2Ftree')
docker_cmd = ie_request.docker_cmd(temp_dir)
+ie_request.log.info("Starting IPython docker container with command [%s]" % docker_cmd)
subprocess.call(docker_cmd, shell=True)
%>
diff --git a/display_applications/igv/gff.xml b/display_applications/igv/gff.xml
new file mode 100644
index 00000000000..57e60bbadc4
--- /dev/null
+++ b/display_applications/igv/gff.xml
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${$site_id.startswith( 'local_' ) or $dataset.dbkey in $site_dbkeys}
+
+
+ ${redirect_url}
+
+
+
+ #if ($dataset.dbkey in $site_dbkeys)
+ $site_organisms[ $site_dbkeys.index( $gff_file.dbkey ) ]
+ #else:
+ $gff_file.dbkey
+ #end if
+
+
+ <?xml version="1.0" encoding="utf-8"?>
+<jnlp
+ spec="1.0+"
+ codebase="${site_link}">
+ <information>
+ <title>IGV 1.5</title>
+ <vendor>The Broad Institute</vendor>
+ <homepage href="http://www.broadinstitute.org/igv"/>
+ <description>IGV Software</description>
+ <description kind="short">IGV</description>
+ </information>
+ <security>
+ <all-permissions/>
+ </security>
+ <resources>
+
+<j2se version="1.5+" initial-heap-size="256m" max-heap-size="1100m"/>
+ <jar href="igv.jar" download="eager" main="true"/>
+ <jar href="batik-codec.jar" download="eager"/>
+ <property name="apple.laf.useScreenMenuBar" value="true"/>
+ <property name="com.apple.mrj.application.growbox.intrudes" value="false"/>
+ <property name="com.apple.mrj.application.live-resize" value="true"/>
+ <property name="com.apple.macos.smallTabs" value="true"/>
+ </resources>
+
+ <resources os="Mac" arch="i386">
+ <property name="apple.awt.graphics.UseQuartz" value="false"/>
+ <nativelib href="hdfnative-macintel.jar"/>
+ </resources>
+
+ <resources os="Mac" arch="ppc">
+ <property name="apple.awt.graphics.UseQuartz" value="false"/>
+ <nativelib href="hdfnative-macppc.jar"/>
+ </resources>
+
+ <resources os="Mac" arch="PowerPC">
+ <property name="apple.awt.graphics.UseQuartz" value="false"/>
+ <nativelib href="hdfnative-macppc.jar"/>
+ </resources>
+
+ <resources os="Windows">
+ <property name="sun.java2d.noddraw" value="true"/>
+ <nativelib href="hdfnative-win.jar"/>
+ </resources>
+
+ <resources os="Linux">
+ <nativelib href="hdfnative-linux64.jar"/>
+ </resources>
+
+ <application-desc main-class="org.broad.igv.ui.IGVMainFrame">
+ <argument>-g</argument>
+ <argument>${site_organism}</argument>
+ <argument>${gff_file.url}</argument>
+ </application-desc>
+</jnlp>
+
+
+ #if $site_id.startswith( 'local_' )
+ ${site_link}?file=${gff_file.qp}&genome=${site_organism}&merge=true&name=${qp( $gff_file.name )}
+ #elif $site_id.startswith( 'web_link_' ):
+ ${site_link}?sessionURL=${gff_file.qp}&genome=${site_organism}&merge=true&name=${qp( $gff_file.name )}
+ #else:
+ ${jnlp.url}
+ #end if
+
+
+
+
+
+
+
+ ${ $dataset.dbkey == $value }
+
+
+ http://www.broadinstitute.org/igv/projects/current/igv.php?sessionURL=${gff_file.qp}&genome=${gff_file.dbkey}&merge=true&name=${qp( $gff_file.name )}
+
+
+
+
+
+
+
diff --git a/lib/galaxy/auth/providers/activedirectory.py b/lib/galaxy/auth/providers/activedirectory.py
index 33c2e39aded..8f77a9703aa 100644
--- a/lib/galaxy/auth/providers/activedirectory.py
+++ b/lib/galaxy/auth/providers/activedirectory.py
@@ -52,7 +52,12 @@ class ActiveDirectory(AuthProvider):
ldap.set_option(ldap.OPT_REFERRALS, 0)
l = ldap.initialize(_get_subs(options, 'server', params))
l.protocol_version = 3
- l.simple_bind_s(_get_subs(options, 'search-user', params), _get_subs(options, 'search-password', params))
+
+ if 'search-user' in options:
+ l.simple_bind_s(_get_subs(options, 'search-user', params), _get_subs(options, 'search-password', params))
+ else:
+ l.simple_bind_s()
+
scope = ldap.SCOPE_SUBTREE
# setup search
@@ -61,7 +66,8 @@ class ActiveDirectory(AuthProvider):
# parse results
_, suser = l.result(result, 60)
- _, attrs = suser[0]
+ dn, attrs = suser[0]
+ log.debug(("AD dn: %s" % dn))
log.debug(("AD Search attributes: %s" % attrs))
if hasattr(attrs, 'has_key'):
for attr in attributes:
@@ -69,6 +75,7 @@ class ActiveDirectory(AuthProvider):
params[attr] = str(attrs[attr][0])
else:
params[attr] = ""
+ params['dn'] = dn
except Exception:
log.exception('ACTIVEDIRECTORY Search Exception for User: %s' % username)
return (failure_mode, '')
diff --git a/lib/galaxy/config.py b/lib/galaxy/config.py
index e6f7c8556b7..a7f9863d0ad 100644
--- a/lib/galaxy/config.py
+++ b/lib/galaxy/config.py
@@ -476,7 +476,7 @@ class Configuration( object ):
datatypes_config_file=[ 'config/datatypes_conf.xml', 'datatypes_conf.xml', 'config/datatypes_conf.xml.sample' ],
external_service_type_config_file=[ 'config/external_service_types_conf.xml', 'external_service_types_conf.xml', 'config/external_service_types_conf.xml.sample' ],
job_config_file=[ 'config/job_conf.xml', 'job_conf.xml' ],
- job_metrics_config_file=[ 'config/job_metrics_conf.xml', 'job_metrics_conf.xml' ],
+ job_metrics_config_file=[ 'config/job_metrics_conf.xml', 'job_metrics_conf.xml', 'config/job_metrics_conf.xml.sample' ],
dependency_resolvers_config_file=[ 'config/dependency_resolvers_conf.xml', 'dependency_resolvers_conf.xml' ],
job_resource_params_file=[ 'config/job_resource_params_conf.xml', 'job_resource_params_conf.xml' ],
migrated_tools_config=[ 'migrated_tools_conf.xml', 'config/migrated_tools_conf.xml' ],
diff --git a/lib/galaxy/jobs/__init__.py b/lib/galaxy/jobs/__init__.py
index 74d72c7bbc7..592f75850d4 100644
--- a/lib/galaxy/jobs/__init__.py
+++ b/lib/galaxy/jobs/__init__.py
@@ -1138,6 +1138,7 @@ class JobWrapper( object ):
# Update (non-library) job output datasets through the object store
if dataset not in job.output_library_datasets:
self.app.object_store.update_from_file(dataset.dataset, create=True)
+ self._collect_extra_files(dataset.dataset, self.working_directory)
if job.states.ERROR == final_job_state:
dataset.blurb = "error"
dataset.mark_unhidden()
@@ -1251,8 +1252,6 @@ class JobWrapper( object ):
# instead of validated and transformed values during i.e. running workflows
param_dict = dict( [ ( p.name, p.value ) for p in job.parameters ] )
param_dict = self.tool.params_from_strings( param_dict, self.app )
- # Check for and move associated_files
- self.tool.collect_associated_files(out_data, self.working_directory)
# Create generated output children and primary datasets and add to param_dict
collected_datasets = {
'children': self.tool.collect_child_datasets(out_data, self.working_directory),
@@ -1283,6 +1282,16 @@ class JobWrapper( object ):
if job.user:
job.user.total_disk_usage += bytes
+ # Empirically, we need to update job.user and
+ # job.workflow_invocation_step.workflow_invocation in separate
+ # transactions. Best guess as to why is that the workflow_invocation
+ # may or may not exist when the job is first loaded by the handler -
+ # and depending on whether it is or not sqlalchemy orders the updates
+ # differently and deadlocks can occur (one thread updates user and
+ # waits on invocation and the other updates invocation and waits on
+ # user).
+ self.sa_session.flush()
+
# fix permissions
for path in [ dp.real_path for dp in self.get_mutable_output_fnames() ]:
util.umask_fix_perms( path, self.app.config.umask, 0666, self.app.config.gid )
@@ -1317,6 +1326,28 @@ class JobWrapper( object ):
except:
log.exception( "Unable to cleanup job %d" % self.job_id )
+ def _collect_extra_files(self, dataset, job_working_directory):
+ temp_file_path = os.path.join( job_working_directory, "dataset_%s_files" % ( dataset.id ) )
+ extra_dir = None
+ try:
+ # This skips creation of directories - object store
+ # automatically creates them. However, empty directories will
+ # not be created in the object store at all, which might be a
+ # problem.
+ for root, dirs, files in os.walk( temp_file_path ):
+ extra_dir = root.replace(job_working_directory, '', 1).lstrip(os.path.sep)
+ for f in files:
+ self.app.object_store.update_from_file(
+ dataset,
+ extra_dir=extra_dir,
+ alt_name=f,
+ file_name=os.path.join(root, f),
+ create=True,
+ preserve_symlinks=True
+ )
+ except Exception, e:
+ log.debug( "Error in collect_associated_files: %s" % ( e ) )
+
def _collect_metrics( self, has_metrics ):
job = has_metrics.get_job()
per_plugin_properties = self.app.job_metrics.collect_properties( job.destination_id, self.job_id, self.working_directory )
diff --git a/lib/galaxy/managers/base.py b/lib/galaxy/managers/base.py
index e66f7a27533..8c81223e6f9 100644
--- a/lib/galaxy/managers/base.py
+++ b/lib/galaxy/managers/base.py
@@ -700,8 +700,8 @@ class ModelDeserializer( object ):
setattr( item, key, val )
return val
- def deserialize_basestring( self, trans, item, key, val ):
- val = self.validate.basestring( key, val )
+ def deserialize_basestring( self, trans, item, key, val, convert_none_to_empty=False ):
+ val = '' if ( convert_none_to_empty and val is None ) else self.validate.basestring( key, val )
return self.default_deserializer( trans, item, key, val )
def deserialize_bool( self, trans, item, key, val ):
diff --git a/lib/galaxy/managers/hdas.py b/lib/galaxy/managers/hdas.py
index 8cd1ae8eaf0..e99010feac6 100644
--- a/lib/galaxy/managers/hdas.py
+++ b/lib/galaxy/managers/hdas.py
@@ -426,7 +426,7 @@ class HDASerializer( datasets.DatasetAssociationSerializer,
'hda_ldda' : lambda *a: 'hda',
# remapped
- 'info' : lambda t, i, k: i.info.strip() if isinstance( i.info, basestring ) else i.info,
+ 'info' : lambda t, i, k: i.info.strip() if isinstance( i.info, basestring ) else '',
'misc_info' : lambda t, i, k: self.serializers[ 'info' ]( t, i, k ),
'misc_blurb' : lambda t, i, k: i.blurb,
'genome_build' : lambda t, i, k: i.dbkey,
@@ -622,7 +622,8 @@ class HDADeserializer( datasets.DatasetAssociationDeserializer,
# remapped
'genome_build' : lambda t, i, k, v: self.deserialize_genome_build( t, i, 'dbkey', v ),
- 'misc_info' : lambda t, i, k, v: self.deserialize_basestring( t, i, 'info', v ),
+ 'misc_info' : lambda t, i, k, v: (
+ self.deserialize_basestring( t, i, 'info', v, convert_none_to_empty=True ) ),
# TODO: mixin: deletable
'deleted' : self.deserialize_bool,
diff --git a/lib/galaxy/tools/__init__.py b/lib/galaxy/tools/__init__.py
index 11bf1cb6799..183346e37cf 100755
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -2148,39 +2148,6 @@ class Tool( object, Dictifiable ):
"""
pass
- def collect_associated_files( self, output, job_working_directory ):
- """
- Find extra files in the job working directory and move them into
- the appropriate dataset's files directory
- """
- for name, hda in output.items():
- temp_file_path = os.path.join( job_working_directory, "dataset_%s_files" % ( hda.dataset.id ) )
- extra_dir = None
- try:
- # This skips creation of directories - object store
- # automatically creates them. However, empty directories will
- # not be created in the object store at all, which might be a
- # problem.
- for root, dirs, files in os.walk( temp_file_path ):
- extra_dir = root.replace(job_working_directory, '', 1).lstrip(os.path.sep)
- for f in files:
- self.app.object_store.update_from_file(hda.dataset,
- extra_dir=extra_dir,
- alt_name=f,
- file_name=os.path.join(root, f),
- create=True,
- preserve_symlinks=True
- )
- # Clean up after being handled by object store.
- # FIXME: If the object (e.g., S3) becomes async, this will
- # cause issues so add it to the object store functionality?
- if extra_dir is not None:
- # there was an extra_files_path dir, attempt to remove it
- shutil.rmtree(temp_file_path)
- except Exception, e:
- log.debug( "Error in collect_associated_files: %s" % ( e ) )
- continue
-
def collect_child_datasets( self, output, job_working_directory ):
"""
Look for child dataset files, create HDA and attach to parent.
@@ -2476,7 +2443,7 @@ class Tool( object, Dictifiable ):
continue
# state for subsection/group
- group_state = state_inputs[input.name]
+ group_state = state_inputs.get(input.name, {})
# iterate and update values
if input.type == 'repeat':
@@ -2487,10 +2454,12 @@ class Tool( object, Dictifiable ):
elif input.type == 'conditional':
if 'test_param' in tool_dict:
test_param = tool_dict['test_param']
- test_param['value'] = jsonify(group_state[test_param['name']])
- if '__current_case__' in group_state:
- i = group_state['__current_case__']
- iterate(tool_dict['cases'][i]['inputs'], input.cases[i].inputs, group_state, other_values)
+ test_param['value'] = jsonify(group_state.get(test_param['name'], None))
+ for i in range (len ( tool_dict['cases'] ) ):
+ current_state = {}
+ if i == group_state.get('__current_case__', None):
+ current_state = group_state
+ iterate(tool_dict['cases'][i]['inputs'], input.cases[i].inputs, current_state, other_values)
elif input.type == 'section':
iterate( tool_dict['inputs'], input.inputs, group_state, other_values )
else:
@@ -2504,11 +2473,15 @@ class Tool( object, Dictifiable ):
input_name = tool_dict.get('name')
if input_name:
# backup default value
- tool_dict['default_value'] = input.get_initial_value(trans, other_values)
+ try:
+ tool_dict['default_value'] = input.get_initial_value(trans, other_values)
+ except Exception:
+ # get initial value failed due to improper late validation
+ tool_dict['default_value'] = None
+ pass
# update input value from tool state
- if input_name in state_inputs:
- tool_dict['value'] = state_inputs[input_name]
+ tool_dict['value'] = state_inputs.get(input_name, None)
# sanitize values
sanitize(tool_dict, 'value')
diff --git a/lib/galaxy/tools/parameters/basic.py b/lib/galaxy/tools/parameters/basic.py
index 888019d0346..052f68d769d 100644
--- a/lib/galaxy/tools/parameters/basic.py
+++ b/lib/galaxy/tools/parameters/basic.py
@@ -15,6 +15,7 @@ from galaxy.util.bunch import Bunch
from galaxy.util import string_as_bool, sanitize_param, unicodify
from galaxy.util import listify
from galaxy.util.odict import odict
+from galaxy.util.expressions import ExpressionContext
from sanitize import ToolParameterSanitizer
import validation
import dynamic_options
@@ -802,8 +803,9 @@ class SelectToolParameter( ToolParameter ):
self.is_dynamic = ( ( self.dynamic_options is not None ) or ( self.options is not None ) )
def _get_dynamic_options_call_other_values( self, trans, other_values ):
- call_other_values = { "__trans__": trans }
+ call_other_values = ExpressionContext({ "__trans__": trans })
if other_values:
+ call_other_values.parent = other_values.parent
call_other_values.update( other_values.dict )
return call_other_values
@@ -1510,8 +1512,9 @@ class DrillDownSelectToolParameter( SelectToolParameter ):
def _get_options_from_code( self, trans=None, value=None, other_values=None ):
assert self.dynamic_options, Exception( "dynamic_options was not specifed" )
- call_other_values = { '__trans__': trans, '__value__': value }
+ call_other_values = ExpressionContext({ '__trans__': trans, '__value__': value })
if other_values:
+ call_other_values.parent = other_values.parent
call_other_values.update( other_values.dict )
try:
return eval( self.dynamic_options, self.tool.code_namespace, call_other_values )
diff --git a/lib/galaxy/web/base/interactive_environments.py b/lib/galaxy/web/base/interactive_environments.py
index 4f5a98ffe86..63a8954ac4f 100644
--- a/lib/galaxy/web/base/interactive_environments.py
+++ b/lib/galaxy/web/base/interactive_environments.py
@@ -11,6 +11,9 @@ eggs.require("PyYAML")
import yaml
from galaxy.managers import api_keys
+import logging
+log = logging.getLogger(__name__)
+
class InteractiveEnviornmentRequest(object):
@@ -18,6 +21,7 @@ class InteractiveEnviornmentRequest(object):
plugin_config = plugin.config
self.trans = trans
+ self.log = log
self.attr = Bunch()
self.attr.viz_id = plugin_config["name"].lower()
@@ -161,5 +165,5 @@ class InteractiveEnviornmentRequest(object):
"""
return '%s run -d -u %s --sig-proxy=true -p %s:%s -v "%s:/import/" %s' % \
(self.attr.viz_config.get("docker", "command"), os.geteuid(),
- self.attr.PORT, self.attr.docker_port,
- temp_dir, self.attr.viz_config.get("docker", "image"))
+ self.attr.PORT, self.attr.docker_port,
+ temp_dir, self.attr.viz_config.get("docker", "image"))
diff --git a/lib/galaxy/webapps/galaxy/api/folder_contents.py b/lib/galaxy/webapps/galaxy/api/folder_contents.py
index 780cf63e4a7..267880e9866 100644
--- a/lib/galaxy/webapps/galaxy/api/folder_contents.py
+++ b/lib/galaxy/webapps/galaxy/api/folder_contents.py
@@ -1,15 +1,12 @@
"""
API operations on the contents of a library folder.
"""
-from galaxy import web
from galaxy import util
from galaxy import exceptions
from galaxy import managers
from galaxy.managers import folders
from galaxy.web import _future_expose_api as expose_api
from galaxy.web import _future_expose_api_anonymous as expose_api_anonymous
-from sqlalchemy.orm.exc import MultipleResultsFound
-from sqlalchemy.orm.exc import NoResultFound
from galaxy.web.base.controller import BaseAPIController, UsesLibraryMixin, UsesLibraryMixinItems
import logging
@@ -130,7 +127,7 @@ class FolderContentsController( BaseAPIController, UsesLibraryMixin, UsesLibrary
# Check whether user can modify the current folder
can_modify_folder = is_admin or trans.app.security_agent.can_modify_library_item( current_user_roles, folder )
-
+
parent_library_id = None
if folder.parent_library is not None:
parent_library_id = trans.security.encode_id( folder.parent_library.id )
@@ -158,7 +155,7 @@ class FolderContentsController( BaseAPIController, UsesLibraryMixin, UsesLibrary
if folder.parent_id is None:
path_to_root.append( ( 'F' + trans.security.encode_id( folder.id ), folder.name ) )
else:
- # We add the current folder and traverse up one folder.
+ # We add the current folder and traverse up one folder.
path_to_root.append( ( 'F' + trans.security.encode_id( folder.id ), folder.name ) )
upper_folder = trans.sa_session.query( trans.app.model.LibraryFolder ).get( folder.parent_id )
path_to_root.extend( self.build_path( trans, upper_folder ) )
@@ -187,11 +184,11 @@ class FolderContentsController( BaseAPIController, UsesLibraryMixin, UsesLibrary
if subfolder.deleted:
if include_deleted:
if is_admin:
- # Admins can see all deleted folders.
+ # Admins can see all deleted folders.
subfolder.api_type = 'folder'
content_items.append( subfolder )
else:
- # Users with MODIFY permissions can see deleted folders.
+ # Users with MODIFY permissions can see deleted folders.
can_modify = trans.app.security_agent.can_modify_library_item( current_user_roles, subfolder )
if can_modify:
subfolder.api_type = 'folder'
@@ -214,11 +211,11 @@ class FolderContentsController( BaseAPIController, UsesLibraryMixin, UsesLibrary
if dataset.deleted:
if include_deleted:
if is_admin:
- # Admins can see all deleted datasets.
+ # Admins can see all deleted datasets.
dataset.api_type = 'file'
content_items.append( dataset )
else:
- # Users with MODIFY permissions on the item can see the deleted item.
+ # Users with MODIFY permissions on the item can see the deleted item.
can_modify = trans.app.security_agent.can_modify_library_item( current_user_roles, dataset )
if can_modify:
dataset.api_type = 'file'
@@ -323,7 +320,7 @@ class FolderContentsController( BaseAPIController, UsesLibraryMixin, UsesLibrary
raise exceptions.NotImplemented( 'Showing the library folder content is not implemented here.' )
@expose_api
- def update( self, trans, id, library_id, payload, **kwd ):
+ def update( self, trans, id, library_id, payload, **kwd ):
"""
PUT /api/folders/{encoded_folder_id}/contents
"""
diff --git a/lib/galaxy/webapps/galaxy/api/lda_datasets.py b/lib/galaxy/webapps/galaxy/api/lda_datasets.py
index 9bb7418ad9b..1af9d8d6c14 100644
--- a/lib/galaxy/webapps/galaxy/api/lda_datasets.py
+++ b/lib/galaxy/webapps/galaxy/api/lda_datasets.py
@@ -402,7 +402,7 @@ class LibraryDatasetsController( BaseAPIController, UsesVisualizationMixin ):
"""
load( self, trans, **kwd ):
* POST /api/libraries/datasets
- Load dataset from the given source into the library.
+ Load dataset from the given source into the library.
Source can be:
user directory - root folder specified in galaxy.ini as "$user_library_import_dir"
example path: path/to/galaxy/$user_library_import_dir/user@example.com/{user can browse everything here}
@@ -410,7 +410,7 @@ class LibraryDatasetsController( BaseAPIController, UsesVisualizationMixin ):
(admin)import directory - root folder specified in galaxy ini as "$library_import_dir"
example path: path/to/galaxy/$library_import_dir/{admin can browse everything here}
(admin)any absolute or relative path - option allowed with "allow_library_path_paste" in galaxy.ini
-
+
:param encoded_folder_id: the encoded id of the folder to import dataset(s) to
:type encoded_folder_id: an encoded id string
:param source: source the datasets should be loaded form
@@ -427,7 +427,7 @@ class LibraryDatasetsController( BaseAPIController, UsesVisualizationMixin ):
:type dbkey: str
:returns: dict containing information about the created upload job
- :rtype: dictionary
+ :rtype: dictionary
"""
kwd[ 'space_to_tab' ] = 'False'
@@ -572,7 +572,7 @@ class LibraryDatasetsController( BaseAPIController, UsesVisualizationMixin ):
if format in [ 'zip', 'tgz', 'tbz' ]:
# error = False
killme = string.punctuation + string.whitespace
- trantab = string.maketrans( killme, '_'*len( killme ) )
+ trantab = string.maketrans( killme, '_' * len( killme ) )
try:
outext = 'zip'
if format == 'zip':
diff --git a/lib/galaxy/webapps/galaxy/api/libraries.py b/lib/galaxy/webapps/galaxy/api/libraries.py
index aaf777707a1..bd3dfb90a71 100644
--- a/lib/galaxy/webapps/galaxy/api/libraries.py
+++ b/lib/galaxy/webapps/galaxy/api/libraries.py
@@ -232,7 +232,7 @@ class LibrariesController( BaseAPIController ):
return_roles = []
for role in roles:
- role_id = trans.security.encode_id ( role.id )
+ role_id = trans.security.encode_id( role.id )
return_roles.append( dict( id=role_id, name=role.name, type=role.type ) )
return dict( roles=return_roles, page=page, page_limit=page_limit, total=total_roles )
else:
@@ -344,10 +344,10 @@ class LibrariesController( BaseAPIController ):
if len( invalid_modify_roles_names ) > 0:
log.warning( "The following roles could not be added to the modify library permission: " + str( invalid_modify_roles_names ) )
- permissions = { trans.app.security_agent.permitted_actions.LIBRARY_ACCESS : valid_access_roles }
- permissions.update( { trans.app.security_agent.permitted_actions.LIBRARY_ADD : valid_add_roles } )
- permissions.update( { trans.app.security_agent.permitted_actions.LIBRARY_MANAGE : valid_manage_roles } )
- permissions.update( { trans.app.security_agent.permitted_actions.LIBRARY_MODIFY : valid_modify_roles } )
+ permissions = { trans.app.security_agent.permitted_actions.LIBRARY_ACCESS: valid_access_roles }
+ permissions.update( { trans.app.security_agent.permitted_actions.LIBRARY_ADD: valid_add_roles } )
+ permissions.update( { trans.app.security_agent.permitted_actions.LIBRARY_MANAGE: valid_manage_roles } )
+ permissions.update( { trans.app.security_agent.permitted_actions.LIBRARY_MODIFY: valid_modify_roles } )
trans.app.security_agent.set_all_library_permissions( trans, library, permissions )
trans.sa_session.refresh( library )
@@ -355,7 +355,7 @@ class LibrariesController( BaseAPIController ):
trans.app.security_agent.copy_library_permissions( trans, library, library.root_folder )
else:
raise exceptions.RequestParameterInvalidException( 'The mandatory parameter "action" has an invalid value.'
- 'Allowed values are: "remove_restrictions", set_permissions"' )
+ 'Allowed values are: "remove_restrictions", set_permissions"' )
roles = self.library_manager.get_current_roles( trans, library )
return roles
@@ -376,6 +376,5 @@ class LibrariesController( BaseAPIController ):
trans.sa_session.refresh( library )
# Copy the permissions to the root folder
trans.app.security_agent.copy_library_permissions( trans, library, library.root_folder )
- item = library.to_dict( view='element', value_mapper={ 'id' : trans.security.encode_id , 'root_folder_id' : trans.security.encode_id } )
+ item = library.to_dict( view='element', value_mapper={ 'id': trans.security.encode_id, 'root_folder_id': trans.security.encode_id } )
return item
-
diff --git a/lib/galaxy/webapps/galaxy/api/remote_files.py b/lib/galaxy/webapps/galaxy/api/remote_files.py
index 38c0d900536..638e6fb088b 100644
--- a/lib/galaxy/webapps/galaxy/api/remote_files.py
+++ b/lib/galaxy/webapps/galaxy/api/remote_files.py
@@ -4,16 +4,16 @@ API operations on remote files.
import os
import time
import hashlib
-from galaxy import web
from galaxy import exceptions
from galaxy.web import _future_expose_api as expose_api
from galaxy.util import jstree
-from galaxy.web.base.controller import BaseAPIController, url_for
+from galaxy.web.base.controller import BaseAPIController
from operator import itemgetter
import logging
log = logging.getLogger( __name__ )
+
class RemoteFilesAPIController( BaseAPIController ):
@expose_api
@@ -109,9 +109,9 @@ class RemoteFilesAPIController( BaseAPIController ):
for filename in filenames:
path = os.path.relpath( os.path.join( dirpath, filename ), directory )
statinfo = os.lstat( os.path.join( dirpath, filename ) )
- response.append( dict( path = path,
- size = statinfo.st_size,
- ctime = time.strftime( "%m/%d/%Y %I:%M:%S %p", time.localtime( statinfo.st_ctime ) ) ) )
+ response.append( dict( path=path,
+ size=statinfo.st_size,
+ ctime=time.strftime( "%m/%d/%Y %I:%M:%S %p", time.localtime( statinfo.st_ctime ) ) ) )
else:
raise exceptions.ConfigDoesNotAllowException( 'The given directory does not exist.' )
# sort by path
diff --git a/lib/galaxy/webapps/galaxy/api/search.py b/lib/galaxy/webapps/galaxy/api/search.py
index da2aceb4746..444a620aad6 100644
--- a/lib/galaxy/webapps/galaxy/api/search.py
+++ b/lib/galaxy/webapps/galaxy/api/search.py
@@ -9,6 +9,7 @@ from galaxy.exceptions import ItemAccessibilityException
log = logging.getLogger( __name__ )
+
class SearchController( BaseAPIController, SharableItemSecurityMixin ):
@web.expose_api
@@ -24,14 +25,14 @@ class SearchController( BaseAPIController, SharableItemSecurityMixin ):
try:
query = se.query(query_txt)
except Exception, e:
- return {'error' : str(e)}
+ return {'error': str(e)}
if query is not None:
query.decode_query_ids(trans)
current_user_roles = trans.get_current_user_roles()
try:
results = query.process(trans)
except Exception, e:
- return {'error' : str(e)}
+ return {'error': str(e)}
for item in results:
append = False
if trans.user_is_admin():
@@ -49,7 +50,7 @@ class SearchController( BaseAPIController, SharableItemSecurityMixin ):
append = True
except ItemAccessibilityException:
append = False
- elif type ( item ) in [ trans.app.model.PageRevision ]:
+ elif type( item ) in [ trans.app.model.PageRevision ]:
try:
if self.security_check( trans, item.page, False, True):
append = True
@@ -62,4 +63,4 @@ class SearchController( BaseAPIController, SharableItemSecurityMixin ):
if append:
row = query.item_to_api_value(item)
out.append( self.encode_all_ids( trans, row, True) )
- return { 'results' : out }
+ return { 'results': out }
diff --git a/lib/galaxy/webapps/galaxy/api/tools.py b/lib/galaxy/webapps/galaxy/api/tools.py
index a6687438040..6400188a76b 100644
--- a/lib/galaxy/webapps/galaxy/api/tools.py
+++ b/lib/galaxy/webapps/galaxy/api/tools.py
@@ -210,7 +210,6 @@ class ToolsController( BaseAPIController, UsesVisualizationMixin ):
if success:
trans.response.set_content_type( 'application/x-gzip' )
download_file = open( tool_tarball )
- os.unlink( tool_tarball )
tarball_path, filename = os.path.split( tool_tarball )
trans.response.headers[ "Content-Disposition" ] = 'attachment; filename="%s.tgz"' % ( id )
return download_file
@@ -397,7 +396,7 @@ class ToolsController( BaseAPIController, UsesVisualizationMixin ):
# job's previous parameters and incoming parameters. Incoming parameters
# have priority.
#
- original_job = self.hda_manager.creating_job( original_dataset )
+ original_job = self.hda_manager.creating_job( trans, original_dataset )
tool = trans.app.toolbox.get_tool( original_job.tool_id )
if not tool or not tool.allow_user_access( trans.user ):
return trans.app.model.Dataset.conversion_messages.NO_TOOL
diff --git a/lib/galaxy/webapps/galaxy/controllers/library_common.py b/lib/galaxy/webapps/galaxy/controllers/library_common.py
index 2d000f10b8f..1a7bfd80f6a 100644
--- a/lib/galaxy/webapps/galaxy/controllers/library_common.py
+++ b/lib/galaxy/webapps/galaxy/controllers/library_common.py
@@ -1136,7 +1136,7 @@ class LibraryCommon( BaseUIController, UsesFormDefinitionsMixin, UsesExtendedMet
def make_library_uploaded_dataset( self, trans, cntrller, params, name, path, type, library_bunch, in_folder=None ):
link_data_only = params.get( 'link_data_only', 'copy_files' )
uuid_str = params.get( 'uuid', None )
- file_type = params.get( 'file_type' )
+ file_type = params.get( 'file_type', None )
library_bunch.replace_dataset = None # not valid for these types of upload
uploaded_dataset = util.bunch.Bunch()
new_name = name
@@ -1152,8 +1152,8 @@ class LibraryCommon( BaseUIController, UsesFormDefinitionsMixin, UsesExtendedMet
uploaded_dataset.type = type
uploaded_dataset.ext = None
uploaded_dataset.file_type = file_type
- uploaded_dataset.dbkey = params.get( 'dbkey' )
- uploaded_dataset.space_to_tab = params.get( 'space_to_tab' )
+ uploaded_dataset.dbkey = params.get( 'dbkey', None )
+ uploaded_dataset.space_to_tab = params.get( 'space_to_tab', None )
if in_folder:
uploaded_dataset.in_folder = in_folder
uploaded_dataset.data = upload_common.new_upload( trans, cntrller, uploaded_dataset, library_bunch )
diff --git a/lib/galaxy/webapps/galaxy/controllers/tag.py b/lib/galaxy/webapps/galaxy/controllers/tag.py
index bbdf366bbf5..b12e7cd2789 100644
--- a/lib/galaxy/webapps/galaxy/controllers/tag.py
+++ b/lib/galaxy/webapps/galaxy/controllers/tag.py
@@ -42,7 +42,7 @@ class TagsController ( BaseUIController, UsesTagsMixin ):
# Apply tag.
item = self._get_item( trans, item_class, trans.security.decode_id( item_id ) )
user = trans.user
- self.get_tag_handler( trans ).apply_item_tags( trans, user, item, new_tag.encode( 'utf-8' ) )
+ self.get_tag_handler( trans ).apply_item_tags( user, item, new_tag.encode( 'utf-8' ) )
trans.sa_session.flush()
# Log.
params = dict( item_id=item.id, item_class=item_class, tag=new_tag )
@@ -57,7 +57,7 @@ class TagsController ( BaseUIController, UsesTagsMixin ):
# Remove tag.
item = self._get_item( trans, item_class, trans.security.decode_id( item_id ) )
user = trans.user
- self.get_tag_handler( trans ).remove_item_tag( trans, user, item, tag_name.encode( 'utf-8' ) )
+ self.get_tag_handler( trans ).remove_item_tag( user, item, tag_name.encode( 'utf-8' ) )
trans.sa_session.flush()
# Log.
params = dict( item_id=item.id, item_class=item_class, tag=tag_name )
@@ -73,8 +73,8 @@ class TagsController ( BaseUIController, UsesTagsMixin ):
# Apply tags.
item = self._get_item( trans, item_class, trans.security.decode_id( item_id ) )
user = trans.user
- self.get_tag_handler( trans ).delete_item_tags( trans, user, item )
- self.get_tag_handler( trans ).apply_item_tags( trans, user, item, new_tags.encode( 'utf-8' ) )
+ self.get_tag_handler( trans ).delete_item_tags( user, item )
+ self.get_tag_handler( trans ).apply_item_tags( user, item, new_tags.encode( 'utf-8' ) )
trans.sa_session.flush()
@web.expose
diff --git a/lib/galaxy/webapps/galaxy/controllers/visualization.py b/lib/galaxy/webapps/galaxy/controllers/visualization.py
index 990fb5882d3..d1c9868939d 100644
--- a/lib/galaxy/webapps/galaxy/controllers/visualization.py
+++ b/lib/galaxy/webapps/galaxy/controllers/visualization.py
@@ -985,7 +985,7 @@ class VisualizationController( BaseUIController, SharableMixin, UsesVisualizatio
else:
# Loading new visualization.
dataset = self.get_hda_or_ldda( trans, hda_ldda, dataset_id )
- job = self.hda_manager.creating_job( dataset )
+ job = self.hda_manager.creating_job( trans, dataset )
viz_config = {
'dataset_id': dataset_id,
'tool_id': job.tool_id,
@@ -1017,7 +1017,7 @@ class VisualizationController( BaseUIController, SharableMixin, UsesVisualizatio
if dataset_id:
decoded_id = self.decode_id( dataset_id )
hda = self.hda_manager.get_accessible( trans, decoded_id, trans.user )
- hda = self.hda_manager.error_if_uploading( hda )
+ hda = self.hda_manager.error_if_uploading( trans, hda )
else:
return trans.show_message( "Phyloviz couldn't find a dataset_id" )
diff --git a/lib/galaxy/webapps/galaxy/controllers/workflow.py b/lib/galaxy/webapps/galaxy/controllers/workflow.py
index f91f8331fcb..4af614f9cb0 100644
--- a/lib/galaxy/webapps/galaxy/controllers/workflow.py
+++ b/lib/galaxy/webapps/galaxy/controllers/workflow.py
@@ -876,7 +876,7 @@ class WorkflowController( BaseUIController, SharableMixin, UsesStoredWorkflowMix
try:
workflow_data = urllib2.urlopen( url ).read()
except Exception, e:
- message = "Failed to open URL: %s Exception: %s" % ( url, str( e ) )
+ message = "Failed to open URL: %s Exception: %s" % ( url, escape( str( e ) ) )
status = 'error'
elif workflow_text:
# This case occurs when the workflow_text was sent via http from the tool shed.
diff --git a/lib/galaxy/webapps/tool_shed/buildapp.py b/lib/galaxy/webapps/tool_shed/buildapp.py
index 5bbefe1ff3d..2f9e191b94b 100644
--- a/lib/galaxy/webapps/tool_shed/buildapp.py
+++ b/lib/galaxy/webapps/tool_shed/buildapp.py
@@ -144,8 +144,23 @@ def app_factory( global_conf, **kwargs ):
# Wrap the webapp in some useful middleware
if kwargs.get( 'middleware', True ):
webapp = wrap_in_middleware( webapp, global_conf, **kwargs )
- if asbool( kwargs.get( 'static_enabled', True ) ):
- webapp = wrap_in_static( webapp, global_conf, **kwargs )
+ # TEST FOR UWSGI -- TODO save this somewhere so we only have to do it once.
+ is_uwsgi = False
+ try:
+ # The uwsgi module is automatically injected by the parent uwsgi
+ # process and only exists that way. If anything works, this is a
+ # uwsgi-managed process.
+ import uwsgi
+ is_uwsgi = uwsgi.numproc
+ is_uwsgi = True
+ except ImportError:
+ # This is not a uwsgi process, or something went horribly wrong.
+ pass
+ if asbool( kwargs.get( 'static_enabled', True) ):
+ if is_uwsgi:
+ log.error("Static middleware is enabled in your configuration but this is a uwsgi process. Refusing to wrap in static middleware.")
+ else:
+ webapp = wrap_in_static( webapp, global_conf, **kwargs )
# Close any pooled database connections before forking
try:
galaxy.webapps.tool_shed.model.mapping.metadata.engine.connection_provider._pool.dispose()
diff --git a/lib/tool_shed/metadata/metadata_generator.py b/lib/tool_shed/metadata/metadata_generator.py
index 041044ae46a..7523d00e567 100644
--- a/lib/tool_shed/metadata/metadata_generator.py
+++ b/lib/tool_shed/metadata/metadata_generator.py
@@ -456,8 +456,8 @@ class MetadataGenerator( object ):
try:
exported_workflow_dict = json.loads( workflow_text )
except Exception, e:
- log.exception( "Skipping file %s since it does not seem to be a valid exported Galaxy workflow: %s" \
- % str( relative_path ), str( e ) )
+ log.exception( "Skipping file %s since it does not seem to be a valid exported Galaxy workflow: %s"
+ % ( str( relative_path ), str( e ) ) )
valid_exported_galaxy_workflow = False
if valid_exported_galaxy_workflow and \
'a_galaxy_workflow' in exported_workflow_dict and \
diff --git a/static/maps/libs/lunr.js.map b/static/maps/libs/lunr.js.map
deleted file mode 100644
index e3ab4735752..00000000000
--- a/static/maps/libs/lunr.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"lunr.js","sources":["../../src/libs/lunr.js"],"names":["lunr","config","idx","Index","pipeline","add","trimmer","stopWordFilter","stemmer","call","version","utils","warn","global","message","console","this","EventEmitter","events","prototype","addListener","args","Array","slice","arguments","fn","pop","names","TypeError","forEach","name","hasHandler","push","removeListener","fnIndex","indexOf","splice","length","emit","apply","undefined","tokenizer","obj","isArray","map","t","toLowerCase","str","toString","replace","i","test","charAt","substring","split","filter","token","Pipeline","_stack","registeredFunctions","registerFunction","label","warnIfFunctionNotRegistered","isRegistered","load","serialised","fnName","Error","fns","after","existingFn","newFn","pos","before","remove","run","tokens","out","tokenLength","stackLength","j","reset","toJSON","Vector","_magnitude","list","Node","val","next","insert","prev","magnitude","_magniture","node","sumOfSquares","Math","sqrt","dot","otherVector","otherNode","dotProduct","similarity","SortedSet","elements","serialisedData","set","element","locationFor","toArray","ctx","elem","start","end","sectionLength","pivot","floor","pivotElem","intersect","otherSet","intersectSet","a_len","b_len","a","b","clone","union","longSet","shortSet","unionSet","_fields","_ref","documentStore","Store","tokenStore","TokenStore","corpusTokens","eventEmitter","_idfCache","on","bind","off","fields","ref","field","fieldName","opts","boost","refName","doc","emitEvent","docTokens","allDocumentTokens","docRef","fieldTokens","tf","reduce","memo","fieldLength","tokenCount","has","get","update","idf","term","cacheKey","Object","hasOwnProperty","documentFrequency","count","log","search","query","queryTokens","queryVector","documentSets","fieldBoosts","f","hasSomeToken","some","self","expand","key","similarityBoost","diff","max","keys","documentSet","score","documentVector","sort","documentRef","documentTokens","documentTokensLength","use","plugin","unshift","store","id","step2list","ational","tional","enci","anci","izer","bli","alli","entli","eli","ousli","ization","ation","ator","alism","iveness","fulness","ousness","aliti","iviti","biliti","logi","step3list","icate","ative","alize","iciti","ical","ful","ness","c","v","C","V","mgr0","meq1","mgr1","s_v","re_mgr0","RegExp","re_mgr1","re_meq1","re_s_v","re_1a","re2_1a","re_1b","re2_1b","re_1b_2","re2_1b_2","re3_1b_2","re4_1b_2","re_1c","re_2","re_3","re_4","re2_4","re_5","re_5_1","re3_5","porterStemmer","w","stem","suffix","firstch","re","re2","re3","re4","substr","toUpperCase","fp","exec","stopWords","root","docs","rest","getNode","concat","factory","define","amd","exports","module"],"mappings":"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AMK,EAAIpN,KAAK+M,KACzBI,EAAKjB,EACLa,EAAIA,EAAEjN,QAAQqN,EAAG,KAKJ,KAAXD,IACFH,EAAIG,EAAQvN,cAAgBoN,EAAEQ,OAAO,IAGhCR,EAGT,OAAOD,MAGTjQ,EAAKyD,SAASG,iBAAiB5D,EAAKQ,QAAS,WAkB7CR,EAAKO,eAAiB,SAAUiD,GAC9B,MAAqD,KAAjDxD,EAAKO,eAAeuQ,UAAU3O,QAAQqB,GAAsBA,EAAhE,QAGFxD,EAAKO,eAAeuQ,UAAY,GAAI9Q,GAAKsG,UACzCtG,EAAKO,eAAeuQ,UAAUzO,OAAS,IACvCrC,EAAKO,eAAeuQ,UAAUvK,UAC5B,GACA,IACA,OACA,QACA,SACA,QACA,MACA,SACA,OACA,KACA,QACA,KACA,MACA,MACA,MACA,KACA,KACA,KACA,UACA,OACA,MACA,KACA,MACA,SACA,QACA,OACA,MACA,KACA,OACA,SACA,OACA,OACA,QACA,MACA,OACA,MACA,MACA,MACA,MACA,OACA,KACA,MACA,OACA,MACA,MACA,MACA,UACA,IACA,KACA,KACA,OACA,KACA,KACA,MACA,OACA,QACA,MACA,OACA,SACA,MACA,KACA,QACA,OACA,OACA,KACA,UACA,KACA,MACA,MACA,KACA,MACA,QACA,KACA,OACA,KACA,QACA,MACA,MACA,SACA,OACA,MACA,OACA,MACA,SACA,QACA,KACA,OACA,OACA,OACA,MACA,QACA,OACA,OACA,QACA,QACA,OACA,OACA,MACA,KACA,MACA,OACA,KACA,QACA,MACA,KACA,OACA,OACA,OACA,QACA,QACA,QACA,MACA,OACA,MACA,OACA,OACA,QACA,MACA,MACA,QAGFvG,EAAKyD,SAASG,iBAAiB5D,EAAKO,eAAgB,kBAoBpDP,EAAKM,QAAU,SAAUkD,GACvB,MAAOA,GACJP,QAAQ,OAAQ,IAChBA,QAAQ,OAAQ,KAGrBjD,EAAKyD,SAASG,iBAAiB5D,EAAKM,QAAS,WAa7CN,EAAKsI,WAAa,WAChBtH,KAAK+P,MAASC,SACdhQ,KAAKqB,OAAS,GAUhBrC,EAAKsI,WAAWtE,KAAO,SAAUwC,GAC/B,GAAI4F,GAAQ,GAAIpL,KAKhB,OAHAoL,GAAM2E,KAAOvK,EAAeuK,KAC5B3E,EAAM/J,OAASmE,EAAenE,OAEvB+J,GAgBTpM,EAAKsI,WAAWnH,UAAUd,IAAM,SAAUmD,EAAO4F,EAAK2H,GACpD,GAAIA,GAAOA,GAAQ/P,KAAK+P,KACpB1F,EAAM7H,EAAM,GACZyN,EAAOzN,EAAMjC,MAAM,EAIvB,OAFM8J,KAAO0F,KAAOA,EAAK1F,IAAQ2F,UAEb,IAAhBC,EAAK5O,QACP0O,EAAK1F,GAAK2F,KAAK5H,EAAIN,KAAOM,OAC1BpI,KAAKqB,QAAU,IAGRrB,KAAKX,IAAI4Q,EAAM7H,EAAK2H,EAAK1F,KAcpCrL,EAAKsI,WAAWnH,UAAU4I,IAAM,SAAUvG,GACxC,IAAKA,EAAO,OAAO,CAInB,KAAK,GAFDqC,GAAO7E,KAAK+P,KAEP7N,EAAI,EAAGA,EAAIM,EAAMnB,OAAQa,IAAK,CACrC,IAAK2C,EAAKrC,EAAMN,IAAK,OAAO,CAE5B2C,GAAOA,EAAKrC,EAAMN,IAGpB,OAAO,GAeTlD,EAAKsI,WAAWnH,UAAU+P,QAAU,SAAU1N,GAC5C,IAAKA,EAAO,QAIZ,KAAK,GAFDqC,GAAO7E,KAAK+P,KAEP7N,EAAI,EAAGA,EAAIM,EAAMnB,OAAQa,IAAK,CACrC,IAAK2C,EAAKrC,EAAMN,IAAK,QAErB2C,GAAOA,EAAKrC,EAAMN,IAGpB,MAAO2C,IAcT7F,EAAKsI,WAAWnH,UAAU6I,IAAM,SAAUxG,EAAOuN,GAC/C,MAAO/P,MAAKkQ,QAAQ1N,EAAOuN,GAAMC,UAGnChR,EAAKsI,WAAWnH,UAAUqJ,MAAQ,SAAUhH,EAAOuN,GACjD,MAAO1G,QAAOoB,KAAKzK,KAAKgJ,IAAIxG,EAAOuN,IAAO1O,QAe5CrC,EAAKsI,WAAWnH,UAAUuD,OAAS,SAAUlB,EAAOsF,GAClD,GAAKtF,EAAL,CAGA,IAAK,GAFDqC,GAAO7E,KAAK+P,KAEP7N,EAAI,EAAGA,EAAIM,EAAMnB,OAAQa,IAAK,CACrC,KAAMM,EAAMN,IAAM2C,IAAO,MACzBA,GAAOA,EAAKrC,EAAMN,UAGb2C,GAAKmL,KAAKlI,KAWnB9I,EAAKsI,WAAWnH,UAAUiK,OAAS,SAAU5H,EAAOoG,GAClD,GAAImH,GAAO/P,KAAKkQ,QAAQ1N,GACpBwN,EAAOD,EAAKC,SACZpH,EAAOA,KAWX,OATIS,QAAOoB,KAAKuF,GAAM3O,QAAQuH,EAAK5H,KAAKwB,GAExC6G,OAAOoB,KAAKsF,GACTlP,QAAQ,SAAUwJ,GACL,SAARA,GAEJzB,EAAKuH,OAAOnQ,KAAKoK,OAAO5H,EAAQ6H,EAAKzB,KACpC5I,MAEE4I,GAST5J,EAAKsI,WAAWnH,UAAU+D,OAAS,WACjC,OACE6L,KAAM/P,KAAK+P,KACX1O,OAAQrB,KAAKqB,SASb,SAAU0O,EAAMK,GACM,kBAAXC,SAAyBA,OAAOC,IAEzCD,OAAOD,GACqB,gBAAZG,SAMhBC,OAAOD,QAAUH,IAGjBL,EAAK/Q,KAAOoR,KAEdpQ,KAAM,WAMN,MAAOhB"}
\ No newline at end of file
diff --git a/static/maps/mvc/tools.js.map b/static/maps/mvc/tools.js.map
index bf74897fcad..5505d1981e5 100644
--- a/static/maps/mvc/tools.js.map
+++ b/static/maps/mvc/tools.js.map
@@ -1 +1 @@
-{"version":3,"file":"tools.js","sources":["../../src/mvc/tools.js"],"names":["define","_","util","data","VisibilityMixin","hidden","show","this","set","hide","toggle","get","is_visible","attributes","ToolParameter","Backbone","Model","extend","defaults","name","label","type","value","html","num_samples","initialize","unescape","copy","toJSON","set_value","ToolParameterCollection","Collection","model","DataToolParameter","IntegerToolParameter","parseInt","get_samples","d3","scale","linear","domain","ticks","FloatToolParameter","parseFloat","SelectToolParameter","map","option","subModelTypes","integer","float","select","Tool","id","description","target","inputs","outputs","urlRoot","galaxy_config","root","options","p","p_class","rval","prototype","call","i","remove_inputs","types","tool","incompatible_inputs","filter","input","indexOf","remove","only_samplable_inputs","valid_inputs","each","push","apply_search_results","results","set_input_value","find","set_input_values","inputs_dict","self","keys","input_name","run","_run","rerun","target_dataset","regions","action","target_dataset_id","get_inputs_dict","input_dict","additional_params","payload","tool_id","run_deferred","$","Deferred","ss_deferred","ServerStateDeferred","ajax_settings","url","JSON","stringify","dataType","contentType","interval","success_fn","response","when","go","then","result","resolve","DatasetCollection","reset","ToolCollection","View","ToolSectionLabel","ToolSection","elems","open","clear_search_results","elt","cur_label","all_hidden","ToolSearch","search_hint_string","min_chars_for_search","spinner_url","clear_btn_url","search_url","visible","query","clear_key","on","do_search","length","q","timer","clearTimeout","setTimeout","ga","clear_search","ToolPanel","tool_search","tools","layout","parse","parse_elt","elt_dict","model_class","panel_elt","BaseView","update_visible","$el","ToolLinkView","tagName","render","$link","append","Handlebars","templates","tool_link","e","preventDefault","Galaxy","upload","ToolSectionLabelView","className","text","ToolSectionView","update_open","panel_section","section_body","tool_view","label_view","events","click .toolSectionTitle > a","children","slideDown","slideUp","ToolSearchView","click","keyup :input","click #search-clear-btn","tooltip","focus_and_select","focus","clear","val","query_changed","evData","which","ToolPanelView","handle_search_results","search_view","section_title_view","attr","split","trigger","ToolFormView","tool_form","tool_panel_view","collection","tool_form_view","css","show_tool","fetch","done","width"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"tools.js","sources":["../../src/mvc/tools.js"],"names":["define","_","util","data","VisibilityMixin","hidden","show","this","set","hide","toggle","get","is_visible","attributes","ToolParameter","Backbone","Model","extend","defaults","name","label","type","value","html","num_samples","initialize","unescape","copy","toJSON","set_value","ToolParameterCollection","Collection","model","DataToolParameter","IntegerToolParameter","parseInt","get_samples","d3","scale","linear","domain","ticks","FloatToolParameter","parseFloat","SelectToolParameter","map","option","subModelTypes","integer","float","select","Tool","id","description","target","inputs","outputs","urlRoot","galaxy_config","root","options","p","p_class","rval","prototype","call","i","remove_inputs","types","tool","incompatible_inputs","filter","input","indexOf","remove","only_samplable_inputs","valid_inputs","each","push","apply_search_results","results","set_input_value","find","set_input_values","inputs_dict","self","keys","input_name","run","_run","rerun","target_dataset","regions","action","target_dataset_id","get_inputs_dict","input_dict","additional_params","payload","tool_id","run_deferred","$","Deferred","ss_deferred","ServerStateDeferred","ajax_settings","url","JSON","stringify","dataType","contentType","interval","success_fn","response","when","go","then","result","resolve","DatasetCollection","reset","ToolCollection","View","ToolSectionLabel","ToolSection","elems","open","clear_search_results","elt","cur_label","all_hidden","ToolSearch","search_hint_string","min_chars_for_search","spinner_url","clear_btn_url","search_url","visible","query","clear_key","on","do_search","length","q","timer","clearTimeout","setTimeout","ga","clear_search","ToolPanel","tool_search","tools","layout","parse","parse_elt","elt_dict","model_class","panel_elt","BaseView","update_visible","$el","ToolLinkView","tagName","render","$link","append","Handlebars","templates","tool_link","e","preventDefault","Galaxy","upload","ToolSectionLabelView","className","text","ToolSectionView","update_open","panel_section","section_body","tool_view","label_view","events","click .toolSectionTitle > a","children","slideDown","slideUp","ToolSearchView","click","keyup :input","click #search-clear-btn","tooltip","focus_and_select","focus","clear","val","query_changed","evData","which","ToolPanelView","handle_search_results","search_view","section_title_view","attr","split","trigger","ToolFormView","tool_form","tool_panel_view","collection","tool_form_view","css","show_tool","fetch","done","width"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/maps/viz/circster.js.map b/static/maps/viz/circster.js.map
index 88fefdce229..c3636d5c4a7 100644
--- a/static/maps/viz/circster.js.map
+++ b/static/maps/viz/circster.js.map
@@ -1 +1 @@
-{"version":3,"file":"circster.js","sources":["../../src/viz/circster.js"],"names":["require","mod_utils","cssLoadFile","define","_","d3","visualization","config","SVGUtils","Backbone","Model","extend","is_visible","svg_elt","eltBRect","getBoundingClientRect","svgBRect","$","right","left","bottom","top","UsesTicks","drawTicks","parent_elt","data","dataHandler","textTransform","horizontal","ticks","append","selectAll","enter","attr","d","angle","Math","PI","radius","tick_coords","text_coords","text_anchor","style","text","label","formatNum","num","sigDigits","undefined","rval","abs","toPrecision","roundedNum","round","toFixed","CircsterLabelTrack","CircsterView","View","className","initialize","options","this","genome","label_arc_height","scale","circular_views","chords_views","model","get","on","add_track","remove_track","vis_config","update_track_bounds","get_circular_tracks","filter","track","get_chord_tracks","get_tracks_bounds","circular_tracks","dataset_arc_height","get_value","track_gap","min_dimension","min","$el","width","height","radius_start","length","tracks_start_radii","range","map","render","self","chords_tracks","total_gap","tracks_bounds","svg","select","call","behavior","zoom","event","translate","zoom_drag_timeout","clearTimeout","setTimeout","index","view","CircsterBigWigTrackView","el","radius_bounds","CircsterChromInteractionsTrackView","outermost_radius","track_bounds","label_track_view","CircsterChromLabelTrackView","new_track","innermost_radius_bounds","new_view","push","new_track_bounds","each","track_view","i","update_radius_bounds","track_index","tracks","splice","remove","CircsterTrackView","tagName","bg_stroke","loading_bg_fill","bg_fill","chroms_layout","_chroms_layout","data_bounds","get_fill_color","color","track_parent_elt","genome_arcs","arc_gen","arc","innerRadius","outerRadius","chroms_elts","chroms_paths","chrom","data_manager","data_ready_deferred","data_is_ready","when","then","_render_data","render_labels","new_d","transition","duration","_transition_chrom_data","_transition_labels","update_scale","new_scale","old_scale","utils","data_deferred","path_elt","chrom_region","get_chrom_region","can_get_more_detailed_data","get_more_detailed_data","_update_data_bounds","chrom_arc","find","layout","_render_chrom_data","chrom_arcs","chrom_data_paths","num_paths","get_genome_wide_data","genome_wide_data","path_data","reject","chrom_data","path_fn","_get_path_function","p_data","path","new_bounds","get_data_bounds","rendered_deferred","Deferred","set_value","silent","layout_and_data","zip","chroms_data_layout","chrom_info","resolve","chroms_info","get_chroms_info","pie_layout","pie","value","len","sort","init_arcs","gap_per_chrom","new_endAngle","endAngle","startAngle","prototype","min_arc_len","chromArcTicks","k","v","visibleChroms","c","CircsterQuantitativeTrackView","track_config","_update_min_max","_quantile","numbers","quantile","ascending","parent","datum","linear","domain","clamp","line","radial","interpolate","area","_data_bounds_ticks_fn","classed","tick","click","ConfigSettingCollectionView","collection","render_in_modal","labeledChroms","new_data","flatten","values","p","parseInt","max","chord_data","cur_chrom","chrom_chord_data","source_angle","_get_region_angle","target_angle","source","target","concat","chord","position","chrom_angle_data","chrom_layout","Circster","Genome","galaxy_config","app","vis","GenomeVisualization","viz_config","add","key","type","hidden","viz_view","title","dbkey","menu","mod_icon_btn","create_icon_buttons_menu","icon_class","on_click","select_datasets","root","add_tracks","Galaxy","modal","show","body","ajax","url","dataType","id","vis_json","JSON","stringify","success","vis_info","hide","set","vis_id","error","buttons","Cancel","window","location","tooltip_config","placement","tooltip","GalaxyApp"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"circster.js","sources":["../../src/viz/circster.js"],"names":["require","mod_utils","cssLoadFile","define","_","d3","visualization","config","mod_icon_btn","SVGUtils","Backbone","Model","extend","is_visible","svg_elt","eltBRect","getBoundingClientRect","svgBRect","$","right","left","bottom","top","UsesTicks","drawTicks","parent_elt","data","dataHandler","textTransform","horizontal","ticks","append","selectAll","enter","attr","d","angle","Math","PI","radius","tick_coords","text_coords","text_anchor","style","text","label","formatNum","num","sigDigits","undefined","rval","abs","toPrecision","roundedNum","round","toFixed","CircsterLabelTrack","CircsterView","View","className","initialize","options","this","genome","label_arc_height","scale","circular_views","chords_views","model","get","on","add_track","remove_track","vis_config","update_track_bounds","get_circular_tracks","filter","track","get_chord_tracks","get_tracks_bounds","circular_tracks","dataset_arc_height","get_value","track_gap","min_dimension","min","$el","width","height","radius_start","length","tracks_start_radii","range","map","render","self","chords_tracks","total_gap","tracks_bounds","svg","select","call","behavior","zoom","event","translate","zoom_drag_timeout","clearTimeout","setTimeout","index","view","CircsterBigWigTrackView","el","radius_bounds","CircsterChromInteractionsTrackView","outermost_radius","track_bounds","label_track_view","CircsterChromLabelTrackView","new_track","innermost_radius_bounds","new_view","push","new_track_bounds","each","track_view","i","update_radius_bounds","track_index","tracks","splice","remove","CircsterTrackView","tagName","bg_stroke","loading_bg_fill","bg_fill","chroms_layout","_chroms_layout","data_bounds","get_fill_color","color","track_parent_elt","genome_arcs","arc_gen","arc","innerRadius","outerRadius","chroms_elts","chroms_paths","chrom","data_manager","data_ready_deferred","data_is_ready","when","then","_render_data","render_labels","new_d","transition","duration","_transition_chrom_data","_transition_labels","update_scale","new_scale","old_scale","utils","data_deferred","path_elt","chrom_region","get_chrom_region","can_get_more_detailed_data","get_more_detailed_data","_update_data_bounds","chrom_arc","find","layout","_render_chrom_data","chrom_arcs","chrom_data_paths","num_paths","get_genome_wide_data","genome_wide_data","path_data","reject","chrom_data","path_fn","_get_path_function","p_data","path","new_bounds","get_data_bounds","rendered_deferred","Deferred","set_value","silent","layout_and_data","zip","chroms_data_layout","chrom_info","resolve","chroms_info","get_chroms_info","pie_layout","pie","value","len","sort","init_arcs","gap_per_chrom","new_endAngle","endAngle","startAngle","prototype","min_arc_len","chromArcTicks","k","v","visibleChroms","c","CircsterQuantitativeTrackView","track_config","_update_min_max","_quantile","numbers","quantile","ascending","parent","datum","linear","domain","clamp","line","radial","interpolate","area","_data_bounds_ticks_fn","classed","tick","click","ConfigSettingCollectionView","collection","render_in_modal","labeledChroms","new_data","flatten","values","p","parseInt","max","chord_data","cur_chrom","chrom_chord_data","source_angle","_get_region_angle","target_angle","source","target","concat","chord","position","chrom_angle_data","chrom_layout","Circster","Genome","galaxy_config","app","vis","GenomeVisualization","viz_config","add","key","type","hidden","viz_view","title","dbkey","menu","create_icon_buttons_menu","icon_class","on_click","select_datasets","root","add_tracks","Galaxy","modal","show","body","ajax","url","dataType","id","vis_json","JSON","stringify","success","vis_info","hide","set","vis_id","error","buttons","Cancel","window","location","tooltip_config","placement","tooltip","GalaxyApp"],"mappings":"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"}
\ No newline at end of file
diff --git a/static/scripts/libs/lunr.js b/static/scripts/libs/lunr.js
deleted file mode 100644
index bb99c6a648e..00000000000
--- a/static/scripts/libs/lunr.js
+++ /dev/null
@@ -1,2 +0,0 @@
-!function(){var a=function(b){var c=new a.Index;return c.pipeline.add(a.trimmer,a.stopWordFilter,a.stemmer),b&&b.call(c,c),c};a.version="0.5.7",a.utils={},a.utils.warn=function(a){return function(b){a.console&&console.warn&&console.warn(b)}}(this),a.EventEmitter=function(){this.events={}},a.EventEmitter.prototype.addListener=function(){var a=Array.prototype.slice.call(arguments),b=a.pop(),c=a;if("function"!=typeof b)throw new TypeError("last argument must be a function");c.forEach(function(a){this.hasHandler(a)||(this.events[a]=[]),this.events[a].push(b)},this)},a.EventEmitter.prototype.removeListener=function(a,b){if(this.hasHandler(a)){var c=this.events[a].indexOf(b);this.events[a].splice(c,1),this.events[a].length||delete this.events[a]}},a.EventEmitter.prototype.emit=function(a){if(this.hasHandler(a)){var b=Array.prototype.slice.call(arguments,1);this.events[a].forEach(function(a){a.apply(void 0,b)})}},a.EventEmitter.prototype.hasHandler=function(a){return a in this.events},a.tokenizer=function(a){if(!arguments.length||null==a||void 0==a)return[];if(Array.isArray(a))return a.map(function(a){return a.toLowerCase()});for(var b=a.toString().replace(/^\s+/,""),c=b.length-1;c>=0;c--)if(/\S/.test(b.charAt(c))){b=b.substring(0,c+1);break}return b.split(/(?:\s+|\-)/).filter(function(a){return!!a}).map(function(a){return a.toLowerCase()})},a.Pipeline=function(){this._stack=[]},a.Pipeline.registeredFunctions={},a.Pipeline.registerFunction=function(b,c){c in this.registeredFunctions&&a.utils.warn("Overwriting existing registered function: "+c),b.label=c,a.Pipeline.registeredFunctions[b.label]=b},a.Pipeline.warnIfFunctionNotRegistered=function(b){var c=b.label&&b.label in this.registeredFunctions;c||a.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",b)},a.Pipeline.load=function(b){var c=new a.Pipeline;return b.forEach(function(b){var d=a.Pipeline.registeredFunctions[b];if(!d)throw new Error("Cannot load un-registered function: "+b);c.add(d)}),c},a.Pipeline.prototype.add=function(){var b=Array.prototype.slice.call(arguments);b.forEach(function(b){a.Pipeline.warnIfFunctionNotRegistered(b),this._stack.push(b)},this)},a.Pipeline.prototype.after=function(b,c){a.Pipeline.warnIfFunctionNotRegistered(c);var d=this._stack.indexOf(b)+1;this._stack.splice(d,0,c)},a.Pipeline.prototype.before=function(b,c){a.Pipeline.warnIfFunctionNotRegistered(c);var d=this._stack.indexOf(b);this._stack.splice(d,0,c)},a.Pipeline.prototype.remove=function(a){var b=this._stack.indexOf(a);this._stack.splice(b,1)},a.Pipeline.prototype.run=function(a){for(var b=[],c=a.length,d=this._stack.length,e=0;c>e;e++){for(var f=a[e],g=0;d>g&&(f=this._stack[g](f,e,a),void 0!==f);g++);void 0!==f&&b.push(f)}return b},a.Pipeline.prototype.reset=function(){this._stack=[]},a.Pipeline.prototype.toJSON=function(){return this._stack.map(function(b){return a.Pipeline.warnIfFunctionNotRegistered(b),b.label})},a.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},a.Vector.Node=function(a,b,c){this.idx=a,this.val=b,this.next=c},a.Vector.prototype.insert=function(b,c){var d=this.list;if(!d)return this.list=new a.Vector.Node(b,c,d),this.length++;for(var e=d,f=d.next;void 0!=f;){if(bc.idx?c=c.next:(d+=b.val*c.val,b=b.next,c=c.next);return d},a.Vector.prototype.similarity=function(a){return this.dot(a)/(this.magnitude()*a.magnitude())},a.SortedSet=function(){this.length=0,this.elements=[]},a.SortedSet.load=function(a){var b=new this;return b.elements=a,b.length=a.length,b},a.SortedSet.prototype.add=function(){Array.prototype.slice.call(arguments).forEach(function(a){~this.indexOf(a)||this.elements.splice(this.locationFor(a),0,a)},this),this.length=this.elements.length},a.SortedSet.prototype.toArray=function(){return this.elements.slice()},a.SortedSet.prototype.map=function(a,b){return this.elements.map(a,b)},a.SortedSet.prototype.forEach=function(a,b){return this.elements.forEach(a,b)},a.SortedSet.prototype.indexOf=function(a,b,c){var b=b||0,c=c||this.elements.length,d=c-b,e=b+Math.floor(d/2),f=this.elements[e];return 1>=d?f===a?e:-1:a>f?this.indexOf(a,e,c):f>a?this.indexOf(a,b,e):f===a?e:void 0},a.SortedSet.prototype.locationFor=function(a,b,c){var b=b||0,c=c||this.elements.length,d=c-b,e=b+Math.floor(d/2),f=this.elements[e];if(1>=d){if(f>a)return e;if(a>f)return e+1}return a>f?this.locationFor(a,e,c):f>a?this.locationFor(a,b,e):void 0},a.SortedSet.prototype.intersect=function(b){for(var c=new a.SortedSet,d=0,e=0,f=this.length,g=b.length,h=this.elements,i=b.elements;;){if(d>f-1||e>g-1)break;h[d]!==i[e]?h[d]i[e]&&e++:(c.add(h[d]),d++,e++)}return c},a.SortedSet.prototype.clone=function(){var b=new a.SortedSet;return b.elements=this.toArray(),b.length=b.elements.length,b},a.SortedSet.prototype.union=function(a){var b,c,d;return this.length>=a.length?(b=this,c=a):(b=a,c=this),d=b.clone(),d.add.apply(d,c.toArray()),d},a.SortedSet.prototype.toJSON=function(){return this.toArray()},a.Index=function(){this._fields=[],this._ref="id",this.pipeline=new a.Pipeline,this.documentStore=new a.Store,this.tokenStore=new a.TokenStore,this.corpusTokens=new a.SortedSet,this.eventEmitter=new a.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},a.Index.prototype.on=function(){var a=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,a)},a.Index.prototype.off=function(a,b){return this.eventEmitter.removeListener(a,b)},a.Index.load=function(b){b.version!==a.version&&a.utils.warn("version mismatch: current "+a.version+" importing "+b.version);var c=new this;return c._fields=b.fields,c._ref=b.ref,c.documentStore=a.Store.load(b.documentStore),c.tokenStore=a.TokenStore.load(b.tokenStore),c.corpusTokens=a.SortedSet.load(b.corpusTokens),c.pipeline=a.Pipeline.load(b.pipeline),c},a.Index.prototype.field=function(a,b){var b=b||{},c={name:a,boost:b.boost||1};return this._fields.push(c),this},a.Index.prototype.ref=function(a){return this._ref=a,this},a.Index.prototype.add=function(b,c){var d={},e=new a.SortedSet,f=b[this._ref],c=void 0===c?!0:c;this._fields.forEach(function(c){var f=this.pipeline.run(a.tokenizer(b[c.name]));d[c.name]=f,a.SortedSet.prototype.add.apply(e,f)},this),this.documentStore.set(f,e),a.SortedSet.prototype.add.apply(this.corpusTokens,e.toArray());for(var g=0;g0&&(d=1+Math.log(this.tokenStore.length/c)),this._idfCache[b]=d},a.Index.prototype.search=function(b){var c=this.pipeline.run(a.tokenizer(b)),d=new a.Vector,e=[],f=this._fields.reduce(function(a,b){return a+b.boost},0),g=c.some(function(a){return this.tokenStore.has(a)},this);if(!g)return[];c.forEach(function(b,c,g){var h=1/g.length*this._fields.length*f,i=this,j=this.tokenStore.expand(b).reduce(function(c,e){var f=i.corpusTokens.indexOf(e),g=i.idf(e),j=1,k=new a.SortedSet;if(e!==b){var l=Math.max(3,e.length-b.length);j=1/Math.log(l)}return f>-1&&d.insert(f,h*g*j),Object.keys(i.tokenStore.get(e)).forEach(function(a){k.add(a)}),c.union(k)},new a.SortedSet);e.push(j)},this);var h=e.reduce(function(a,b){return a.intersect(b)});return h.map(function(a){return{ref:a,score:d.similarity(this.documentVector(a))}},this).sort(function(a,b){return b.score-a.score})},a.Index.prototype.documentVector=function(b){for(var c=this.documentStore.get(b),d=c.length,e=new a.Vector,f=0;d>f;f++){var g=c.elements[f],h=this.tokenStore.get(g)[b].tf,i=this.idf(g);e.insert(this.corpusTokens.indexOf(g),h*i)}return e},a.Index.prototype.toJSON=function(){return{version:a.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},a.Index.prototype.use=function(a){var b=Array.prototype.slice.call(arguments,1);b.unshift(this),a.apply(this,b)},a.Store=function(){this.store={},this.length=0},a.Store.load=function(b){var c=new this;return c.length=b.length,c.store=Object.keys(b.store).reduce(function(c,d){return c[d]=a.SortedSet.load(b.store[d]),c},{}),c},a.Store.prototype.set=function(a,b){this.has(a)||this.length++,this.store[a]=b},a.Store.prototype.get=function(a){return this.store[a]},a.Store.prototype.has=function(a){return a in this.store},a.Store.prototype.remove=function(a){this.has(a)&&(delete this.store[a],this.length--)},a.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},a.stemmer=function(){var a={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},b={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},c="[^aeiou]",d="[aeiouy]",e=c+"[^aeiouy]*",f=d+"[aeiou]*",g="^("+e+")?"+f+e,h="^("+e+")?"+f+e+"("+f+")?$",i="^("+e+")?"+f+e+f+e,j="^("+e+")?"+d,k=new RegExp(g),l=new RegExp(i),m=new RegExp(h),n=new RegExp(j),o=/^(.+?)(ss|i)es$/,p=/^(.+?)([^s])s$/,q=/^(.+?)eed$/,r=/^(.+?)(ed|ing)$/,s=/.$/,t=/(at|bl|iz)$/,u=new RegExp("([^aeiouylsz])\\1$"),v=new RegExp("^"+e+d+"[^aeiouwxy]$"),w=/^(.+?[^aeiou])y$/,x=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,y=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,z=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,A=/^(.+?)(s|t)(ion)$/,B=/^(.+?)e$/,C=/ll$/,D=new RegExp("^"+e+d+"[^aeiouwxy]$"),E=function(c){var d,e,f,g,h,i,j;if(c.length<3)return c;if(f=c.substr(0,1),"y"==f&&(c=f.toUpperCase()+c.substr(1)),g=o,h=p,g.test(c)?c=c.replace(g,"$1$2"):h.test(c)&&(c=c.replace(h,"$1$2")),g=q,h=r,g.test(c)){var E=g.exec(c);g=k,g.test(E[1])&&(g=s,c=c.replace(g,""))}else if(h.test(c)){var E=h.exec(c);d=E[1],h=n,h.test(d)&&(c=d,h=t,i=u,j=v,h.test(c)?c+="e":i.test(c)?(g=s,c=c.replace(g,"")):j.test(c)&&(c+="e"))}if(g=w,g.test(c)){var E=g.exec(c);d=E[1],c=d+"i"}if(g=x,g.test(c)){var E=g.exec(c);d=E[1],e=E[2],g=k,g.test(d)&&(c=d+a[e])}if(g=y,g.test(c)){var E=g.exec(c);d=E[1],e=E[2],g=k,g.test(d)&&(c=d+b[e])}if(g=z,h=A,g.test(c)){var E=g.exec(c);d=E[1],g=l,g.test(d)&&(c=d)}else if(h.test(c)){var E=h.exec(c);d=E[1]+E[2],h=l,h.test(d)&&(c=d)}if(g=B,g.test(c)){var E=g.exec(c);d=E[1],g=l,h=m,i=D,(g.test(d)||h.test(d)&&!i.test(d))&&(c=d)}return g=C,h=l,g.test(c)&&h.test(c)&&(g=s,c=c.replace(g,"")),"y"==f&&(c=f.toLowerCase()+c.substr(1)),c};return E}(),a.Pipeline.registerFunction(a.stemmer,"stemmer"),a.stopWordFilter=function(b){return-1===a.stopWordFilter.stopWords.indexOf(b)?b:void 0},a.stopWordFilter.stopWords=new a.SortedSet,a.stopWordFilter.stopWords.length=119,a.stopWordFilter.stopWords.elements=["","a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"],a.Pipeline.registerFunction(a.stopWordFilter,"stopWordFilter"),a.trimmer=function(a){return a.replace(/^\W+/,"").replace(/\W+$/,"")},a.Pipeline.registerFunction(a.trimmer,"trimmer"),a.TokenStore=function(){this.root={docs:{}},this.length=0},a.TokenStore.load=function(a){var b=new this;return b.root=a.root,b.length=a.length,b},a.TokenStore.prototype.add=function(a,b,c){var c=c||this.root,d=a[0],e=a.slice(1);return d in c||(c[d]={docs:{}}),0===e.length?(c[d].docs[b.ref]=b,void(this.length+=1)):this.add(e,b,c[d])},a.TokenStore.prototype.has=function(a){if(!a)return!1;for(var b=this.root,c=0;c");return a.append(Handlebars.templates.tool_link(this.model.toJSON())),"upload1"===this.model.id&&a.find("a").on("click",function(a){a.preventDefault(),Galaxy.upload.show()}),this.$el.append(a),this}}),s=q.extend({tagName:"div",className:"toolPanelLabel",render:function(){return this.$el.append($("").text(this.model.attributes.text)),this}}),t=q.extend({tagName:"div",className:"toolSectionWrapper",initialize:function(){q.prototype.initialize.call(this),this.model.on("change:open",this.update_open,this)},render:function(){this.$el.append(Handlebars.templates.panel_section(this.model.toJSON()));var b=this.$el.find(".toolSectionBody");return a.each(this.model.attributes.elems,function(a){if(a instanceof k){var c=new r({model:a,className:"toolTitle"});c.render(),b.append(c.$el)}else if(a instanceof m){var d=new s({model:a});d.render(),b.append(d.$el)}}),this},events:{"click .toolSectionTitle > a":"toggle"},toggle:function(){this.model.set("open",!this.model.attributes.open)},update_open:function(){this.model.attributes.open?this.$el.children(".toolSectionBody").slideDown("fast"):this.$el.children(".toolSectionBody").slideUp("fast")}}),u=Backbone.View.extend({tagName:"div",id:"tool-search",className:"bar",events:{click:"focus_and_select","keyup :input":"query_changed","click #search-clear-btn":"clear"},render:function(){return this.$el.append(Handlebars.templates.tool_search(this.model.toJSON())),this.model.is_visible()||this.$el.hide(),this.$el.find("[title]").tooltip(),this},focus_and_select:function(){this.$el.find(":input").focus().select()},clear:function(){return this.model.clear_search(),this.$el.find(":input").val(""),this.focus_and_select(),!1},query_changed:function(a){return this.model.attributes.clear_key&&this.model.attributes.clear_key===a.which?(this.clear(),!1):void this.model.set("query",this.$el.find(":input").val())}}),v=Backbone.View.extend({tagName:"div",className:"toolMenu",initialize:function(){this.model.get("tool_search").on("change:results",this.handle_search_results,this)},render:function(){var a=this,b=new u({model:this.model.get("tool_search")});return b.render(),a.$el.append(b.$el),this.model.get("layout").each(function(b){if(b instanceof n){var c=new t({model:b});c.render(),a.$el.append(c.$el)}else if(b instanceof k){var d=new r({model:b,className:"toolTitleNoSection"});d.render(),a.$el.append(d.$el)}else if(b instanceof m){var e=new s({model:b});e.render(),a.$el.append(e.$el)}}),a.$el.find("a.tool-link").click(function(b){var c=$(this).attr("class").split(/\s+/)[0],d=a.model.get("tools").get(c);a.trigger("tool_link_click",b,d)}),this},handle_search_results:function(){var a=this.model.get("tool_search").get("results");a&&0===a.length?$("#search-no-results").show():$("#search-no-results").hide()}}),w=Backbone.View.extend({className:"toolForm",render:function(){this.$el.children().remove(),this.$el.append(Handlebars.templates.tool_form(this.model.toJSON()))}});Backbone.View.extend({className:"toolMenuAndView",initialize:function(){this.tool_panel_view=new v({collection:this.collection}),this.tool_form_view=new w},render:function(){this.tool_panel_view.render(),this.tool_panel_view.$el.css("float","left"),this.$el.append(this.tool_panel_view.$el),this.tool_form_view.$el.hide(),this.$el.append(this.tool_form_view.$el);var a=this;this.tool_panel_view.on("tool_link_click",function(b,c){b.preventDefault(),a.show_tool(c)})},show_tool:function(a){var b=this;a.fetch().done(function(){b.tool_form_view.model=a,b.tool_form_view.render(),b.tool_form_view.$el.show(),$("#left").width("650px")})}})}return{ToolParameter:e,IntegerToolParameter:h,SelectToolParameter:j,Tool:k,ToolCollection:l,ToolSearch:o,ToolPanel:p,ToolPanelView:v,ToolFormView:w}});
+define(["libs/underscore","viz/trackster/util","mvc/data"],function(a,b,c){var d={hidden:!1,show:function(){this.set("hidden",!1)},hide:function(){this.set("hidden",!0)},toggle:function(){this.set("hidden",!this.get("hidden"))},is_visible:function(){return!this.attributes.hidden}},e=Backbone.Model.extend({defaults:{name:null,label:null,type:null,value:null,html:null,num_samples:5},initialize:function(){this.attributes.html=unescape(this.attributes.html)},copy:function(){return new e(this.toJSON())},set_value:function(a){this.set("value",a||"")}}),f=Backbone.Collection.extend({model:e}),g=e.extend({}),h=e.extend({set_value:function(a){this.set("value",parseInt(a,10))},get_samples:function(){return d3.scale.linear().domain([this.get("min"),this.get("max")]).ticks(this.get("num_samples"))}}),i=h.extend({set_value:function(a){this.set("value",parseFloat(a))}}),j=e.extend({get_samples:function(){return a.map(this.get("options"),function(a){return a[0]})}});e.subModelTypes={integer:h,"float":i,data:g,select:j};var k=Backbone.Model.extend({defaults:{id:null,name:null,description:null,target:null,inputs:[],outputs:[]},urlRoot:galaxy_config.root+"api/tools",initialize:function(b){this.set("inputs",new f(a.map(b.inputs,function(a){var b=e.subModelTypes[a.type]||e;return new b(a)})))},toJSON:function(){var a=Backbone.Model.prototype.toJSON.call(this);return a.inputs=this.get("inputs").map(function(a){return a.toJSON()}),a},remove_inputs:function(a){var b=this,c=b.get("inputs").filter(function(b){return-1!==a.indexOf(b.get("type"))});b.get("inputs").remove(c)},copy:function(a){var b=new k(this.toJSON());if(a){var c=new Backbone.Collection;b.get("inputs").each(function(a){a.get_samples()&&c.push(a)}),b.set("inputs",c)}return b},apply_search_results:function(b){return-1!==a.indexOf(b,this.attributes.id)?this.show():this.hide(),this.is_visible()},set_input_value:function(a,b){this.get("inputs").find(function(b){return b.get("name")===a}).set("value",b)},set_input_values:function(b){var c=this;a.each(a.keys(b),function(a){c.set_input_value(a,b[a])})},run:function(){return this._run()},rerun:function(a,b){return this._run({action:"rerun",target_dataset_id:a.id,regions:b})},get_inputs_dict:function(){var a={};return this.get("inputs").each(function(b){a[b.get("name")]=b.get("value")}),a},_run:function(d){var e=a.extend({tool_id:this.id,inputs:this.get_inputs_dict()},d),f=$.Deferred(),g=new b.ServerStateDeferred({ajax_settings:{url:this.urlRoot,data:JSON.stringify(e),dataType:"json",contentType:"application/json",type:"POST"},interval:2e3,success_fn:function(a){return"pending"!==a}});return $.when(g.go()).then(function(a){f.resolve((new c.DatasetCollection).reset(a))}),f}});a.extend(k.prototype,d);var l=(Backbone.View.extend({}),Backbone.Collection.extend({model:k})),m=Backbone.Model.extend(d),n=Backbone.Model.extend({defaults:{elems:[],open:!1},clear_search_results:function(){a.each(this.attributes.elems,function(a){a.show()}),this.show(),this.set("open",!1)},apply_search_results:function(b){var c,d=!0;a.each(this.attributes.elems,function(a){a instanceof m?(c=a,c.hide()):a instanceof k&&a.apply_search_results(b)&&(d=!1,c&&c.show())}),d?this.hide():(this.show(),this.set("open",!0))}});a.extend(n.prototype,d);var o=Backbone.Model.extend({defaults:{search_hint_string:"search tools",min_chars_for_search:3,spinner_url:"",clear_btn_url:"",search_url:"",visible:!0,query:"",results:null,clear_key:27},urlRoot:galaxy_config.root+"api/tools",initialize:function(){this.on("change:query",this.do_search)},do_search:function(){var a=this.attributes.query;if(a.length");return a.append(Handlebars.templates.tool_link(this.model.toJSON())),"upload1"===this.model.id&&a.find("a").on("click",function(a){a.preventDefault(),Galaxy.upload.show()}),this.$el.append(a),this}}),s=q.extend({tagName:"div",className:"toolPanelLabel",render:function(){return this.$el.append($("").text(this.model.attributes.text)),this}}),t=q.extend({tagName:"div",className:"toolSectionWrapper",initialize:function(){q.prototype.initialize.call(this),this.model.on("change:open",this.update_open,this)},render:function(){this.$el.append(Handlebars.templates.panel_section(this.model.toJSON()));var b=this.$el.find(".toolSectionBody");return a.each(this.model.attributes.elems,function(a){if(a instanceof k){var c=new r({model:a,className:"toolTitle"});c.render(),b.append(c.$el)}else if(a instanceof m){var d=new s({model:a});d.render(),b.append(d.$el)}}),this},events:{"click .toolSectionTitle > a":"toggle"},toggle:function(){this.model.set("open",!this.model.attributes.open)},update_open:function(){this.model.attributes.open?this.$el.children(".toolSectionBody").slideDown("fast"):this.$el.children(".toolSectionBody").slideUp("fast")}}),u=Backbone.View.extend({tagName:"div",id:"tool-search",className:"bar",events:{click:"focus_and_select","keyup :input":"query_changed","click #search-clear-btn":"clear"},render:function(){return this.$el.append(Handlebars.templates.tool_search(this.model.toJSON())),this.model.is_visible()||this.$el.hide(),this.$el.find("[title]").tooltip(),this},focus_and_select:function(){this.$el.find(":input").focus().select()},clear:function(){return this.model.clear_search(),this.$el.find(":input").val(""),this.focus_and_select(),!1},query_changed:function(a){return this.model.attributes.clear_key&&this.model.attributes.clear_key===a.which?(this.clear(),!1):void this.model.set("query",this.$el.find(":input").val())}}),v=Backbone.View.extend({tagName:"div",className:"toolMenu",initialize:function(){this.model.get("tool_search").on("change:results",this.handle_search_results,this)},render:function(){var a=this,b=new u({model:this.model.get("tool_search")});return b.render(),a.$el.append(b.$el),this.model.get("layout").each(function(b){if(b instanceof n){var c=new t({model:b});c.render(),a.$el.append(c.$el)}else if(b instanceof k){var d=new r({model:b,className:"toolTitleNoSection"});d.render(),a.$el.append(d.$el)}else if(b instanceof m){var e=new s({model:b});e.render(),a.$el.append(e.$el)}}),a.$el.find("a.tool-link").click(function(b){var c=$(this).attr("class").split(/\s+/)[0],d=a.model.get("tools").get(c);a.trigger("tool_link_click",b,d)}),this},handle_search_results:function(){var a=this.model.get("tool_search").get("results");a&&0===a.length?$("#search-no-results").show():$("#search-no-results").hide()}}),w=Backbone.View.extend({className:"toolForm",render:function(){this.$el.children().remove(),this.$el.append(Handlebars.templates.tool_form(this.model.toJSON()))}});Backbone.View.extend({className:"toolMenuAndView",initialize:function(){this.tool_panel_view=new v({collection:this.collection}),this.tool_form_view=new w},render:function(){this.tool_panel_view.render(),this.tool_panel_view.$el.css("float","left"),this.$el.append(this.tool_panel_view.$el),this.tool_form_view.$el.hide(),this.$el.append(this.tool_form_view.$el);var a=this;this.tool_panel_view.on("tool_link_click",function(b,c){b.preventDefault(),a.show_tool(c)})},show_tool:function(a){var b=this;a.fetch().done(function(){b.tool_form_view.model=a,b.tool_form_view.render(),b.tool_form_view.$el.show(),$("#left").width("650px")})}})}return{ToolParameter:e,IntegerToolParameter:h,SelectToolParameter:j,Tool:k,ToolCollection:l,ToolSearch:o,ToolPanel:p,ToolPanelView:v,ToolFormView:w}});
//# sourceMappingURL=../../maps/mvc/tools.js.map
\ No newline at end of file
diff --git a/static/scripts/viz/circster.js b/static/scripts/viz/circster.js
index 9ee68c2fb8b..0d1c77225b7 100644
--- a/static/scripts/viz/circster.js
+++ b/static/scripts/viz/circster.js
@@ -1,2 +1,2 @@
-require(["utils/utils","mvc/ui/icon-button","libs/farbtastic"],function(a){a.cssLoadFile("static/style/circster.css")}),define(["libs/underscore","libs/d3","viz/visualization","utils/config"],function(a,b,c,d){var e=Backbone.Model.extend({is_visible:function(a){var b=a.getBoundingClientRect(),c=$("svg")[0].getBoundingClientRect();return b.right<0||b.left>c.right||b.bottom<0||b.top>c.bottom?!1:!0}}),f={drawTicks:function(a,b,c,d,e){var f=a.append("g").selectAll("g").data(b).enter().append("g").selectAll("g").data(c).enter().append("g").attr("class","tick").attr("transform",function(a){return"rotate("+(180*a.angle/Math.PI-90)+")translate("+a.radius+",0)"}),g=[],h=[],i=function(a){return a.angle>Math.PI?"end":null};return e?(g=[0,0,0,-4],h=[4,0,"",".35em"],i=null):(g=[1,0,4,0],h=[0,4,".35em",""]),f.append("line").attr("x1",g[0]).attr("y1",g[1]).attr("x2",g[2]).attr("y1",g[3]).style("stroke","#000"),f.append("text").attr("x",h[0]).attr("y",h[1]).attr("dx",h[2]).attr("dy",h[3]).attr("text-anchor",i).attr("transform",d).text(function(a){return a.label})},formatNum:function(a,b){if(void 0===b&&(b=2),null===a)return null;var c=null;if(Math.abs(a)<1)c=a.toPrecision(b);else{var d=Math.round(a.toPrecision(b));a=Math.abs(a),1e3>a?c=d:1e6>a?c=Math.round((d/1e3).toPrecision(3)).toFixed(0)+"K":1e9>a&&(c=Math.round((d/1e6).toPrecision(3)).toFixed(0)+"M")}return c}},g=Backbone.Model.extend({}),h=Backbone.View.extend({className:"circster",initialize:function(a){this.genome=a.genome,this.label_arc_height=50,this.scale=1,this.circular_views=null,this.chords_views=null,this.model.get("drawables").on("add",this.add_track,this),this.model.get("drawables").on("remove",this.remove_track,this);var b=this.model.get("config");b.get("arc_dataset_height").on("change:value",this.update_track_bounds,this),b.get("track_gap").on("change:value",this.update_track_bounds,this)},get_circular_tracks:function(){return this.model.get("drawables").filter(function(a){return"DiagonalHeatmapTrack"!==a.get("track_type")})},get_chord_tracks:function(){return this.model.get("drawables").filter(function(a){return"DiagonalHeatmapTrack"===a.get("track_type")})},get_tracks_bounds:function(){var c=this.get_circular_tracks(),d=this.model.get("config").get_value("arc_dataset_height"),e=this.model.get("config").get_value("track_gap"),f=Math.min(this.$el.width(),this.$el.height())-20,g=f/2-c.length*(d+e)+e-this.label_arc_height,h=b.range(g,f/2,d+e);return a.map(h,function(a){return[a,a+d]})},render:function(){var a=this,c=a.$el.width(),d=a.$el.height(),e=this.get_circular_tracks(),f=this.get_chord_tracks(),h=a.model.get("config").get_value("total_gap"),i=this.get_tracks_bounds(),k=b.select(a.$el[0]).append("svg").attr("width",c).attr("height",d).attr("pointer-events","all").append("svg:g").call(b.behavior.zoom().on("zoom",function(){var c=b.event.scale;k.attr("transform","translate("+b.event.translate+") scale("+c+")"),a.scale!==c&&(a.zoom_drag_timeout&&clearTimeout(a.zoom_drag_timeout),a.zoom_drag_timeout=setTimeout(function(){},400))})).attr("transform","translate("+c/2+","+d/2+")").append("svg:g").attr("class","tracks");this.circular_views=e.map(function(b,c){var d=new l({el:k.append("g")[0],track:b,radius_bounds:i[c],genome:a.genome,total_gap:h});return d.render(),d}),this.chords_views=f.map(function(b){var c=new m({el:k.append("g")[0],track:b,radius_bounds:i[0],genome:a.genome,total_gap:h});return c.render(),c});var n=this.circular_views[this.circular_views.length-1].radius_bounds[1],o=[n,n+this.label_arc_height];this.label_track_view=new j({el:k.append("g")[0],track:new g,radius_bounds:o,genome:a.genome,total_gap:h}),this.label_track_view.render()},add_track:function(c){var d=this.model.get("config").get_value("total_gap");if("DiagonalHeatmapTrack"===c.get("track_type")){var e=this.circular_views[0].radius_bounds,f=new m({el:b.select("g.tracks").append("g")[0],track:c,radius_bounds:e,genome:this.genome,total_gap:d});f.render(),this.chords_views.push(f)}else{var g=this.get_tracks_bounds();a.each(this.circular_views,function(a,b){a.update_radius_bounds(g[b])}),a.each(this.chords_views,function(a){a.update_radius_bounds(g[0])});var h=this.circular_views.length,i=new l({el:b.select("g.tracks").append("g")[0],track:c,radius_bounds:g[h],genome:this.genome,total_gap:d});i.render(),this.circular_views.push(i)}},remove_track:function(b,c,d){var e=this.circular_views[d.index];this.circular_views.splice(d.index,1),e.$el.remove();var f=this.get_tracks_bounds();a.each(this.circular_views,function(a,b){a.update_radius_bounds(f[b])})},update_track_bounds:function(){var b=this.get_tracks_bounds();a.each(this.circular_views,function(a,c){a.update_radius_bounds(b[c])}),a.each(this.chords_views,function(a){a.update_radius_bounds(b[0])})}}),i=Backbone.View.extend({tagName:"g",initialize:function(a){this.bg_stroke="#ddd",this.loading_bg_fill="#ffc",this.bg_fill="#ddd",this.total_gap=a.total_gap,this.track=a.track,this.radius_bounds=a.radius_bounds,this.genome=a.genome,this.chroms_layout=this._chroms_layout(),this.data_bounds=[],this.scale=1,this.parent_elt=b.select(this.$el[0])},get_fill_color:function(){var a=this.track.get("config").get_value("block_color");return a||(a=this.track.get("config").get_value("color")),a},render:function(){var a=this.parent_elt,c=this.chroms_layout,d=b.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]),e=a.selectAll("g").data(c).enter().append("svg:g"),f=e.append("path").attr("d",d).attr("class","chrom-background").style("stroke",this.bg_stroke).style("fill",this.loading_bg_fill);f.append("title").text(function(a){return a.data.chrom});var g=this,h=g.track.get("data_manager"),i=h?h.data_is_ready():!0;$.when(i).then(function(){$.when(g._render_data(a)).then(function(){f.style("fill",g.bg_fill),g.render_labels()})})},render_labels:function(){},update_radius_bounds:function(a){this.radius_bounds=a;var c=b.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]);this.parent_elt.selectAll("g>path.chrom-background").transition().duration(1e3).attr("d",c),this._transition_chrom_data(),this._transition_labels()},update_scale:function(c){var d=this.scale;if(this.scale=c,!(d>=c)){var f=this,g=new e;return this.parent_elt.selectAll("path.chrom-data").filter(function(){return g.is_visible(this)}).each(function(){var d,e=b.select(this),g=e.attr("chrom"),h=f.genome.get_chrom_region(g),i=f.track.get("data_manager");i.can_get_more_detailed_data(h)&&(d=f.track.get("data_manager").get_more_detailed_data(h,"Coverage",0,c),$.when(d).then(function(b){e.remove(),f._update_data_bounds();var c=a.find(f.chroms_layout,function(a){return a.data.chrom===g}),d=f.get_fill_color();f._render_chrom_data(f.parent_elt,c,b).style("stroke",d).style("fill",d)}))}),f}},_transition_chrom_data:function(){var c=this.track,d=this.chroms_layout,e=this.parent_elt.selectAll("g>path.chrom-data"),f=e[0].length;if(f>0){var g=this;$.when(c.get("data_manager").get_genome_wide_data(this.genome)).then(function(f){var h=a.reject(a.map(f,function(a,b){var c=null,e=g._get_path_function(d[b],a);return e&&(c=e(a.data)),c}),function(a){return null===a}),i=c.get("config").get_value("color");e.each(function(a,c){b.select(this).transition().duration(1e3).style("stroke",i).style("fill",i).attr("d",h[c])})})}},_transition_labels:function(){},_update_data_bounds:function(a){this.data_bounds;this.data_bounds=a||this.get_data_bounds(this.track.get("data_manager").get_genome_wide_data(this.genome)),this._transition_chrom_data()},_render_data:function(b){var c=this,d=this.chroms_layout,e=this.track,f=$.Deferred();return $.when(e.get("data_manager").get_genome_wide_data(this.genome)).then(function(g){c.data_bounds=c.get_data_bounds(g),e.get("config").set_value("min_value",c.data_bounds[0],{silent:!0}),e.get("config").set_value("max_value",c.data_bounds[1],{silent:!0}),layout_and_data=a.zip(d,g),chroms_data_layout=a.map(layout_and_data,function(a){var d=a[0],e=a[1];return c._render_chrom_data(b,d,e)});var h=c.get_fill_color();c.parent_elt.selectAll("path.chrom-data").style("stroke",h).style("fill",h),f.resolve(b)}),f},_render_chrom_data:function(){},_get_path_function:function(){},_chroms_layout:function(){var c=this.genome.get_chroms_info(),d=b.layout.pie().value(function(a){return a.len}).sort(null),e=d(c),f=2*Math.PI*this.total_gap/c.length,g=a.map(e,function(a){var b=a.endAngle-f;return a.endAngle=b>a.startAngle?b:a.startAngle,a});return g}}),j=i.extend({initialize:function(a){i.prototype.initialize.call(this,a),this.innerRadius=this.radius_bounds[0],this.radius_bounds[0]=this.radius_bounds[1],this.bg_stroke="#fff",this.bg_fill="#fff",this.min_arc_len=.05},_render_data:function(c){var d=this,e=c.selectAll("g");e.selectAll("path").attr("id",function(a){return"label-"+a.data.chrom}),e.append("svg:text").filter(function(a){return a.endAngle-a.startAngle>d.min_arc_len}).attr("text-anchor","middle").append("svg:textPath").attr("class","chrom-label").attr("xlink:href",function(a){return"#label-"+a.data.chrom}).attr("startOffset","25%").text(function(a){return a.data.chrom});var f=function(a){var c=(a.endAngle-a.startAngle)/a.value,e=b.range(0,a.value,25e6).map(function(b,e){return{radius:d.innerRadius,angle:b*c+a.startAngle,label:0===e?0:e%3?null:d.formatNum(b)}});return e.length<4&&(e[e.length-1].label=d.formatNum(Math.round((e[e.length-1].angle-a.startAngle)/c))),e},g=function(a){return a.angle>Math.PI?"rotate(180)translate(-16)":null},h=a.filter(this.chroms_layout,function(a){return a.endAngle-a.startAngle>d.min_arc_len});this.drawTicks(this.parent_elt,h,f,g)}});a.extend(j.prototype,f);var k=i.extend({initialize:function(a){i.prototype.initialize.call(this,a);var b=this.track.get("config");b.get("min_value").on("change:value",this._update_min_max,this),b.get("max_value").on("change:value",this._update_min_max,this),b.get("color").on("change:value",this._transition_chrom_data,this)},_update_min_max:function(){var a=this.track.get("config"),b=[a.get_value("min_value"),a.get_value("max_value")];this._update_data_bounds(b),this.parent_elt.selectAll(".min_max").text(function(a,c){return b[c]})},_quantile:function(a,c){return a.sort(b.ascending),b.quantile(a,c)},_render_chrom_data:function(a,b,c){var d=this._get_path_function(b,c);if(!d)return null;var e=a.datum(c.data),f=e.append("path").attr("class","chrom-data").attr("chrom",b.data.chrom).attr("d",d);return f},_get_path_function:function(a,c){if("string"==typeof c||!c.data||0===c.data.length)return null;var d=b.scale.linear().domain(this.data_bounds).range(this.radius_bounds).clamp(!0),e=b.scale.linear().domain([0,c.data.length]).range([a.startAngle,a.endAngle]),f=b.svg.line.radial().interpolate("linear").radius(function(a){return d(a[1])}).angle(function(a,b){return e(b)});return b.svg.area.radial().interpolate(f.interpolate()).innerRadius(d(0)).outerRadius(f.radius()).angle(f.angle())},render_labels:function(){var b=this,c=function(){return"rotate(90)"},e=this.drawTicks(this.parent_elt,[this.chroms_layout[0]],this._data_bounds_ticks_fn(),c,!0).classed("min_max",!0);a.each(e,function(a){$(a).click(function(){var a=new d.ConfigSettingCollectionView({collection:b.track.get("config")});a.render_in_modal("Configure Track")})})},_transition_labels:function(){if(0!==this.data_bounds.length){var b=this,c=a.filter(this.chroms_layout,function(a){return a.endAngle-a.startAngle>.08}),d=a.filter(c,function(a,b){return b%3===0}),e=a.flatten(a.map(d,function(a){return b._data_bounds_ticks_fn()(a)}));this.parent_elt.selectAll("g.tick").data(e).transition().attr("transform",function(a){return"rotate("+(180*a.angle/Math.PI-90)+")translate("+a.radius+",0)"})}},_data_bounds_ticks_fn:function(){var a=this;return visibleChroms=0,function(b){return[{radius:a.radius_bounds[0],angle:b.startAngle,label:a.formatNum(a.data_bounds[0])},{radius:a.radius_bounds[1],angle:b.startAngle,label:a.formatNum(a.data_bounds[1])}]}},get_data_bounds:function(){}});a.extend(k.prototype,f);var l=k.extend({get_data_bounds:function(b){var c=a.flatten(a.map(b,function(b){return b?a.map(b.data,function(a){return parseInt(a[1],10)||0}):0}));return[a.min(c),this._quantile(c,.98)||a.max(c)]}}),m=i.extend({render:function(){var c=this;$.when(c.track.get("data_manager").data_is_ready()).then(function(){$.when(c.track.get("data_manager").get_genome_wide_data(c.genome)).then(function(d){var e=[],f=c.genome.get_chroms_info();a.each(d,function(b,d){var g=f[d].chrom,h=a.map(b.data,function(a){var b=c._get_region_angle(g,a[1]),d=c._get_region_angle(a[3],a[4]);return{source:{startAngle:b,endAngle:b+.01},target:{startAngle:d,endAngle:d+.01}}});e=e.concat(h)}),c.parent_elt.append("g").attr("class","chord").selectAll("path").data(e).enter().append("path").style("fill",c.get_fill_color()).attr("d",b.svg.chord().radius(c.radius_bounds[0])).style("opacity",1)})})},update_radius_bounds:function(a){this.radius_bounds=a,this.parent_elt.selectAll("path").transition().attr("d",b.svg.chord().radius(this.radius_bounds[0]))},_get_region_angle:function(b,c){var d=a.find(this.chroms_layout,function(a){return a.data.chrom===b});return d.endAngle-(d.endAngle-d.startAngle)*(d.data.len-c)/d.data.len}}),n=Backbone.View.extend({initialize:function(){var a=new c.Genome(galaxy_config.app.genome),b=new c.GenomeVisualization(galaxy_config.app.viz_config);b.get("config").add([{key:"arc_dataset_height",label:"Arc Dataset Height",type:"int",value:25,view:"circster"},{key:"track_gap",label:"Gap Between Tracks",type:"int",value:5,view:"circster"},{key:"total_gap",label:"Gap [0-1]",type:"float",value:.4,view:"circster",hidden:!0}]);var e=new h({el:$("#center .unified-panel-body"),genome:a,model:b});e.render(),$("#center .unified-panel-header-inner").append(galaxy_config.app.viz_config.title+" "+galaxy_config.app.viz_config.dbkey);var f=mod_icon_btn.create_icon_buttons_menu([{icon_class:"plus-button",title:"Add tracks",on_click:function(){c.select_datasets(galaxy_config.root+"visualization/list_current_history_datasets",galaxy_config.root+"api/datasets",b.get("dbkey"),function(a){b.add_tracks(a)})}},{icon_class:"gear",title:"Settings",on_click:function(){var a=new d.ConfigSettingCollectionView({collection:b.get("config")});a.render_in_modal("Configure Visualization")}},{icon_class:"disk--arrow",title:"Save",on_click:function(){Galaxy.modal.show({title:"Saving...",body:"progress"}),$.ajax({url:galaxy_config.root+"visualization/save",type:"POST",dataType:"json",data:{id:b.get("vis_id"),title:b.get("title"),dbkey:b.get("dbkey"),type:"trackster",vis_json:JSON.stringify(b)}}).success(function(a){Galaxy.modal.hide(),b.set("vis_id",a.vis_id)}).error(function(){Galaxy.modal.show({title:"Could Not Save",body:"Could not save visualization. Please try again later.",buttons:{Cancel:function(){Galaxy.modal.hide()}}})})}},{icon_class:"cross-circle",title:"Close",on_click:function(){window.location=galaxy_config.root+"visualization/list"}}],{tooltip_config:{placement:"bottom"}});f.$el.attr("style","float: right"),$("#center .unified-panel-header-inner").append(f.$el),$(".menu-button").tooltip({placement:"bottom"})}});return{GalaxyApp:n}});
+require(["utils/utils"],function(a){a.cssLoadFile("static/style/circster.css")}),define(["libs/underscore","libs/d3","viz/visualization","utils/config","mvc/ui/icon-button","libs/farbtastic"],function(a,b,c,d,e){var f=Backbone.Model.extend({is_visible:function(a){var b=a.getBoundingClientRect(),c=$("svg")[0].getBoundingClientRect();return b.right<0||b.left>c.right||b.bottom<0||b.top>c.bottom?!1:!0}}),g={drawTicks:function(a,b,c,d,e){var f=a.append("g").selectAll("g").data(b).enter().append("g").selectAll("g").data(c).enter().append("g").attr("class","tick").attr("transform",function(a){return"rotate("+(180*a.angle/Math.PI-90)+")translate("+a.radius+",0)"}),g=[],h=[],i=function(a){return a.angle>Math.PI?"end":null};return e?(g=[0,0,0,-4],h=[4,0,"",".35em"],i=null):(g=[1,0,4,0],h=[0,4,".35em",""]),f.append("line").attr("x1",g[0]).attr("y1",g[1]).attr("x2",g[2]).attr("y1",g[3]).style("stroke","#000"),f.append("text").attr("x",h[0]).attr("y",h[1]).attr("dx",h[2]).attr("dy",h[3]).attr("text-anchor",i).attr("transform",d).text(function(a){return a.label})},formatNum:function(a,b){if(void 0===b&&(b=2),null===a)return null;var c=null;if(Math.abs(a)<1)c=a.toPrecision(b);else{var d=Math.round(a.toPrecision(b));a=Math.abs(a),1e3>a?c=d:1e6>a?c=Math.round((d/1e3).toPrecision(3)).toFixed(0)+"K":1e9>a&&(c=Math.round((d/1e6).toPrecision(3)).toFixed(0)+"M")}return c}},h=Backbone.Model.extend({}),i=Backbone.View.extend({className:"circster",initialize:function(a){this.genome=a.genome,this.label_arc_height=50,this.scale=1,this.circular_views=null,this.chords_views=null,this.model.get("drawables").on("add",this.add_track,this),this.model.get("drawables").on("remove",this.remove_track,this);var b=this.model.get("config");b.get("arc_dataset_height").on("change:value",this.update_track_bounds,this),b.get("track_gap").on("change:value",this.update_track_bounds,this)},get_circular_tracks:function(){return this.model.get("drawables").filter(function(a){return"DiagonalHeatmapTrack"!==a.get("track_type")})},get_chord_tracks:function(){return this.model.get("drawables").filter(function(a){return"DiagonalHeatmapTrack"===a.get("track_type")})},get_tracks_bounds:function(){var c=this.get_circular_tracks(),d=this.model.get("config").get_value("arc_dataset_height"),e=this.model.get("config").get_value("track_gap"),f=Math.min(this.$el.width(),this.$el.height())-20,g=f/2-c.length*(d+e)+e-this.label_arc_height,h=b.range(g,f/2,d+e);return a.map(h,function(a){return[a,a+d]})},render:function(){var a=this,c=a.$el.width(),d=a.$el.height(),e=this.get_circular_tracks(),f=this.get_chord_tracks(),g=a.model.get("config").get_value("total_gap"),i=this.get_tracks_bounds(),j=b.select(a.$el[0]).append("svg").attr("width",c).attr("height",d).attr("pointer-events","all").append("svg:g").call(b.behavior.zoom().on("zoom",function(){var c=b.event.scale;j.attr("transform","translate("+b.event.translate+") scale("+c+")"),a.scale!==c&&(a.zoom_drag_timeout&&clearTimeout(a.zoom_drag_timeout),a.zoom_drag_timeout=setTimeout(function(){},400))})).attr("transform","translate("+c/2+","+d/2+")").append("svg:g").attr("class","tracks");this.circular_views=e.map(function(b,c){var d=new m({el:j.append("g")[0],track:b,radius_bounds:i[c],genome:a.genome,total_gap:g});return d.render(),d}),this.chords_views=f.map(function(b){var c=new n({el:j.append("g")[0],track:b,radius_bounds:i[0],genome:a.genome,total_gap:g});return c.render(),c});var l=this.circular_views[this.circular_views.length-1].radius_bounds[1],o=[l,l+this.label_arc_height];this.label_track_view=new k({el:j.append("g")[0],track:new h,radius_bounds:o,genome:a.genome,total_gap:g}),this.label_track_view.render()},add_track:function(c){var d=this.model.get("config").get_value("total_gap");if("DiagonalHeatmapTrack"===c.get("track_type")){var e=this.circular_views[0].radius_bounds,f=new n({el:b.select("g.tracks").append("g")[0],track:c,radius_bounds:e,genome:this.genome,total_gap:d});f.render(),this.chords_views.push(f)}else{var g=this.get_tracks_bounds();a.each(this.circular_views,function(a,b){a.update_radius_bounds(g[b])}),a.each(this.chords_views,function(a){a.update_radius_bounds(g[0])});var h=this.circular_views.length,i=new m({el:b.select("g.tracks").append("g")[0],track:c,radius_bounds:g[h],genome:this.genome,total_gap:d});i.render(),this.circular_views.push(i)}},remove_track:function(b,c,d){var e=this.circular_views[d.index];this.circular_views.splice(d.index,1),e.$el.remove();var f=this.get_tracks_bounds();a.each(this.circular_views,function(a,b){a.update_radius_bounds(f[b])})},update_track_bounds:function(){var b=this.get_tracks_bounds();a.each(this.circular_views,function(a,c){a.update_radius_bounds(b[c])}),a.each(this.chords_views,function(a){a.update_radius_bounds(b[0])})}}),j=Backbone.View.extend({tagName:"g",initialize:function(a){this.bg_stroke="#ddd",this.loading_bg_fill="#ffc",this.bg_fill="#ddd",this.total_gap=a.total_gap,this.track=a.track,this.radius_bounds=a.radius_bounds,this.genome=a.genome,this.chroms_layout=this._chroms_layout(),this.data_bounds=[],this.scale=1,this.parent_elt=b.select(this.$el[0])},get_fill_color:function(){var a=this.track.get("config").get_value("block_color");return a||(a=this.track.get("config").get_value("color")),a},render:function(){var a=this.parent_elt,c=this.chroms_layout,d=b.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]),e=a.selectAll("g").data(c).enter().append("svg:g"),f=e.append("path").attr("d",d).attr("class","chrom-background").style("stroke",this.bg_stroke).style("fill",this.loading_bg_fill);f.append("title").text(function(a){return a.data.chrom});var g=this,h=g.track.get("data_manager"),i=h?h.data_is_ready():!0;$.when(i).then(function(){$.when(g._render_data(a)).then(function(){f.style("fill",g.bg_fill),g.render_labels()})})},render_labels:function(){},update_radius_bounds:function(a){this.radius_bounds=a;var c=b.svg.arc().innerRadius(this.radius_bounds[0]).outerRadius(this.radius_bounds[1]);this.parent_elt.selectAll("g>path.chrom-background").transition().duration(1e3).attr("d",c),this._transition_chrom_data(),this._transition_labels()},update_scale:function(c){var d=this.scale;if(this.scale=c,!(d>=c)){var e=this,g=new f;return this.parent_elt.selectAll("path.chrom-data").filter(function(){return g.is_visible(this)}).each(function(){var d,f=b.select(this),g=f.attr("chrom"),h=e.genome.get_chrom_region(g),i=e.track.get("data_manager");i.can_get_more_detailed_data(h)&&(d=e.track.get("data_manager").get_more_detailed_data(h,"Coverage",0,c),$.when(d).then(function(b){f.remove(),e._update_data_bounds();var c=a.find(e.chroms_layout,function(a){return a.data.chrom===g}),d=e.get_fill_color();e._render_chrom_data(e.parent_elt,c,b).style("stroke",d).style("fill",d)}))}),e}},_transition_chrom_data:function(){var c=this.track,d=this.chroms_layout,e=this.parent_elt.selectAll("g>path.chrom-data"),f=e[0].length;if(f>0){var g=this;$.when(c.get("data_manager").get_genome_wide_data(this.genome)).then(function(f){var h=a.reject(a.map(f,function(a,b){var c=null,e=g._get_path_function(d[b],a);return e&&(c=e(a.data)),c}),function(a){return null===a}),i=c.get("config").get_value("color");e.each(function(a,c){b.select(this).transition().duration(1e3).style("stroke",i).style("fill",i).attr("d",h[c])})})}},_transition_labels:function(){},_update_data_bounds:function(a){this.data_bounds;this.data_bounds=a||this.get_data_bounds(this.track.get("data_manager").get_genome_wide_data(this.genome)),this._transition_chrom_data()},_render_data:function(b){var c=this,d=this.chroms_layout,e=this.track,f=$.Deferred();return $.when(e.get("data_manager").get_genome_wide_data(this.genome)).then(function(g){c.data_bounds=c.get_data_bounds(g),e.get("config").set_value("min_value",c.data_bounds[0],{silent:!0}),e.get("config").set_value("max_value",c.data_bounds[1],{silent:!0}),layout_and_data=a.zip(d,g),chroms_data_layout=a.map(layout_and_data,function(a){var d=a[0],e=a[1];return c._render_chrom_data(b,d,e)});var h=c.get_fill_color();c.parent_elt.selectAll("path.chrom-data").style("stroke",h).style("fill",h),f.resolve(b)}),f},_render_chrom_data:function(){},_get_path_function:function(){},_chroms_layout:function(){var c=this.genome.get_chroms_info(),d=b.layout.pie().value(function(a){return a.len}).sort(null),e=d(c),f=2*Math.PI*this.total_gap/c.length,g=a.map(e,function(a){var b=a.endAngle-f;return a.endAngle=b>a.startAngle?b:a.startAngle,a});return g}}),k=j.extend({initialize:function(a){j.prototype.initialize.call(this,a),this.innerRadius=this.radius_bounds[0],this.radius_bounds[0]=this.radius_bounds[1],this.bg_stroke="#fff",this.bg_fill="#fff",this.min_arc_len=.05},_render_data:function(c){var d=this,e=c.selectAll("g");e.selectAll("path").attr("id",function(a){return"label-"+a.data.chrom}),e.append("svg:text").filter(function(a){return a.endAngle-a.startAngle>d.min_arc_len}).attr("text-anchor","middle").append("svg:textPath").attr("class","chrom-label").attr("xlink:href",function(a){return"#label-"+a.data.chrom}).attr("startOffset","25%").text(function(a){return a.data.chrom});var f=function(a){var c=(a.endAngle-a.startAngle)/a.value,e=b.range(0,a.value,25e6).map(function(b,e){return{radius:d.innerRadius,angle:b*c+a.startAngle,label:0===e?0:e%3?null:d.formatNum(b)}});return e.length<4&&(e[e.length-1].label=d.formatNum(Math.round((e[e.length-1].angle-a.startAngle)/c))),e},g=function(a){return a.angle>Math.PI?"rotate(180)translate(-16)":null},h=a.filter(this.chroms_layout,function(a){return a.endAngle-a.startAngle>d.min_arc_len});this.drawTicks(this.parent_elt,h,f,g)}});a.extend(k.prototype,g);var l=j.extend({initialize:function(a){j.prototype.initialize.call(this,a);var b=this.track.get("config");b.get("min_value").on("change:value",this._update_min_max,this),b.get("max_value").on("change:value",this._update_min_max,this),b.get("color").on("change:value",this._transition_chrom_data,this)},_update_min_max:function(){var a=this.track.get("config"),b=[a.get_value("min_value"),a.get_value("max_value")];this._update_data_bounds(b),this.parent_elt.selectAll(".min_max").text(function(a,c){return b[c]})},_quantile:function(a,c){return a.sort(b.ascending),b.quantile(a,c)},_render_chrom_data:function(a,b,c){var d=this._get_path_function(b,c);if(!d)return null;var e=a.datum(c.data),f=e.append("path").attr("class","chrom-data").attr("chrom",b.data.chrom).attr("d",d);return f},_get_path_function:function(a,c){if("string"==typeof c||!c.data||0===c.data.length)return null;var d=b.scale.linear().domain(this.data_bounds).range(this.radius_bounds).clamp(!0),e=b.scale.linear().domain([0,c.data.length]).range([a.startAngle,a.endAngle]),f=b.svg.line.radial().interpolate("linear").radius(function(a){return d(a[1])}).angle(function(a,b){return e(b)});return b.svg.area.radial().interpolate(f.interpolate()).innerRadius(d(0)).outerRadius(f.radius()).angle(f.angle())},render_labels:function(){var b=this,c=function(){return"rotate(90)"},e=this.drawTicks(this.parent_elt,[this.chroms_layout[0]],this._data_bounds_ticks_fn(),c,!0).classed("min_max",!0);a.each(e,function(a){$(a).click(function(){var a=new d.ConfigSettingCollectionView({collection:b.track.get("config")});a.render_in_modal("Configure Track")})})},_transition_labels:function(){if(0!==this.data_bounds.length){var b=this,c=a.filter(this.chroms_layout,function(a){return a.endAngle-a.startAngle>.08}),d=a.filter(c,function(a,b){return b%3===0}),e=a.flatten(a.map(d,function(a){return b._data_bounds_ticks_fn()(a)}));this.parent_elt.selectAll("g.tick").data(e).transition().attr("transform",function(a){return"rotate("+(180*a.angle/Math.PI-90)+")translate("+a.radius+",0)"})}},_data_bounds_ticks_fn:function(){var a=this;return visibleChroms=0,function(b){return[{radius:a.radius_bounds[0],angle:b.startAngle,label:a.formatNum(a.data_bounds[0])},{radius:a.radius_bounds[1],angle:b.startAngle,label:a.formatNum(a.data_bounds[1])}]}},get_data_bounds:function(){}});a.extend(l.prototype,g);var m=l.extend({get_data_bounds:function(b){var c=a.flatten(a.map(b,function(b){return b?a.map(b.data,function(a){return parseInt(a[1],10)||0}):0}));return[a.min(c),this._quantile(c,.98)||a.max(c)]}}),n=j.extend({render:function(){var c=this;$.when(c.track.get("data_manager").data_is_ready()).then(function(){$.when(c.track.get("data_manager").get_genome_wide_data(c.genome)).then(function(d){var e=[],f=c.genome.get_chroms_info();a.each(d,function(b,d){var g=f[d].chrom,h=a.map(b.data,function(a){var b=c._get_region_angle(g,a[1]),d=c._get_region_angle(a[3],a[4]);return{source:{startAngle:b,endAngle:b+.01},target:{startAngle:d,endAngle:d+.01}}});e=e.concat(h)}),c.parent_elt.append("g").attr("class","chord").selectAll("path").data(e).enter().append("path").style("fill",c.get_fill_color()).attr("d",b.svg.chord().radius(c.radius_bounds[0])).style("opacity",1)})})},update_radius_bounds:function(a){this.radius_bounds=a,this.parent_elt.selectAll("path").transition().attr("d",b.svg.chord().radius(this.radius_bounds[0]))},_get_region_angle:function(b,c){var d=a.find(this.chroms_layout,function(a){return a.data.chrom===b});return d.endAngle-(d.endAngle-d.startAngle)*(d.data.len-c)/d.data.len}}),o=Backbone.View.extend({initialize:function(){var a=new c.Genome(galaxy_config.app.genome),b=new c.GenomeVisualization(galaxy_config.app.viz_config);b.get("config").add([{key:"arc_dataset_height",label:"Arc Dataset Height",type:"int",value:25,view:"circster"},{key:"track_gap",label:"Gap Between Tracks",type:"int",value:5,view:"circster"},{key:"total_gap",label:"Gap [0-1]",type:"float",value:.4,view:"circster",hidden:!0}]);var f=new i({el:$("#center .unified-panel-body"),genome:a,model:b});f.render(),$("#center .unified-panel-header-inner").append(galaxy_config.app.viz_config.title+" "+galaxy_config.app.viz_config.dbkey);var g=e.create_icon_buttons_menu([{icon_class:"plus-button",title:"Add tracks",on_click:function(){c.select_datasets(galaxy_config.root+"visualization/list_current_history_datasets",galaxy_config.root+"api/datasets",b.get("dbkey"),function(a){b.add_tracks(a)})}},{icon_class:"gear",title:"Settings",on_click:function(){var a=new d.ConfigSettingCollectionView({collection:b.get("config")});a.render_in_modal("Configure Visualization")}},{icon_class:"disk--arrow",title:"Save",on_click:function(){Galaxy.modal.show({title:"Saving...",body:"progress"}),$.ajax({url:galaxy_config.root+"visualization/save",type:"POST",dataType:"json",data:{id:b.get("vis_id"),title:b.get("title"),dbkey:b.get("dbkey"),type:"trackster",vis_json:JSON.stringify(b)}}).success(function(a){Galaxy.modal.hide(),b.set("vis_id",a.vis_id)}).error(function(){Galaxy.modal.show({title:"Could Not Save",body:"Could not save visualization. Please try again later.",buttons:{Cancel:function(){Galaxy.modal.hide()}}})})}},{icon_class:"cross-circle",title:"Close",on_click:function(){window.location=galaxy_config.root+"visualization/list"}}],{tooltip_config:{placement:"bottom"}});g.$el.attr("style","float: right"),$("#center .unified-panel-header-inner").append(g.$el),$(".menu-button").tooltip({placement:"bottom"})}});return{GalaxyApp:o}});
//# sourceMappingURL=../../maps/viz/circster.js.map
\ No newline at end of file
diff --git a/test/api/test_tools.py b/test/api/test_tools.py
index e1b5485ce5b..a0510b751fe 100644
--- a/test/api/test_tools.py
+++ b/test/api/test_tools.py
@@ -539,6 +539,59 @@ class ToolsTestCase( api.ApiTestCase ):
}
self._run_and_check_simple_collection_mapping( history_id, inputs )
+ @skip_without_tool( "output_action_change_format" )
+ def test_map_over_with_output_format_actions( self ):
+ for use_action in ["do", "dont"]:
+ history_id = self.dataset_populator.new_history()
+ hdca_id = self.__build_pair( history_id, [ "123", "456" ] )
+ inputs = {
+ "input_cond|dispatch": use_action,
+ "input_cond|input": { 'batch': True, 'values': [ { 'src': 'hdca', 'id': hdca_id } ] },
+ }
+ create = self._run( 'output_action_change_format', history_id, inputs ).json()
+ outputs = create[ 'outputs' ]
+ jobs = create[ 'jobs' ]
+ implicit_collections = create[ 'implicit_collections' ]
+ self.assertEquals( len( jobs ), 2 )
+ self.assertEquals( len( outputs ), 2 )
+ self.assertEquals( len( implicit_collections ), 1 )
+ output1 = outputs[ 0 ]
+ output2 = outputs[ 1 ]
+ output1_details = self.dataset_populator.get_history_dataset_details( history_id, dataset=output1 )
+ output2_details = self.dataset_populator.get_history_dataset_details( history_id, dataset=output2 )
+ assert output1_details[ "file_ext" ] == "txt" if (use_action == "do") else "data"
+ assert output2_details[ "file_ext" ] == "txt" if (use_action == "do") else "data"
+
+ @skip_without_tool( "Cut1" )
+ def test_map_over_with_complex_output_actions( self ):
+ history_id = self.dataset_populator.new_history()
+ hdca_id = self._bed_list(history_id)
+ inputs = {
+ "columnList": "c1,c2,c3,c4,c5",
+ "delimiter": "T",
+ "input": { 'batch': True, 'values': [ { 'src': 'hdca', 'id': hdca_id } ] },
+ }
+ create = self._run( 'Cut1', history_id, inputs ).json()
+ outputs = create[ 'outputs' ]
+ jobs = create[ 'jobs' ]
+ implicit_collections = create[ 'implicit_collections' ]
+ self.assertEquals( len( jobs ), 2 )
+ self.assertEquals( len( outputs ), 2 )
+ self.assertEquals( len( implicit_collections ), 1 )
+ output1 = outputs[ 0 ]
+ output2 = outputs[ 1 ]
+ output1_content = self.dataset_populator.get_history_dataset_content( history_id, dataset=output1 )
+ output2_content = self.dataset_populator.get_history_dataset_content( history_id, dataset=output2 )
+ assert output1_content.startswith("chr1")
+ assert output2_content.startswith("chr1")
+
+ def _bed_list(self, history_id):
+ bed1_contents = open(self.get_filename("1.bed"), "r").read()
+ bed2_contents = open(self.get_filename("2.bed"), "r").read()
+ contents = [bed1_contents, bed2_contents]
+ hdca = self.dataset_collection_populator.create_list_in_history( history_id, contents=contents ).json()
+ return hdca["id"]
+
def _run_and_check_simple_collection_mapping( self, history_id, inputs ):
create = self._run_cat1( history_id, inputs=inputs, assert_ok=True )
outputs = create[ 'outputs' ]
diff --git a/test/functional/tools/output_action_change_format.xml b/test/functional/tools/output_action_change_format.xml
new file mode 100644
index 00000000000..c9a59cc70e8
--- /dev/null
+++ b/test/functional/tools/output_action_change_format.xml
@@ -0,0 +1,52 @@
+
+
+ echo "1\t2" > out1;
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/functional/tools/samples_tool_conf.xml b/test/functional/tools/samples_tool_conf.xml
index 52d9d75ccbe..801c2d371b3 100644
--- a/test/functional/tools/samples_tool_conf.xml
+++ b/test/functional/tools/samples_tool_conf.xml
@@ -36,6 +36,7 @@
+
diff --git a/tools/genomespace/genomespace_exporter.py b/tools/genomespace/genomespace_exporter.py
index a5bd30dfa09..ec88fa26af6 100644
--- a/tools/genomespace/genomespace_exporter.py
+++ b/tools/genomespace/genomespace_exporter.py
@@ -1,3 +1,4 @@
+#!/usr/bin/env python
#Dan Blankenberg
import base64
@@ -10,17 +11,37 @@ import json
import logging
import optparse
import os
+import tempfile
import urllib
import urllib2
from urlparse import urljoin
log = logging.getLogger( "tools.genomespace.genomespace_exporter" )#( __name__ )
+try:
+ from galaxy import eggs
+ eggs.require('boto')
+except ImportError:
+ pass
+
+try:
+ import boto
+ from boto.s3.connection import S3Connection
+except ImportError:
+ boto = None
+
GENOMESPACE_API_VERSION_STRING = "v1.0"
GENOMESPACE_SERVER_URL_PROPERTIES = "https://dm.genomespace.org/config/%s/serverurl.properties" % ( GENOMESPACE_API_VERSION_STRING )
CHUNK_SIZE = 2**20 #1mb
+# TODO: TARGET_SPLIT_SIZE and TARGET_SIMPLE_PUT_UPLOAD_SIZE are arbitrarily defined
+# we should programmatically determine these, based upon the current environment
+TARGET_SPLIT_SIZE = 250 * 1024 * 1024 # 250 mb
+MIN_MULTIPART_UPLOAD_SIZE = 5 * 1024 * 1024 # 5mb
+MAX_SIMPLE_PUT_UPLOAD_SIZE = 5 * 1024 * 1024 * 1024 # 5gb
+TARGET_SIMPLE_PUT_UPLOAD_SIZE = MAX_SIMPLE_PUT_UPLOAD_SIZE / 2
+
# Some basic Caching, so we don't have to reload and download everything every time,
# especially now that we are calling the parameter's get options method 5 times
# (6 on reload) when a user loads the tool interface
@@ -203,28 +224,69 @@ def send_file_to_genomespace( genomespace_site, username, token, source_filename
directory_dict = get_personal_directory( url_opener, dm_url )['directory'] #this is the base for the auto-generated galaxy export directories
#what directory to stuff this in
target_directory_dict = create_directory( url_opener, directory_dict, target_directory, dm_url )
- #get upload url
- upload_url = "uploadurl"
content_length = os.path.getsize( source_filename )
input_file = open( source_filename, 'rb' )
- content_md5 = hashlib.md5()
- chunk_write( input_file, content_md5, target_method="update" )
- input_file.seek( 0 ) #back to start, for uploading
-
- upload_params = { 'Content-Length': content_length, 'Content-MD5': base64.standard_b64encode( content_md5.digest() ), 'Content-Type': content_type }
- upload_url = "%s/%s/%s%s/%s?%s" % ( dm_url, GENOMESPACE_API_VERSION_STRING, upload_url, target_directory_dict['path'], urllib.quote( target_filename, safe='' ), urllib.urlencode( upload_params ) )
- new_file_request = urllib2.Request( upload_url )#, headers = { 'Content-Type': 'application/json', 'Accept': 'application/text' } ) #apparently http://www.genomespace.org/team/specs/updated-dm-rest-api:"Every HTTP request to the Data Manager should include the Accept header with a preference for the media types application/json and application/text." is not correct
- new_file_request.get_method = lambda: 'GET'
- #get url to upload to
- target_upload_url = url_opener.open( new_file_request ).read()
- #upload file to determined url
- upload_headers = dict( upload_params )
- #upload_headers[ 'x-amz-meta-md5-hash' ] = content_md5.hexdigest()
- upload_headers[ 'Accept' ] = 'application/json'
- upload_file_request = urllib2.Request( target_upload_url, headers = upload_headers, data = input_file )
- upload_file_request.get_method = lambda: 'PUT'
- upload_result = urllib2.urlopen( upload_file_request ).read()
+ if content_length > TARGET_SIMPLE_PUT_UPLOAD_SIZE:
+ # Determine sizes of each part.
+ split_count = content_length / TARGET_SPLIT_SIZE
+ last_size = content_length - ( split_count * TARGET_SPLIT_SIZE )
+ sizes = [ TARGET_SPLIT_SIZE ] * split_count
+ if last_size:
+ if last_size < MIN_MULTIPART_UPLOAD_SIZE:
+ if sizes:
+ sizes[-1] = sizes[-1] + last_size
+ else:
+ sizes = [ last_size ]
+ else:
+ sizes.append( last_size )
+ print "Performing multi-part upload in %i parts." % ( len( sizes ) )
+ #get upload url
+ upload_url = "uploadinfo"
+ upload_url = "%s/%s/%s%s/%s" % ( dm_url, GENOMESPACE_API_VERSION_STRING, upload_url, target_directory_dict['path'], urllib.quote( target_filename, safe='' ) )
+ upload_request = urllib2.Request( upload_url, headers = { 'Content-Type': 'application/json', 'Accept': 'application/json' } )
+ upload_request.get_method = lambda: 'GET'
+ upload_info = json.loads( url_opener.open( upload_request ).read() )
+ conn = S3Connection( aws_access_key_id=upload_info['amazonCredentials']['accessKey'],
+ aws_secret_access_key=upload_info['amazonCredentials']['secretKey'],
+ security_token=upload_info['amazonCredentials']['sessionToken'] )
+ # Cannot use conn.get_bucket due to permissions, manually create bucket object
+ bucket = boto.s3.bucket.Bucket( connection=conn, name=upload_info['s3BucketName'] )
+ mp = bucket.initiate_multipart_upload( upload_info['s3ObjectKey'] )
+ for i,part_size in enumerate( sizes, start=1 ):
+ fh = tempfile.TemporaryFile( 'wb+' )
+ while part_size:
+ if CHUNK_SIZE > part_size:
+ read_size = part_size
+ else:
+ read_size = CHUNK_SIZE
+ chunk = input_file.read( read_size )
+ fh.write( chunk )
+ part_size = part_size - read_size
+ fh.flush()
+ fh.seek(0)
+ mp.upload_part_from_file( fh, i )
+ fh.close()
+ upload_result = mp.complete_upload()
+ else:
+ print 'Performing simple put upload.'
+ upload_url = "uploadurl"
+ content_md5 = hashlib.md5()
+ chunk_write( input_file, content_md5, target_method="update" )
+ input_file.seek( 0 ) #back to start, for uploading
+ upload_params = { 'Content-Length': content_length, 'Content-MD5': base64.standard_b64encode( content_md5.digest() ), 'Content-Type': content_type }
+ upload_url = "%s/%s/%s%s/%s?%s" % ( dm_url, GENOMESPACE_API_VERSION_STRING, upload_url, target_directory_dict['path'], urllib.quote( target_filename, safe='' ), urllib.urlencode( upload_params ) )
+ new_file_request = urllib2.Request( upload_url )#, headers = { 'Content-Type': 'application/json', 'Accept': 'application/text' } ) #apparently http://www.genomespace.org/team/specs/updated-dm-rest-api:"Every HTTP request to the Data Manager should include the Accept header with a preference for the media types application/json and application/text." is not correct
+ new_file_request.get_method = lambda: 'GET'
+ #get url to upload to
+ target_upload_url = url_opener.open( new_file_request ).read()
+ #upload file to determined url
+ upload_headers = dict( upload_params )
+ #upload_headers[ 'x-amz-meta-md5-hash' ] = content_md5.hexdigest()
+ upload_headers[ 'Accept' ] = 'application/json'
+ upload_file_request = urllib2.Request( target_upload_url, headers = upload_headers, data = input_file )
+ upload_file_request.get_method = lambda: 'PUT'
+ upload_result = urllib2.urlopen( upload_file_request ).read()
result_url = "%s/%s" % ( target_directory_dict['url'], urllib.quote( target_filename, safe='' ) )
#determine available gs launch apps
web_tools = get_genome_space_launch_apps( genomespace_site_dict['atmServer'], url_opener, result_url, file_type )
diff --git a/tools/genomespace/genomespace_exporter.xml b/tools/genomespace/genomespace_exporter.xml
index 344698e2baa..1f9561e11dc 100644
--- a/tools/genomespace/genomespace_exporter.xml
+++ b/tools/genomespace/genomespace_exporter.xml
@@ -1,5 +1,5 @@
-
+ - send data to GenomeSpacegenomespace_exporter.py
--genomespace_site "prod"
@@ -36,7 +36,7 @@
-
+