diff --git a/client/galaxy/scripts/utils/utils.js b/client/galaxy/scripts/utils/utils.js index 827cbb5e1c8..97e04855493 100644 --- a/client/galaxy/scripts/utils/utils.js +++ b/client/galaxy/scripts/utils/utils.js @@ -39,7 +39,7 @@ function validate (value) { return false; } for (var i in value) { - if (['__null__', '__undefined__', 'None', null, undefined].indexOf(value[i]) > -1) { + if (['__null__', '__undefined__', null, undefined].indexOf(value[i]) > -1) { return false; } } diff --git a/doc/source/_static/style.css b/doc/source/_static/style.css new file mode 100644 index 00000000000..ae29519975b --- /dev/null +++ b/doc/source/_static/style.css @@ -0,0 +1,3 @@ +div.floatright { + float: right; +} diff --git a/doc/source/_templates/layout.html b/doc/source/_templates/layout.html new file mode 100644 index 00000000000..324da72b53b --- /dev/null +++ b/doc/source/_templates/layout.html @@ -0,0 +1,5 @@ +{# layout.html #} +{# Import the theme's layout. #} +{% extends "!layout.html" %} + +{% set css_files = css_files + ['_static/style.css'] %} diff --git a/doc/source/index.rst b/doc/source/index.rst index 52e5032c8a1..02142d04c86 100644 --- a/doc/source/index.rst +++ b/doc/source/index.rst @@ -46,6 +46,8 @@ Contents Application Documentation + Releases + Indices and tables ================== diff --git a/doc/source/releases/13.01_announce.rst b/doc/source/releases/13.01_announce.rst new file mode 100644 index 00000000000..1f6ad49c71c --- /dev/null +++ b/doc/source/releases/13.01_announce.rst @@ -0,0 +1,11 @@ +=========================================================== +January 2013 Galaxy Release (v 13.01) +=========================================================== + +.. include:: _header.rst + +Please see the `Galaxy wiki`_ for announcement and release notes. + +.. _Galaxy wiki: https://wiki.galaxyproject.org/News/2013_01_11_DistributionNewsBrief + +.. include:: _thanks.rst diff --git a/doc/source/releases/13.02_announce.rst b/doc/source/releases/13.02_announce.rst new file mode 100644 index 00000000000..09a67d50e33 --- /dev/null +++ b/doc/source/releases/13.02_announce.rst @@ -0,0 +1,11 @@ +=========================================================== +February 2013 Galaxy Release (v 13.02) +=========================================================== + +.. include:: _header.rst + +Please see the `Galaxy wiki`_ for announcement and release notes. + +.. _Galaxy wiki: https://wiki.galaxyproject.org/News/2013_02_08_GalaxyNewsBrief + +.. include:: _thanks.rst diff --git a/doc/source/releases/13.04_announce.rst b/doc/source/releases/13.04_announce.rst new file mode 100644 index 00000000000..e2f93782b34 --- /dev/null +++ b/doc/source/releases/13.04_announce.rst @@ -0,0 +1,11 @@ +=========================================================== +April 2013 Galaxy Release (v 13.04) +=========================================================== + +.. include:: _header.rst + +Please see the `Galaxy wiki`_ for announcement and release notes. + +.. _Galaxy wiki: https://wiki.galaxyproject.org/News/2013_04_01_Galaxy_Distribution + +.. include:: _thanks.rst diff --git a/doc/source/releases/13.06_announce.rst b/doc/source/releases/13.06_announce.rst new file mode 100644 index 00000000000..58afa3846a1 --- /dev/null +++ b/doc/source/releases/13.06_announce.rst @@ -0,0 +1,11 @@ +=========================================================== +June 2013 Galaxy Release (v 13.06) +=========================================================== + +.. include:: _header.rst + +Please see the `Galaxy wiki`_ for announcement and release notes. + +.. _Galaxy wiki: https://wiki.galaxyproject.org/News/2013_06_03_Galaxy_Distribution + +.. include:: _thanks.rst diff --git a/doc/source/releases/13.08_announce.rst b/doc/source/releases/13.08_announce.rst new file mode 100644 index 00000000000..44c8ad154fc --- /dev/null +++ b/doc/source/releases/13.08_announce.rst @@ -0,0 +1,11 @@ +=========================================================== +August 2013 Galaxy Release (v 13.08) +=========================================================== + +.. include:: _header.rst + +Please see the `Galaxy wiki`_ for announcement and release notes. + +.. _Galaxy wiki: https://wiki.galaxyproject.org/News/2013_08_12_Galaxy_Distribution + +.. include:: _thanks.rst diff --git a/doc/source/releases/13.11_announce.rst b/doc/source/releases/13.11_announce.rst new file mode 100644 index 00000000000..4fb4c7c48ba --- /dev/null +++ b/doc/source/releases/13.11_announce.rst @@ -0,0 +1,11 @@ +=========================================================== +November 2013 Galaxy Release (v 13.11) +=========================================================== + +.. include:: _header.rst + +Please see the `Galaxy wiki`_ for announcement and release notes. + +.. _Galaxy wiki: https://wiki.galaxyproject.org/News/2013_11_04_Galaxy_Distribution + +.. include:: _thanks.rst diff --git a/doc/source/releases/14.02_announce.rst b/doc/source/releases/14.02_announce.rst new file mode 100644 index 00000000000..94462d732b6 --- /dev/null +++ b/doc/source/releases/14.02_announce.rst @@ -0,0 +1,11 @@ +=========================================================== +February 2014 Galaxy Release (v 14.02) +=========================================================== + +.. include:: _header.rst + +Please see the `Galaxy wiki`_ for announcement and release notes. + +.. _Galaxy wiki: https://wiki.galaxyproject.org/News/2014_02_10_Galaxy_Distribution + +.. include:: _thanks.rst diff --git a/doc/source/releases/14.04_announce.rst b/doc/source/releases/14.04_announce.rst new file mode 100644 index 00000000000..22e02c8993e --- /dev/null +++ b/doc/source/releases/14.04_announce.rst @@ -0,0 +1,11 @@ +=========================================================== +April 2014 Galaxy Release (v 14.04) +=========================================================== + +.. include:: _header.rst + +Please see the `Galaxy wiki`_ for announcement and release notes. + +.. _Galaxy wiki: https://wiki.galaxyproject.org/News/2014_04_14_Galaxy_Distribution + +.. include:: _thanks.rst diff --git a/doc/source/releases/14.06_announce.rst b/doc/source/releases/14.06_announce.rst new file mode 100644 index 00000000000..5b690ef3d60 --- /dev/null +++ b/doc/source/releases/14.06_announce.rst @@ -0,0 +1,11 @@ +=========================================================== +June 2014 Galaxy Release (v 14.06) +=========================================================== + +.. include:: _header.rst + +Please see the `Galaxy wiki`_ for announcement and release notes. + +.. _Galaxy wiki: https://wiki.galaxyproject.org/News/2014_06_02_Galaxy_Distribution + +.. include:: _thanks.rst diff --git a/doc/source/releases/14.08_announce.rst b/doc/source/releases/14.08_announce.rst new file mode 100644 index 00000000000..7052e85c8f1 --- /dev/null +++ b/doc/source/releases/14.08_announce.rst @@ -0,0 +1,11 @@ +=========================================================== +August 2014 Galaxy Release (v 14.08) +=========================================================== + +.. include:: _header.rst + +Please see the `Galaxy wiki`_ for announcement and release notes. + +.. _Galaxy wiki: https://wiki.galaxyproject.org/News/2014_08_11_Galaxy_Distribution + +.. include:: _thanks.rst diff --git a/doc/source/releases/14.10_announce.rst b/doc/source/releases/14.10_announce.rst new file mode 100644 index 00000000000..e6aaf567d39 --- /dev/null +++ b/doc/source/releases/14.10_announce.rst @@ -0,0 +1,11 @@ +=========================================================== +October 2014 Galaxy Release (v 14.10) +=========================================================== + +.. include:: _header.rst + +Please see the `Galaxy wiki`_ for announcement and release notes. + +.. _Galaxy wiki: https://wiki.galaxyproject.org/News/2014_10_06_Galaxy_Distribution + +.. include:: _thanks.rst diff --git a/doc/source/releases/15.01_announce.rst b/doc/source/releases/15.01_announce.rst new file mode 100644 index 00000000000..f670f3ced21 --- /dev/null +++ b/doc/source/releases/15.01_announce.rst @@ -0,0 +1,11 @@ +=========================================================== +January 2015 Galaxy Release (v 15.01) +=========================================================== + +.. include:: _header.rst + +Please see the `Galaxy wiki`_ for announcement and release notes. + +.. _Galaxy wiki: https://wiki.galaxyproject.org/News/2015_01_13_Galaxy_Distribution + +.. include:: _thanks.rst diff --git a/doc/source/releases/15.03_announce.rst b/doc/source/releases/15.03_announce.rst new file mode 100644 index 00000000000..7206175f6a1 --- /dev/null +++ b/doc/source/releases/15.03_announce.rst @@ -0,0 +1,11 @@ +=========================================================== +March 2015 Galaxy Release (v 15.03) +=========================================================== + +.. include:: _header.rst + +Please see the `Galaxy wiki`_ for announcement and release notes. + +.. _Galaxy wiki: https://wiki.galaxyproject.org/News/2015_03_GalaxyRelease + +.. include:: _thanks.rst diff --git a/doc/source/releases/15.05.rst b/doc/source/releases/15.05.rst new file mode 100644 index 00000000000..7e5aea7fbdb --- /dev/null +++ b/doc/source/releases/15.05.rst @@ -0,0 +1,358 @@ +.. to_doc + +------------------------------- +15.05 +------------------------------- + +.. enhancements + +Enhancements +------------------------------- + +.. starthighlight +* Pluggable framework to custom authentication (including new LDAP/Active + Directory integration). Thanks to many including Andrew Robinson, + Nicola Soranzo, and David Trudgian. `Pull Request 1`_, `Pull Request 33`_, + `Pull Request 51`_, `Pull Request 75`_, `Pull Request 98`_, + `Pull Request 216`_ +* Implement a new ``section`` tag for tool parameters. `Pull Request 35`_, + `Trello `__ +* New UI widgets allowing much more flexibility when creating simple dataset + pair and list collections. `Pull Request 134`_, + `Trello `__ +.. endhighlight +* Improved JavaScript build system for client code and libraries (now + using uglify_ and featuring `Source Maps`_). 72c876c_, 9a7f5fc_, 648a623_, + 22f280f_, `Trello `__ +* Add an `External Display Application`_ for viewing GFF/GTF files with IGV_. + `Pull Request 70`_, `Trello `__ +* Use TravisCI_ and Tox_ for continuous integration testing. + `Pull Request 40`_, `Pull Request 62`_, `Pull Request 97`_, + `Pull Request 99`_, `Pull Request 123`_, `Pull Request 222`_, + `Pull Request 235`_, +* Infrastructure for improved toolbox and Tool Shed searching. + `Pull Request 9`_, `Pull Request 116`_, `Pull Request 142`_, + `Pull Request 226`_, c2eb74c_, 2bf52fe_, ec549db_, + `Trello `__, `Trello `__ +* Enhance UI to allow renaming dataset collections. 21d1d6b_ +* Improve highlighting of current/active content history panel. + `Pull Request 126`_ +* Improvements to UI and API for histories and collections. e36e51e_, + 1e55206_, 0c79680_ +* Update history dataset API to account for job re-submission. b4cf49a_ +* Allow recalculating user disk usage from the admin interface. 964e081_ +* Collect significantly more metadata for BAM files. `Pull Request 107`_, + `Pull Request 108`_ +* Implement ``detect_errors`` attribute on command of tool XML. + `Pull Request 117`_ +* Allow setting ``auto_format="True"`` on tool ``output`` tags. + `Pull Request 130`_ +* Allow testing tool outputs based on MD5 hashes. `Pull Request 125`_ +* Improved Cheetah type casting for int/float values. `Pull Request 121`_ +* Add option to pass arbitrary parameters to gem install as part of + the tool shed ``setup_ruby_environment`` Tool Shed install action - + thanks to Björn Grüning. `Pull Request 118`_ +* Add ``argument`` attribute to tool parameters. `Pull Request 8`_ +* Improve link and message that appears after workflows are run. + `Pull Request 143`_ +* Add NCBI SRA datatype - thanks to Matt Shirley. `Pull Request 87`_ +* Stronger toolbox filtering. `Pull Request 119`_ +* Allow updating Tool Shed repositories via the API - thanks to Eric Rasche. + `Pull Request 30`_ +* Expose category list in show call for Tool Shed repositories - thanks to + Eric Rasche. `Pull Request 29`_ +* Add API endpoint to create Tool Shed repositories. `Pull Request 2`_ +* Do not configure Galaxy to use the test Tool Shed by default. + `Pull Request 38`_ +* Add fields and improve display of Tool Shed repositories. + a24e206_, d6d61bc_, `Trello `__ +* Enhance multi-selection widgets to allow key combinations ``Ctrl-A`` + and ``Ctrl-X``. e8564d7_, `Trello `__ +* New, consistent button for displaying citation BibTeX. `Pull Request 19`_ +* Improved ``README`` reflecting move to Github - thanks in part to Eric + Rasche. `PR #2 (old repo) + `__, + 226e826_, 2650d09_, 7d5dde8_ +* Update application to use new logo. 2748f9d_, `Pull Request 187`_, + `Pull Request 206`_ +* Update many documentation links to use https sites - thanks to + Nicola Soranzo. 8254cab_ +* Sync report options config with ``galaxy.ini`` - thanks to Björn Grüning. + `Pull Request 12`_ +* Eliminate need to use API key to list tools via API. cd7abe8_ +* Restore function necessary for splitting sequence datatypes - thanks to + Roberto Alonso. `Pull Request 5`_ +* Suppress filenames in SAM merge using ``egrep`` - thanks to Peter Cock + and Roberto Alonso. `Pull Request 4`_ +* Option to sort counts in ``Count1`` tool (``tools/filters/uniq.xml``) - + thanks to Peter Cock. `Pull Request 16`_ +* Preserve spaces in ``Count1`` tool (``tools/filters/uniq.xml``) - thanks to + Peter Cock. `Pull Request 13`_ +* `Interactive Environments`_ improvements and fixes from multiple + developers including Eric Rasche and Björn Grüning. `Pull Request 69`_, + `Pull Request 73`_, `Pull Request 131`_, `Pull Request 135`_, + `Pull Request 152`_, `Pull Request 197`_ +* Enable multi-part upload for exporting files with the GenomeSpace export + tool. `Pull Request 74`_, `Trello `__ +* Large refactoring, expansion, and increase in test coverage for "managers". + `Pull Request 76`_ +* Improved display of headers in tool help. 157eba6_, + `Biostar `__ +* Uniform configuration of "From" field for sent emails - thanks to Nicola + Soranzo. `Pull Request 23`_ +* Allow setting ``job_conf.xml`` params via environment variables & + ``galaxy.ini``. dde2fc9_ +* Allow a tool data table to declare that duplicate entries are not + allowed. `Pull Request 245`_ +* Add verbose test error flag option in run_tests.sh. 62f0495_ +* Update ``.gitignore`` to include ``run_api_tests.html``. b52cc98_ +* Add experimental options to run tests in Docker. e99adb5_ +* Improve ``run_test.sh --help`` documentation to detail running specific + tests. `Pull Request 86`_ +* Remove older, redundant history tests. `Pull Request 120`_, + `Trello `__ +* Add test tool demonstrating citing a Github repository. 65def71_ +* Add option to track all automated changes to the integrated tool panel. + 10bb492_ +* Make tool version explicit in all distribution tool - thanks to Peter Cock. + `Pull Request 14`_. +* Relocate the external metadata setting script. `Pull Request 7`_ +* Parameterize script used to pull new builds from the UCSC Browser. + e4e5df0_ +* Enhance jobs and workflow logging to report timings. 06346a4_ +* Add debug message for dynamic options exceptions. `Pull Request 91`_ +* Remove demo sequencer app. 3af3bf5_ +* Tweaks to the Pulsar's handling of async messages. `Pull Request 109`_ +* Return more specific API authentication errors. 71a64ca_ +* Upgrade Python dependency sqlalchemy to 1.0.0. d725aab_, `Pull Request 129`_ +* Upgrade Python dependency amqp to 1.4.6. `Pull Request 128`_ +* Upgrade Python dependency kombu to 3.0.24. `Pull Request 128`_ +* Upgrade JavaScript dependency raven.js to 1.1.17. bcd1701_ + +.. fixes + +Fixes +------------------------------- + +* During the 15.05 development cycle dozens of fixes were pushed to the + ``release_15.03`` branch of Galaxy. These are all included in 15.05 and + summarized `here + `__ + (with special thanks to Björn Grüning and Marius van den Beek). +* Fix race condition that would occasionally prevent Galaxy from starting + properly. `Pull Request 198`_, `Trello `__ +* Fix scatter plot API communications for certain proxied Galaxy instances - + thanks to @yhoogstrate. `Pull Request 89`_ +* Fix bug in collectl_ job metrics plugin - thanks to Carrie Ganote. + `Pull Request 231`_ +* Fix late validation of tool parameters. `Pull Request 115`_ +* Fix ``fasta_to_tabular_converter.py`` (for implicit conversion) - thanks to + Peter Cock. `Pull Request 11`_ +* Fix to eliminate race condition by collecting extra files before declaring + dataset's OK. `Pull Request 48`_ +* Fix setting current history for certain proxied Galaxy instances - thanks + to @wezen. 6946e46_. +* Fix typo in tool failure testing example - thanks to Peter Cock. + `Pull Request 18`_. +* Fix Galaxy to default to using SSL for communicating with Tool Sheds. + 0b037a2_ +* Fix data source tools to open in ``_top`` window. + `Pull Request 17`_ +* Fix to fallback to name for tool parameters without labels. + `Pull Request 189`_, `Trello `__ +* Fix to remove redundant version ids in tool version selector. + `Pull Request 244`_ +* Fix for downloading metadata files. `Pull Request 234`_ +* Fix for history failing to render if it contains more exotic dataset + collection types. `Pull Request 196`_ +* Fixes for BaseURLToolParameter. `Pull Request 247`_ +* Fix to suppress pysam binary incompatibility warning when using datatypes + in ``binary.py``. `Pull Request 252`_ +* Fix for library UI duplication bug. `Pull Request 179`_ +* Fix for `Backbone.js`_ loading as AMD_. 4e5218f_ +* Other small Tool Shed fixes. 815f86f_, 76e0915_ +* Fix file closing in ``lped_to_pbed_converter``. 182b67f_ +* Fix undefined variables in Tool Shed ``add_repository_entry`` API script. + 47e6f08_ +* Fix user registration to respect use_panels when in the Galaxy app. + 7ac8631_, `Trello `__ +* Fix bug in scramble exception, incorrect reference to source_path 79d50d8_ +* Fix error handling in ``pbed_to_lped``. 7aecd7a_ +* Fix error handling in Tool Shed step handler for ``chmod`` action. 1454396_ +* Fix ``__safe_string_wrapper`` in tool evaluation object_wrapper. ab6f13e_ +* Fixes for data types and data providers. c1d2d1f_, 8da70bb_, 0b83b1e_ +* Fixes for Tool Shed commit and mercurial handling modules. 6102edf_, + b639bc0_, debea9d_ +* Fix to clean working directory during job re-submission. `Pull Request 236`_ +* Fix bug when task splitting jobs fail. `Pull Request 214`_ +* Fix some minor typos in comment docs in ``config/galaxy.ini.sample``. + `Pull Request 210`_ +* Fix admin disk usage message. `Pull Request 205`_, + `Trello `__ +* Fix to sessionStorage Model to suppress QUOTA DOMExceptions when Safari + users are in private browsing mode. 0c94f04_ + +.. _IGV: https://www.broadinstitute.org/igv/ +.. _External Display Application: https://wiki.galaxyproject.org/Admin/Tools/External%20Display%20Applications%20Tutorial +.. _Interactive Environments: https://wiki.galaxyproject.org/Admin/IEs +.. _TravisCI: https://travis-ci.org/ +.. _Tox: https://testrun.org/tox/latest/ +.. _Source Maps: https://developer.chrome.com/devtools/docs/javascript-debugging#source-maps +.. _uglify: https://developer.chrome.com/devtools/docs/javascript-debugging#source-maps +.. _collectl: http://collectl.sourceforge.net/ +.. _Backbone.js: http://backbonejs.org/ +.. _AMD: http://requirejs.org/docs/whyamd.html + +.. github_links +.. _Pull Request 129: https://github.com/galaxyproject/galaxy/pull/129 +.. _Pull Request 128: https://github.com/galaxyproject/galaxy/pull/128 +.. _Pull Request 2: https://github.com/galaxyproject/galaxy/pull/2 +.. _Pull Request 247: https://github.com/galaxyproject/galaxy/pull/247 +.. _Pull Request 252: https://github.com/galaxyproject/galaxy/pull/252 +.. _Pull Request 245: https://github.com/galaxyproject/galaxy/pull/245 +.. _Pull Request 244: https://github.com/galaxyproject/galaxy/pull/244 +.. _Pull Request 236: https://github.com/galaxyproject/galaxy/pull/236 +.. _Pull Request 235: https://github.com/galaxyproject/galaxy/pull/235 +.. _Pull Request 222: https://github.com/galaxyproject/galaxy/pull/222 +.. _Pull Request 234: https://github.com/galaxyproject/galaxy/pull/234 +.. _Pull Request 231: https://github.com/galaxyproject/galaxy/pull/231 +.. _Pull Request 226: https://github.com/galaxyproject/galaxy/pull/226 +.. _Pull Request 216: https://github.com/galaxyproject/galaxy/pull/216 +.. _Pull Request 215: https://github.com/galaxyproject/galaxy/pull/215 +.. _Pull Request 214: https://github.com/galaxyproject/galaxy/pull/214 +.. _Pull Request 198: https://github.com/galaxyproject/galaxy/pull/198 +.. _Pull Request 210: https://github.com/galaxyproject/galaxy/pull/210 +.. _Pull Request 206: https://github.com/galaxyproject/galaxy/pull/206 +.. _Pull Request 205: https://github.com/galaxyproject/galaxy/pull/205 +.. _Pull Request 197: https://github.com/galaxyproject/galaxy/pull/197 +.. _Pull Request 196: https://github.com/galaxyproject/galaxy/pull/196 +.. _Pull Request 189: https://github.com/galaxyproject/galaxy/pull/189 +.. _Pull Request 187: https://github.com/galaxyproject/galaxy/pull/187 +.. _Pull Request 179: https://github.com/galaxyproject/galaxy/pull/179 +.. _Pull Request 153: https://github.com/galaxyproject/galaxy/pull/153 +.. _Pull Request 152: https://github.com/galaxyproject/galaxy/pull/152 +.. _5abb8ad: https://github.com/galaxyproject/galaxy/commit/5abb8ad +.. _Pull Request 130: https://github.com/galaxyproject/galaxy/pull/130 +.. _Pull Request 146: https://github.com/galaxyproject/galaxy/pull/146 +.. _Pull Request 135: https://github.com/galaxyproject/galaxy/pull/135 +.. _Pull Request 143: https://github.com/galaxyproject/galaxy/pull/143 +.. _Pull Request 142: https://github.com/galaxyproject/galaxy/pull/142 +.. _Pull Request 131: https://github.com/galaxyproject/galaxy/pull/131 +.. _d725aab: https://github.com/galaxyproject/galaxy/commit/d725aab +.. _Pull Request 126: https://github.com/galaxyproject/galaxy/pull/126 +.. _e09761e: https://github.com/galaxyproject/galaxy/commit/e09761e +.. _8d3c531: https://github.com/galaxyproject/galaxy/commit/8d3c531 +.. _Pull Request 125: https://github.com/galaxyproject/galaxy/pull/125 +.. _Pull Request 123: https://github.com/galaxyproject/galaxy/pull/123 +.. _Pull Request 121: https://github.com/galaxyproject/galaxy/pull/121 +.. _Pull Request 120: https://github.com/galaxyproject/galaxy/pull/120 +.. _Pull Request 119: https://github.com/galaxyproject/galaxy/pull/119 +.. _Pull Request 117: https://github.com/galaxyproject/galaxy/pull/117 +.. _Pull Request 118: https://github.com/galaxyproject/galaxy/pull/118 +.. _Pull Request 134: https://github.com/galaxyproject/galaxy/pull/134 +.. _Pull Request 116: https://github.com/galaxyproject/galaxy/pull/116 +.. _Pull Request 109: https://github.com/galaxyproject/galaxy/pull/109 +.. _647cf55: https://github.com/galaxyproject/galaxy/commit/647cf55 +.. _Pull Request 108: https://github.com/galaxyproject/galaxy/pull/108 +.. _Pull Request 107: https://github.com/galaxyproject/galaxy/pull/107 +.. _8254cab: https://github.com/galaxyproject/galaxy/commit/8254cab +.. _Pull Request 99: https://github.com/galaxyproject/galaxy/pull/99 +.. _Pull Request 98: https://github.com/galaxyproject/galaxy/pull/98 +.. _Pull Request 115: https://github.com/galaxyproject/galaxy/pull/115 +.. _Pull Request 97: https://github.com/galaxyproject/galaxy/pull/97 +.. _Pull Request 91: https://github.com/galaxyproject/galaxy/pull/91 +.. _Pull Request 89: https://github.com/galaxyproject/galaxy/pull/89 +.. _Pull Request 86: https://github.com/galaxyproject/galaxy/pull/86 +.. _Pull Request 87: https://github.com/galaxyproject/galaxy/pull/87 +.. _Pull Request 73: https://github.com/galaxyproject/galaxy/pull/73 +.. _Pull Request 74: https://github.com/galaxyproject/galaxy/pull/74 +.. _Pull Request 75: https://github.com/galaxyproject/galaxy/pull/75 +.. _Pull Request 70: https://github.com/galaxyproject/galaxy/pull/70 +.. _Pull Request 69: https://github.com/galaxyproject/galaxy/pull/69 +.. _Pull Request 62: https://github.com/galaxyproject/galaxy/pull/62 +.. _Pull Request 51: https://github.com/galaxyproject/galaxy/pull/51 +.. _Pull Request 76: https://github.com/galaxyproject/galaxy/pull/76 +.. _2650d09: https://github.com/galaxyproject/galaxy/commit/2650d09 +.. _7d5dde8: https://github.com/galaxyproject/galaxy/commit/7d5dde8 +.. _2748f9d: https://github.com/galaxyproject/galaxy/commit/2748f9d +.. _d6d61bc: https://github.com/galaxyproject/galaxy/commit/d6d61bc +.. _815f86f: https://github.com/galaxyproject/galaxy/commit/815f86f +.. _76e0915: https://github.com/galaxyproject/galaxy/commit/76e0915 +.. _bce8171: https://github.com/galaxyproject/galaxy/commit/bce8171 +.. _06346a4: https://github.com/galaxyproject/galaxy/commit/06346a4 +.. _b4cf49a: https://github.com/galaxyproject/galaxy/commit/b4cf49a +.. _Pull Request 40: https://github.com/galaxyproject/galaxy/pull/40 +.. _Pull Request 38: https://github.com/galaxyproject/galaxy/pull/38 +.. _a24e206: https://github.com/galaxyproject/galaxy/commit/a24e206 +.. _Pull Request 35: https://github.com/galaxyproject/galaxy/pull/35 +.. _e36e51e: https://github.com/galaxyproject/galaxy/commit/e36e51e +.. _1e55206: https://github.com/galaxyproject/galaxy/commit/1e55206 +.. _0c79680: https://github.com/galaxyproject/galaxy/commit/0c79680 +.. _Pull Request 1: https://github.com/galaxyproject/galaxy/pull/1 +.. _Pull Request 33: https://github.com/galaxyproject/galaxy/pull/33 +.. _Pull Request 48: https://github.com/galaxyproject/galaxy/pull/48 +.. _21d1d6b: https://github.com/galaxyproject/galaxy/commit/21d1d6b +.. _Pull Request 30: https://github.com/galaxyproject/galaxy/pull/30 +.. _Pull Request 29: https://github.com/galaxyproject/galaxy/pull/29 +.. _c0e5509: https://github.com/galaxyproject/galaxy/commit/c0e5509 +.. _157eba6: https://github.com/galaxyproject/galaxy/commit/157eba6 +.. _72c876c: https://github.com/galaxyproject/galaxy/commit/72c876c +.. _9a7f5fc: https://github.com/galaxyproject/galaxy/commit/9a7f5fc +.. _648a623: https://github.com/galaxyproject/galaxy/commit/648a623 +.. _59028c0: https://github.com/galaxyproject/galaxy/commit/59028c0 +.. _bcd1701: https://github.com/galaxyproject/galaxy/commit/bcd1701 +.. _22f280f: https://github.com/galaxyproject/galaxy/commit/22f280f +.. _6946e46: https://github.com/galaxyproject/galaxy/commit/6946e46 +.. _65def71: https://github.com/galaxyproject/galaxy/commit/65def71 +.. _4e5218f: https://github.com/galaxyproject/galaxy/commit/4e5218f +.. _Pull Request 16: https://github.com/galaxyproject/galaxy/pull/16 +.. _Pull Request 13: https://github.com/galaxyproject/galaxy/pull/13 +.. _e8564d7: https://github.com/galaxyproject/galaxy/commit/e8564d7 +.. _Pull Request 23: https://github.com/galaxyproject/galaxy/pull/23 +.. _Pull Request 22: https://github.com/galaxyproject/galaxy/pull/22 +.. _10bb492: https://github.com/galaxyproject/galaxy/commit/10bb492 +.. _Pull Request 19: https://github.com/galaxyproject/galaxy/pull/19 +.. _Pull Request 18: https://github.com/galaxyproject/galaxy/pull/18 +.. _0b037a2: https://github.com/galaxyproject/galaxy/commit/0b037a2 +.. _Pull Request 17: https://github.com/galaxyproject/galaxy/pull/17 +.. _b29a5e9: https://github.com/galaxyproject/galaxy/commit/b29a5e9 +.. _Pull Request 14: https://github.com/galaxyproject/galaxy/pull/14 +.. _7aecd7a: https://github.com/galaxyproject/galaxy/commit/7aecd7a +.. _Pull Request 12: https://github.com/galaxyproject/galaxy/pull/12 +.. _cd7abe8: https://github.com/galaxyproject/galaxy/commit/cd7abe8 +.. _62f0495: https://github.com/galaxyproject/galaxy/commit/62f0495 +.. _Pull Request 11: https://github.com/galaxyproject/galaxy/pull/11 +.. _Pull Request 9: https://github.com/galaxyproject/galaxy/pull/9 +.. _632ec4e: https://github.com/galaxyproject/galaxy/commit/632ec4e +.. _Pull Request 8: https://github.com/galaxyproject/galaxy/pull/8 +.. _Pull Request 7: https://github.com/galaxyproject/galaxy/pull/7 +.. _b52cc98: https://github.com/galaxyproject/galaxy/commit/b52cc98 +.. _1454396: https://github.com/galaxyproject/galaxy/commit/1454396 +.. _8da70bb: https://github.com/galaxyproject/galaxy/commit/8da70bb +.. _b639bc0: https://github.com/galaxyproject/galaxy/commit/b639bc0 +.. _ab6f13e: https://github.com/galaxyproject/galaxy/commit/ab6f13e +.. _debea9d: https://github.com/galaxyproject/galaxy/commit/debea9d +.. _6102edf: https://github.com/galaxyproject/galaxy/commit/6102edf +.. _c1d2d1f: https://github.com/galaxyproject/galaxy/commit/c1d2d1f +.. _0b83b1e: https://github.com/galaxyproject/galaxy/commit/0b83b1e +.. _216fb95: https://github.com/galaxyproject/galaxy/commit/216fb95 +.. _182b67f: https://github.com/galaxyproject/galaxy/commit/182b67f +.. _47e6f08: https://github.com/galaxyproject/galaxy/commit/47e6f08 +.. _7ac8631: https://github.com/galaxyproject/galaxy/commit/7ac8631 +.. _2bf52fe: https://github.com/galaxyproject/galaxy/commit/2bf52fe +.. _e4e5df0: https://github.com/galaxyproject/galaxy/commit/e4e5df0 +.. _6e17bf4: https://github.com/galaxyproject/galaxy/commit/6e17bf4 +.. _0c94f04: https://github.com/galaxyproject/galaxy/commit/0c94f04 +.. _Pull Request 1: https://github.com/galaxyproject/galaxy/pull/1 +.. _ec549db: https://github.com/galaxyproject/galaxy/commit/ec549db +.. _226e826: https://github.com/galaxyproject/galaxy/commit/226e826 +.. _79d50d8: https://github.com/galaxyproject/galaxy/commit/79d50d8 +.. _964e081: https://github.com/galaxyproject/galaxy/commit/964e081 +.. _Pull Request 5: https://github.com/galaxyproject/galaxy/pull/5 +.. _1f1bb29: https://github.com/galaxyproject/galaxy/commit/1f1bb29 +.. _Pull Request 4: https://github.com/galaxyproject/galaxy/pull/4 +.. _dde2fc9: https://github.com/galaxyproject/galaxy/commit/dde2fc9 +.. _c2eb74c: https://github.com/galaxyproject/galaxy/commit/c2eb74c +.. _71a64ca: https://github.com/galaxyproject/galaxy/commit/71a64ca +.. _3af3bf5: https://github.com/galaxyproject/galaxy/commit/3af3bf5 +.. _e99adb5: https://github.com/galaxyproject/galaxy/commit/e99adb5 diff --git a/doc/source/releases/15.05_announce.rst b/doc/source/releases/15.05_announce.rst new file mode 100644 index 00000000000..db98dc32bdc --- /dev/null +++ b/doc/source/releases/15.05_announce.rst @@ -0,0 +1,58 @@ +=========================================================== +May 2015 Galaxy Release (v 15.05) +=========================================================== + +.. include:: _header.rst + +Highlights +=========================================================== + +**Authentication Plugins** + Galaxy now has native support for LDAP and Active Directory via a new + community developed authentication plugin system. + +**Tool Sections** + Tool parameters may now be groupped into collapsable sections. + +**Collection Creators** + New widgets have been added that allow much more flexibility when creating + simple dataset pair and list collections. + +`Github `__ +=========================================================== + +New + .. code-block:: shell + + % git clone -b master https://github.com/galaxyproject/galaxy.git + +Update to latest stable release + .. code-block:: shell + + % git checkout master && pull --ff-only origin master + +Update to exact version + .. code-block:: shell + + % git checkout v15.05 + + +`BitBucket `__ +=========================================================== + +Upgrade + .. code-block:: shell + + % hg pull + % hg update latest_15.05 + + +See `our wiki `__ for additional details regarding the source code locations. + +Release Notes +=========================================================== + +.. include:: 15.05.rst + :start-after: enhancements + +.. include:: _thanks.rst diff --git a/doc/source/releases/_header.rst b/doc/source/releases/_header.rst new file mode 100644 index 00000000000..c982e72796d --- /dev/null +++ b/doc/source/releases/_header.rst @@ -0,0 +1,3 @@ +.. image:: https://wiki.galaxyproject.org/Images/GalaxyLogo?action=AttachFile&do=get&target=galaxy_logo_25percent_transparent.png + :alt: Get the Galaxy Release Your Way + :target: http://getgalaxy.org diff --git a/doc/source/releases/_thanks.rst b/doc/source/releases/_thanks.rst new file mode 100644 index 00000000000..388a44e4c50 --- /dev/null +++ b/doc/source/releases/_thanks.rst @@ -0,0 +1,7 @@ +To stay up to date with Galaxy's progress watch our `screencasts `__, +read our `wiki `__, and follow +`@galaxyproject `__ on Twitter. + +*Thanks for using Galaxy!* + +`The Galaxy Team `__ diff --git a/doc/source/releases/index.rst b/doc/source/releases/index.rst new file mode 100644 index 00000000000..388893091ac --- /dev/null +++ b/doc/source/releases/index.rst @@ -0,0 +1,21 @@ +Releases +======== + +.. toctree:: + :maxdepth: 1 + + 15.05_announce + 15.03_announce + 15.01_announce + 14.10_announce + 14.08_announce + 14.06_announce + 14.04_announce + 14.02_announce + 13.11_announce + 13.08_announce + 13.06_announce + 13.04_announce + 13.02_announce + 13.01_announce + older_releases diff --git a/doc/source/releases/older_releases.rst b/doc/source/releases/older_releases.rst new file mode 100644 index 00000000000..98aebbe9745 --- /dev/null +++ b/doc/source/releases/older_releases.rst @@ -0,0 +1,11 @@ +=========================================================== +Galaxy Releases older than v 13.01 +=========================================================== + +.. include:: _header.rst + +Please see the `Galaxy wiki`_ for announcement and release notes. + +.. _Galaxy wiki: https://wiki.galaxyproject.org/DevNewsBriefs + +.. include:: _thanks.rst diff --git a/lib/galaxy/datatypes/binary.py b/lib/galaxy/datatypes/binary.py index eed993c890b..cc7362a7c90 100644 --- a/lib/galaxy/datatypes/binary.py +++ b/lib/galaxy/datatypes/binary.py @@ -12,6 +12,7 @@ import struct import subprocess import tempfile import re +import warnings import zipfile from galaxy import eggs @@ -24,8 +25,11 @@ from galaxy.datatypes.metadata import MetadataElement, MetadataParameter, ListPa from galaxy.datatypes import metadata import dataproviders -eggs.require( "pysam" ) -from pysam import csamtools +with warnings.catch_warnings(): + warnings.simplefilter( "ignore" ) + eggs.require( "pysam" ) + from pysam import csamtools + log = logging.getLogger(__name__) diff --git a/lib/galaxy/jobs/actions/post.py b/lib/galaxy/jobs/actions/post.py index eff28baf095..da867d47aa6 100644 --- a/lib/galaxy/jobs/actions/post.py +++ b/lib/galaxy/jobs/actions/post.py @@ -8,6 +8,9 @@ import logging import socket from galaxy.util import send_mail from galaxy.util.json import dumps +from galaxy import eggs +eggs.require( "MarkupSafe" ) +from markupsafe import escape log = logging.getLogger( __name__ ) @@ -50,7 +53,7 @@ class DefaultJobAction(object): @classmethod def get_short_str(cls, pja): if pja.action_arguments: - return "%s -> %s" % (pja.action_type, pja.action_arguments) + return "%s -> %s" % (pja.action_type, escape(pja.action_arguments)) else: return "%s" % pja.action_type @@ -91,7 +94,7 @@ class EmailAction(DefaultJobAction): @classmethod def get_short_str(cls, pja): if pja.action_arguments and 'host' in pja.action_arguments: - return "Email the current user from server %s when this job is complete." % pja.action_arguments['host'] + return "Email the current user from server %s when this job is complete." % escape(pja.action_arguments['host']) else: return "Email the current user when this job is complete." @@ -127,7 +130,8 @@ class ChangeDatatypeAction(DefaultJobAction): @classmethod def get_short_str(cls, pja): - return "Set the datatype of output '%s' to '%s'" % (pja.output_name, pja.action_arguments['newtype']) + return "Set the datatype of output '%s' to '%s'" % (escape(pja.output_name), + escape(pja.action_arguments['newtype'])) class RenameDatasetAction(DefaultJobAction): @@ -235,7 +239,8 @@ class RenameDatasetAction(DefaultJobAction): def get_short_str(cls, pja): # Prevent renaming a dataset to the empty string. if pja.action_arguments and pja.action_arguments.get('newname', ''): - return "Rename output '%s' to '%s'." % (pja.output_name, pja.action_arguments['newname']) + return "Rename output '%s' to '%s'." % (escape(pja.output_name), + escape(pja.action_arguments['newname'])) else: return "Rename action used without a new name specified. Output name will be unchanged." @@ -260,7 +265,7 @@ class HideDatasetAction(DefaultJobAction): @classmethod def get_short_str(cls, pja): - return "Hide output '%s'." % pja.output_name + return "Hide output '%s'." % escape(pja.output_name) class DeleteDatasetAction(DefaultJobAction): @@ -336,7 +341,7 @@ class ColumnSetAction(DefaultJobAction): @classmethod def get_short_str(cls, pja): - return "Set the following metadata values:
" + "
".join(['%s : %s' % (k, v) for k, v in pja.action_arguments.iteritems()]) + return "Set the following metadata values:
" + "
".join(['%s : %s' % (escape(k), escape(v)) for k, v in pja.action_arguments.iteritems()]) class SetMetadataAction(DefaultJobAction): @@ -455,7 +460,8 @@ class TagDatasetAction(DefaultJobAction): @classmethod def get_short_str(cls, pja): if pja.action_arguments and pja.action_arguments.get('tags', ''): - return "Add tag(s) '%s' to '%s'." % (pja.action_arguments['tags'], pja.output_name) + return "Add tag(s) '%s' to '%s'." % (escape(pja.action_arguments['tags']), + escape(pja.output_name)) else: return "Tag addition action used without a tag specified. No tag will be added." diff --git a/lib/galaxy/managers/histories.py b/lib/galaxy/managers/histories.py index b167e07a0e6..14e53aa230d 100644 --- a/lib/galaxy/managers/histories.py +++ b/lib/galaxy/managers/histories.py @@ -282,21 +282,21 @@ class HistorySerializer( sharable.SharableModelSerializer, deletable.PurgableSer state = states.ERROR # TODO: history_state and state_counts are classically calc'd at the same time # so this is rel. ineff. - if we keep this... - hda_state_counts = self.serialize_state_counts( history, 'counts', exclude_deleted=False, **context ) + hda_state_counts = self.serialize_state_counts( history, 'counts', exclude_deleted=True, **context ) num_hdas = sum( hda_state_counts.values() ) if num_hdas == 0: state = states.NEW else: if ( hda_state_counts[ states.RUNNING ] > 0 - or hda_state_counts[ states.SETTING_METADATA ] > 0 - or hda_state_counts[ states.UPLOAD ] > 0 ): + or hda_state_counts[ states.SETTING_METADATA ] > 0 + or hda_state_counts[ states.UPLOAD ] > 0 ): state = states.RUNNING # TODO: this method may be more useful if we *also* polled the histories jobs here too elif hda_state_counts[ states.QUEUED ] > 0: state = states.QUEUED elif ( hda_state_counts[ states.ERROR ] > 0 - or hda_state_counts[ states.FAILED_METADATA ] > 0 ): + or hda_state_counts[ states.FAILED_METADATA ] > 0 ): state = states.ERROR elif hda_state_counts[ states.OK ] == num_hdas: state = states.OK diff --git a/lib/galaxy/tools/__init__.py b/lib/galaxy/tools/__init__.py index ae4133400c3..22ea22c0b92 100755 --- a/lib/galaxy/tools/__init__.py +++ b/lib/galaxy/tools/__init__.py @@ -1880,10 +1880,12 @@ class Tool( object, Dictifiable ): """ args = dict() for key, param in self.inputs.iteritems(): - if isinstance( param, HiddenToolParameter ): + # BaseURLToolParameter is now a subclass of HiddenToolParameter, so + # we must check if param is a BaseURLToolParameter first + if isinstance( param, BaseURLToolParameter ): + args[key] = param.get_initial_value( trans, None ) + elif isinstance( param, HiddenToolParameter ): args[key] = model.User.expand_user_properties( trans.user, param.value ) - elif isinstance( param, BaseURLToolParameter ): - args[key] = param.get_value( trans ) else: raise Exception( "Unexpected parameter type" ) return args @@ -2546,7 +2548,8 @@ class Tool( object, Dictifiable ): tool_versions = [] tools = self.app.toolbox.get_loaded_tools_by_lineage(self.id) for t in tools: - tool_versions.append(t.version) + if not t.version in tool_versions: + tool_versions.append(t.version) # add information with underlying requirements and their versions tool_requirements = [] diff --git a/lib/galaxy/tools/data/__init__.py b/lib/galaxy/tools/data/__init__.py index c90b188027c..fe965b6b575 100644 --- a/lib/galaxy/tools/data/__init__.py +++ b/lib/galaxy/tools/data/__init__.py @@ -185,6 +185,7 @@ class ToolDataTable( object ): self.comment_char = config_element.get( 'comment_char' ) self.empty_field_value = config_element.get( 'empty_field_value', '' ) self.empty_field_values = {} + self.allow_duplicate_entries = util.asbool( config_element.get( 'allow_duplicate_entries', True ) ) self.here = filename and os.path.dirname(filename) self.filenames = odict() self.tool_data_path = tool_data_path @@ -354,6 +355,11 @@ class TabularToolDataTable( ToolDataTable, Dictifiable ): self.filenames[ filename ] = info #save info about table self._merged_load_info.append( ( other_table.__class__, other_table._load_info ) ) + # If we are merging in a data table that does not allow duplicates, enforce that upon the data table + if self.allow_duplicate_entries and not other_table.allow_duplicate_entries: + log.debug( 'While attempting to merge tool data table "%s", the other instance of the table specified that duplicate entries are not allowed, now deduplicating all previous entries.', self.name ) + self.allow_duplicate_entries = False + self._deduplicate_data() #add data entries and return current data table version return self.add_entries( other_table.data, allow_duplicates=allow_duplicates, persist=persist, persist_on_error=persist_on_error, entry_source=entry_source, **kwd ) @@ -426,6 +432,8 @@ class TabularToolDataTable( ToolDataTable, Dictifiable ): def extend_data_with( self, filename, errors=None ): here = os.path.dirname(os.path.abspath(filename)) self.data.extend( self.parse_file_fields( open( filename ), errors=errors, here=here ) ) + if not self.allow_duplicate_entries: + self._deduplicate_data() def parse_file_fields( self, reader, errors=None, here="__HERE__" ): """ @@ -536,7 +544,7 @@ class TabularToolDataTable( ToolDataTable, Dictifiable ): is_error = False if self.largest_index < len( fields ): fields = self._replace_field_separators( fields ) - if fields not in self.get_fields() or allow_duplicates: + if fields not in self.get_fields() or ( allow_duplicates and self.allow_duplicate_entries ): self.data.append( fields ) else: log.debug( "Attempted to add fields (%s) to data table '%s', but this entry already exists and allow_duplicates is False.", fields, self.name ) @@ -624,6 +632,20 @@ class TabularToolDataTable( ToolDataTable, Dictifiable ): replace = " " return map( lambda x: x.replace( separator, replace ), fields ) + def _deduplicate_data( self ): + # Remove duplicate entries, without recreating self.data object + dup_lines = [] + hash_list = [] + for i, fields in enumerate( self.data ): + fields_hash = hash( self.separator.join( fields ) ) + if fields_hash in hash_list: + dup_lines.append( i ) + log.debug( 'Found duplicate entry in tool data table "%s", but duplicates are not allowed, removing additional entry for: "%s"', self.name, fields ) + else: + hash_list.append( fields_hash ) + for i in reversed( dup_lines ): + self.data.pop( i ) + @property def xml_string( self ): return util.xml_to_string( self.config_element ) diff --git a/lib/galaxy/tools/parameters/basic.py b/lib/galaxy/tools/parameters/basic.py index d5ec6f263a8..63bd9194a65 100644 --- a/lib/galaxy/tools/parameters/basic.py +++ b/lib/galaxy/tools/parameters/basic.py @@ -677,6 +677,7 @@ class HiddenToolParameter( ToolParameter ): def get_label( self ): return None + class ColorToolParameter( ToolParameter ): """ Parameter that stores a color. @@ -707,9 +708,23 @@ class BaseURLToolParameter( HiddenToolParameter ): super( BaseURLToolParameter, self ).__init__( tool, input_source ) self.value = input_source.get( 'value', '' ) + def get_initial_value( self, trans, context, history=None ): + return self._get_value() + + def get_html_field( self, trans=None, value=None, other_values={} ): + return form_builder.HiddenField( self.name, self._get_value() ) + def from_html( self, value=None, trans=None, context={} ): + return self._get_value() + + def _get_value( self ): return url_for( self.value, qualified=True ) + def to_dict( self, trans, view='collection', value_mapper=None, other_values={} ): + d = super( BaseURLToolParameter, self ).to_dict( trans ) + d[ 'value' ] = self._get_value() + return d + DEFAULT_VALUE_MAP = lambda x: x diff --git a/scripts/bootstrap_history.py b/scripts/bootstrap_history.py new file mode 100644 index 00000000000..53ffe963b0f --- /dev/null +++ b/scripts/bootstrap_history.py @@ -0,0 +1,90 @@ +#!/usr/bin/env python +# Little script to make HISTORY.rst more easy to format properly, lots TODO +# pull message down and embed, use arg parse, handle multiple, etc... +import os +import sys +try: + import requests +except ImportError: + requests = None +import urlparse +import textwrap + + +PROJECT_DIRECTORY = os.path.join(os.path.dirname(__file__), "..") +PROJECT_OWNER = "galaxyproject" +PROJECT_NAME = "galaxy" +PROJECT_URL = "https://github.com/%s/%s" % (PROJECT_OWNER, PROJECT_NAME) +PROJECT_API = "https://api.github.com/repos/%s/%s/" % (PROJECT_OWNER, PROJECT_NAME) + + +def main(argv): + releases_path = os.path.join(PROJECT_DIRECTORY, "doc", "source", "releases") + newest_release = sorted(os.listdir(releases_path))[-1] + history_path = os.path.join(releases_path, newest_release) + history = open(history_path, "r").read().decode("utf-8") + + def extend(from_str, line): + from_str += "\n" + return history.replace(from_str, from_str + line + "\n" ) + + ident = argv[1] + + message = "" + if len(argv) > 2: + message = argv[2] + elif not (ident.startswith("pr") or ident.startswith("issue")): + api_url = urlparse.urljoin(PROJECT_API, "commits/%s" % ident) + req = requests.get(api_url).json() + commit = req["commit"] + message = commit["message"] + message = get_first_sentence(message) + elif requests is not None and ident.startswith("pr"): + pull_request = ident[len("pr"):] + api_url = urlparse.urljoin(PROJECT_API, "pulls/%s" % pull_request) + req = requests.get(api_url).json() + message = req["title"] + elif requests is not None and ident.startswith("issue"): + issue = ident[len("issue"):] + api_url = urlparse.urljoin(PROJECT_API, "issues/%s" % pull_request) + req = requests.get(api_url).json() + message = req["title"] + else: + message = "" + + to_doc = message + " " + + if ident.startswith("pr"): + pull_request = ident[len("pr"):] + text = ".. _Pull Request {0}: {1}/pull/{0}".format(pull_request, PROJECT_URL) + history = extend(".. github_links", text) + to_doc += "`Pull Request {0}`_".format(pull_request) + elif ident.startswith("issue"): + issue = ident[len("issue"):] + text = ".. _Issue {0}: {1}/issues/{0}".format(issue, PROJECT_URL) + history = extend(".. github_links", text) + to_doc += "`Issue {0}`_".format(issue) + else: + short_rev = ident[:7] + text = ".. _{0}: {1}/commit/{0}".format(short_rev, PROJECT_URL) + history = extend(".. github_links", text) + to_doc += "{0}_".format(short_rev) + + to_doc = wrap(to_doc) + history = extend(".. to_doc", to_doc) + open(history_path, "w").write(history.encode("utf-8")) + + +def get_first_sentence(message): + first_line = message.split("\n")[0] + return first_line + + +def wrap(message): + wrapper = textwrap.TextWrapper(initial_indent="* ") + wrapper.subsequent_indent = ' ' + wrapper.width = 78 + return "\n".join(wrapper.wrap(message)) + +if __name__ == "__main__": + main(sys.argv) diff --git a/static/maps/utils/utils.js.map b/static/maps/utils/utils.js.map index b1ed897ee02..d84a0f42923 100644 --- a/static/maps/utils/utils.js.map +++ b/static/maps/utils/utils.js.map @@ -1 +1 @@ -{"version":3,"file":"utils.js","sources":["../../src/utils/utils.js"],"names":["define","_","deepeach","dict","callback","i","d","sanitize","content","$","text","html","validate","value","Array","length","undefined","indexOf","textify","lst","toString","replace","pos","lastIndexOf","substr","get","options","top","__utils__get__","cache","url","success","console","debug","request","data","response","error","ajaxConfig","contentType","type","param","dataType","JSON","stringify","ajax","done","jQuery","parseJSON","e","fail","response_text","responseText","cssGetAttribute","classname","name","el","appendTo","css","remove","cssLoadFile","galaxy_config","root","merge","optionsDefault","defaults","bytesToString","size","normal_font","unit","rounded","Math","round","uid","__utils__uid__","time","Date","hours","getHours","minutes","getMinutes","datetime","getDate","getMonth","getFullYear"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"utils.js","sources":["../../src/utils/utils.js"],"names":["define","_","deepeach","dict","callback","i","d","sanitize","content","$","text","html","validate","value","Array","length","undefined","indexOf","textify","lst","toString","replace","pos","lastIndexOf","substr","get","options","top","__utils__get__","cache","url","success","console","debug","request","data","response","error","ajaxConfig","contentType","type","param","dataType","JSON","stringify","ajax","done","jQuery","parseJSON","e","fail","response_text","responseText","cssGetAttribute","classname","name","el","appendTo","css","remove","cssLoadFile","galaxy_config","root","merge","optionsDefault","defaults","bytesToString","size","normal_font","unit","rounded","Math","round","uid","__utils__uid__","time","Date","hours","getHours","minutes","getMinutes","datetime","getDate","getMonth","getFullYear"],"mappings":"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"} \ No newline at end of file diff --git a/static/scripts/utils/utils.js b/static/scripts/utils/utils.js index d3d7397d897..e1c565c4f15 100644 --- a/static/scripts/utils/utils.js +++ b/static/scripts/utils/utils.js @@ -1,2 +1,2 @@ -define(["libs/underscore"],function(a){function b(a,c){for(var d in a){var e=a[d];e&&"object"==typeof e&&(c(e),b(e,c))}}function c(a){return $("
").text(a).html()}function d(a){if(a instanceof Array||(a=[a]),0===a.length)return!1;for(var b in a)if(["__null__","__undefined__","None",null,void 0].indexOf(a[b])>-1)return!1;return!0}function e(a){var a=a.toString();if(a){a=a.replace(/,/g,", ");var b=a.lastIndexOf(", ");return-1!=b&&(a=a.substr(0,b)+" or "+a.substr(b+1)),a}return""}function f(a){top.__utils__get__=top.__utils__get__||{},a.cache&&top.__utils__get__[a.url]?(a.success&&a.success(top.__utils__get__[a.url]),console.debug("utils.js::get() - Fetching from cache ["+a.url+"].")):g({url:a.url,data:a.data,success:function(b){top.__utils__get__[a.url]=b,a.success&&a.success(b)},error:function(b){a.error&&a.error(b)}})}function g(a){var b={contentType:"application/json",type:a.type||"GET",data:a.data||{},url:a.url};"GET"==b.type||"DELETE"==b.type?(b.url+=-1==b.url.indexOf("?")?"?":"&",b.url=b.url+$.param(b.data,!0),b.data=null):(b.dataType="json",b.url=b.url,b.data=JSON.stringify(b.data)),$.ajax(b).done(function(b){if("string"==typeof b)try{b=b.replace("Infinity,",'"Infinity",'),b=jQuery.parseJSON(b)}catch(c){console.debug(c)}a.success&&a.success(b)}).fail(function(b){var c=null;try{c=jQuery.parseJSON(b.responseText)}catch(d){c=b.responseText}a.error&&a.error(c,b)})}function h(a,b){var c=$('
');c.appendTo(":eq(0)");var d=c.css(b);return c.remove(),d}function i(a){$('link[href^="'+a+'"]').length||$('').appendTo("head")}function j(b,c){return b?a.defaults(b,c):c}function k(a,b){var c="";if(a>=1e11)a/=1e11,c="TB";else if(a>=1e8)a/=1e8,c="GB";else if(a>=1e5)a/=1e5,c="MB";else if(a>=100)a/=100,c="KB";else{if(!(a>0))return"-";a=10*a,c="b"}var d=Math.round(a)/10;return b?d+" "+c:""+d+" "+c}function l(){return top.__utils__uid__=top.__utils__uid__||0,"uid-"+top.__utils__uid__++}function m(){var a=new Date,b=(a.getHours()<10?"0":"")+a.getHours(),c=(a.getMinutes()<10?"0":"")+a.getMinutes(),d=a.getDate()+"/"+(a.getMonth()+1)+"/"+a.getFullYear()+", "+b+":"+c;return d}return{cssLoadFile:i,cssGetAttribute:h,get:f,merge:j,bytesToString:k,uid:l,time:m,request:g,sanitize:c,textify:e,validate:d,deepeach:b}}); +define(["libs/underscore"],function(a){function b(a,c){for(var d in a){var e=a[d];e&&"object"==typeof e&&(c(e),b(e,c))}}function c(a){return $("
").text(a).html()}function d(a){if(a instanceof Array||(a=[a]),0===a.length)return!1;for(var b in a)if(["__null__","__undefined__",null,void 0].indexOf(a[b])>-1)return!1;return!0}function e(a){var a=a.toString();if(a){a=a.replace(/,/g,", ");var b=a.lastIndexOf(", ");return-1!=b&&(a=a.substr(0,b)+" or "+a.substr(b+1)),a}return""}function f(a){top.__utils__get__=top.__utils__get__||{},a.cache&&top.__utils__get__[a.url]?(a.success&&a.success(top.__utils__get__[a.url]),console.debug("utils.js::get() - Fetching from cache ["+a.url+"].")):g({url:a.url,data:a.data,success:function(b){top.__utils__get__[a.url]=b,a.success&&a.success(b)},error:function(b){a.error&&a.error(b)}})}function g(a){var b={contentType:"application/json",type:a.type||"GET",data:a.data||{},url:a.url};"GET"==b.type||"DELETE"==b.type?(b.url+=-1==b.url.indexOf("?")?"?":"&",b.url=b.url+$.param(b.data,!0),b.data=null):(b.dataType="json",b.url=b.url,b.data=JSON.stringify(b.data)),$.ajax(b).done(function(b){if("string"==typeof b)try{b=b.replace("Infinity,",'"Infinity",'),b=jQuery.parseJSON(b)}catch(c){console.debug(c)}a.success&&a.success(b)}).fail(function(b){var c=null;try{c=jQuery.parseJSON(b.responseText)}catch(d){c=b.responseText}a.error&&a.error(c,b)})}function h(a,b){var c=$('
');c.appendTo(":eq(0)");var d=c.css(b);return c.remove(),d}function i(a){$('link[href^="'+a+'"]').length||$('').appendTo("head")}function j(b,c){return b?a.defaults(b,c):c}function k(a,b){var c="";if(a>=1e11)a/=1e11,c="TB";else if(a>=1e8)a/=1e8,c="GB";else if(a>=1e5)a/=1e5,c="MB";else if(a>=100)a/=100,c="KB";else{if(!(a>0))return"-";a=10*a,c="b"}var d=Math.round(a)/10;return b?d+" "+c:""+d+" "+c}function l(){return top.__utils__uid__=top.__utils__uid__||0,"uid-"+top.__utils__uid__++}function m(){var a=new Date,b=(a.getHours()<10?"0":"")+a.getHours(),c=(a.getMinutes()<10?"0":"")+a.getMinutes(),d=a.getDate()+"/"+(a.getMonth()+1)+"/"+a.getFullYear()+", "+b+":"+c;return d}return{cssLoadFile:i,cssGetAttribute:h,get:f,merge:j,bytesToString:k,uid:l,time:m,request:g,sanitize:c,textify:e,validate:d,deepeach:b}}); //# sourceMappingURL=../../maps/utils/utils.js.map \ No newline at end of file diff --git a/templates/webapps/galaxy/workflow/run.mako b/templates/webapps/galaxy/workflow/run.mako index 8d780be2f94..4e60faad487 100644 --- a/templates/webapps/galaxy/workflow/run.mako +++ b/templates/webapps/galaxy/workflow/run.mako @@ -583,9 +583,10 @@ if wf_parms: <% pja_ss_all = [] for pja_ss in [ActionBox.get_short_str(pja) for pja in step.post_job_actions]: - pja_ss = h.escape( pja_ss ) for rematch in re.findall('\$\{.+?\}', pja_ss): - pja_ss = pja_ss.replace(rematch, '%s' % (wf_parms[rematch[2:-1]], rematch[2:-1], rematch[2:-1])) + pja_ss = pja_ss.replace(rematch, '%s' % (wf_parms[rematch[2:-1]], + rematch[2:-1], + rematch[2:-1])) pja_ss_all.append(pja_ss) %> ${'
'.join(pja_ss_all)} diff --git a/test/base/twilltestcase.py b/test/base/twilltestcase.py index 32983f024ef..bced8471ffa 100644 --- a/test/base/twilltestcase.py +++ b/test/base/twilltestcase.py @@ -1516,7 +1516,7 @@ class TwillTestCase( unittest.TestCase ): # HACK: don't use panels because late_javascripts() messes up the twill browser and it # can't find form fields (and hence user can't be logged in). self.visit_url( "/user/login?use_panels=False" ) - self.submit_form( 'login', 'login_button', email=email, redirect=redirect, password=password ) + self.submit_form( 'login', 'login_button', login=email, redirect=redirect, password=password ) def logout( self ): self.visit_url( "%s/user/logout" % self.url ) diff --git a/test/tool_shed/base/twilltestcase.py b/test/tool_shed/base/twilltestcase.py index 9138212692d..3b77a38d924 100644 --- a/test/tool_shed/base/twilltestcase.py +++ b/test/tool_shed/base/twilltestcase.py @@ -539,6 +539,12 @@ class ShedTwillTestCase( TwillTestCase ): string = string.replace( character, replacement ) return string + def expect_repo_created_strings( self, name ): + return [ + 'Repository %s' % name, + 'Repository %s has been created' % name, + ] + def export_capsule( self, repository ): url = '/repository/export?repository_id=%s&changeset_revision=%s' % \ ( self.security.encode_id( repository.id ), self.get_repository_tip( repository ) ) @@ -573,7 +579,7 @@ class ShedTwillTestCase( TwillTestCase ): self.create_user_in_galaxy( email=email, password=password, username=username, redirect=redirect ) if previously_created: self.visit_galaxy_url( "/user/login?use_panels=False" ) - self.submit_form( '1', 'login_button', email=email, redirect=redirect, password=password ) + self.submit_form( '1', 'login_button', login=email, redirect=redirect, password=password ) def galaxy_logout( self ): self.visit_galaxy_url( "/user/logout" ) diff --git a/test/tool_shed/functional/test_0000_basic_repository_features.py b/test/tool_shed/functional/test_0000_basic_repository_features.py index 036e3232335..072c0d89237 100644 --- a/test/tool_shed/functional/test_0000_basic_repository_features.py +++ b/test/tool_shed/functional/test_0000_basic_repository_features.py @@ -42,8 +42,7 @@ class TestBasicRepositoryFeatures( ShedTwillTestCase ): self.logout() self.login( email=common.test_user_1_email, username=common.test_user_1_name ) category = self.test_db_util.get_category_by_name( 'Test 0000 Basic Repository Features 1' ) - strings_displayed = [ 'Repository %s' % "'%s'" % repository_name, - 'Repository %s has been created' % "%s" % repository_name ] + strings_displayed = self.expect_repo_created_strings(repository_name) self.get_or_create_repository( name=repository_name, description=repository_description, long_description=repository_long_description, diff --git a/test/tool_shed/functional/test_0120_simple_repository_dependency_multiple_owners.py b/test/tool_shed/functional/test_0120_simple_repository_dependency_multiple_owners.py index f092c439031..abf7c21aa70 100644 --- a/test/tool_shed/functional/test_0120_simple_repository_dependency_multiple_owners.py +++ b/test/tool_shed/functional/test_0120_simple_repository_dependency_multiple_owners.py @@ -54,8 +54,7 @@ class TestRepositoryMultipleOwners( ShedTwillTestCase ): category = self.create_category( name='Test 0120', description='Description of test 0120' ) self.logout() self.login( email=common.test_user_2_email, username=common.test_user_2_name ) - strings_displayed = [ 'Repository %s' % "'%s'" % datatypes_repository_name, - 'Repository %s has been created' % "%s" % datatypes_repository_name ] + strings_displayed = self.expect_repo_created_strings(datatypes_repository_name) repository = self.get_or_create_repository( name=datatypes_repository_name, description=datatypes_repository_description, long_description=datatypes_repository_long_description, @@ -94,8 +93,7 @@ class TestRepositoryMultipleOwners( ShedTwillTestCase ): category = self.create_category( name='Test 0120', description='Description of test 0120' ) self.logout() self.login( email=common.test_user_1_email, username=common.test_user_1_name ) - strings_displayed = [ 'Repository %s' % "'%s'" % tool_repository_name, - 'Repository %s has been created' % "%s" % tool_repository_name ] + strings_displayed = self.expect_repo_created_strings(tool_repository_name) repository = self.get_or_create_repository( name=tool_repository_name, description=tool_repository_description, long_description=tool_repository_long_description, diff --git a/test/tool_shed/functional/test_0400_repository_component_reviews.py b/test/tool_shed/functional/test_0400_repository_component_reviews.py index 08ba29b9679..b91a534d18d 100644 --- a/test/tool_shed/functional/test_0400_repository_component_reviews.py +++ b/test/tool_shed/functional/test_0400_repository_component_reviews.py @@ -91,8 +91,7 @@ class TestRepositoryComponentReviews( ShedTwillTestCase ): category = self.create_category( name='Test 0400 Repository Component Reviews', description='Test 0400 Repository Component Reviews' ) self.logout() self.login( email=common.test_user_1_email, username=common.test_user_1_name ) - strings_displayed = [ 'Repository %s' % "'%s'" % repository_name, - 'Repository %s has been created' % "%s" % repository_name ] + strings_displayed = self.expect_repo_created_strings(repository_name) repository = self.get_or_create_repository( name=repository_name, description=repository_description, long_description=repository_long_description, diff --git a/test/tool_shed/functional/test_0410_repository_component_review_access_control.py b/test/tool_shed/functional/test_0410_repository_component_review_access_control.py index 68701a59e5b..4369c70313a 100644 --- a/test/tool_shed/functional/test_0410_repository_component_review_access_control.py +++ b/test/tool_shed/functional/test_0410_repository_component_review_access_control.py @@ -70,8 +70,7 @@ class TestRepositoryComponentReviews( ShedTwillTestCase ): category = self.create_category( name='Test 0400 Repository Component Reviews', description='Test 0400 Repository Component Reviews' ) self.logout() self.login( email=common.test_user_1_email, username=common.test_user_1_name ) - strings_displayed = [ 'Repository %s' % "'%s'" % repository_name, - 'Repository %s has been created' % "%s" % repository_name ] + strings_displayed = self.expect_repo_created_strings(repository_name) repository = self.get_or_create_repository( name=repository_name, description=repository_description, long_description=repository_long_description, diff --git a/test/tool_shed/functional/test_0420_citable_urls_for_repositories.py b/test/tool_shed/functional/test_0420_citable_urls_for_repositories.py index 4c4e0709167..df2efa15755 100644 --- a/test/tool_shed/functional/test_0420_citable_urls_for_repositories.py +++ b/test/tool_shed/functional/test_0420_citable_urls_for_repositories.py @@ -53,8 +53,7 @@ class TestRepositoryCitableURLs( ShedTwillTestCase ): description='Test 0400 Repository Citable URLs category' ) self.logout() self.login( email=common.test_user_1_email, username=common.test_user_1_name ) - strings_displayed = [ 'Repository %s' % "'%s'" % repository_name, - 'Repository %s has been created' % "%s" % repository_name ] + strings_displayed = self.expect_repo_created_strings(repository_name) repository = self.get_or_create_repository( name=repository_name, description=repository_description, long_description=repository_long_description, @@ -128,7 +127,7 @@ class TestRepositoryCitableURLs( ShedTwillTestCase ): strings_displayed = [ '/repository', 'view_repository', 'id=', encoded_repository_id ] strings_displayed_in_iframe = [ 'user1', 'filtering_0420', 'Galaxy filtering tool for test 0420' ] strings_displayed_in_iframe.append( self.get_repository_tip( repository ) ) - strings_displayed_in_iframe.append( 'Sharable link to this repository:' ) + strings_displayed_in_iframe.append( 'Link to this repository:' ) strings_displayed_in_iframe.append( '%s/view/user1/filtering_0420' % self.url ) self.load_citable_url( username='user1', repository_name='filtering_0420', @@ -154,7 +153,7 @@ class TestRepositoryCitableURLs( ShedTwillTestCase ): # The iframe should point to /repository/view_repository?id= strings_displayed = [ '/repository', 'view_repository', 'id=' + encoded_repository_id ] strings_displayed_in_iframe = [ 'user1', 'filtering_0420', 'Galaxy filtering tool for test 0420', first_changeset_hash ] - strings_displayed_in_iframe.append( 'Sharable link to this repository revision:' ) + strings_displayed_in_iframe.append( 'Link to this repository revision:' ) strings_displayed_in_iframe.append( '%s/view/user1/filtering_0420/%s' % ( self.url, first_changeset_hash ) ) strings_not_displayed_in_iframe = [] self.load_citable_url( username='user1', @@ -179,7 +178,7 @@ class TestRepositoryCitableURLs( ShedTwillTestCase ): strings_displayed = [ '/repository', 'view_repository', 'id=' + encoded_repository_id ] strings_displayed.extend( [ 'The+change+log', 'does+not+include+revision', invalid_changeset_hash, 'status=error' ] ) strings_displayed_in_iframe = [ 'user1', 'filtering_0420', 'Galaxy filtering tool for test 0420' ] - strings_displayed_in_iframe.append( 'Sharable link to this repository revision:' ) + strings_displayed_in_iframe.append( 'Link to this repository revision:' ) strings_displayed_in_iframe.append( '%s/view/user1/filtering_0420/%s' % ( self.url, invalid_changeset_hash ) ) strings_not_displayed_in_iframe = [] self.load_citable_url( username='user1', diff --git a/test/tool_shed/functional/test_0430_browse_utilities.py b/test/tool_shed/functional/test_0430_browse_utilities.py index d5ce96e037f..1c26668dcd3 100644 --- a/test/tool_shed/functional/test_0430_browse_utilities.py +++ b/test/tool_shed/functional/test_0430_browse_utilities.py @@ -54,8 +54,7 @@ class TestToolShedBrowseUtilities( ShedTwillTestCase ): description='Description of Test 0430 Galaxy Utilities category' ) self.logout() self.login( email=common.test_user_1_email, username=common.test_user_1_name ) - strings_displayed = [ 'Repository %s' % "'%s'" % datatypes_repository_name, - 'Repository %s has been created' % "%s" % datatypes_repository_name ] + strings_displayed = self.expect_repo_created_strings(datatypes_repository_name) repository = self.get_or_create_repository( name=datatypes_repository_name, description=datatypes_repository_description, long_description=datatypes_repository_long_description, @@ -82,8 +81,7 @@ class TestToolShedBrowseUtilities( ShedTwillTestCase ): description='Description of Test 0430 Galaxy Utilities category' ) self.logout() self.login( email=common.test_user_1_email, username=common.test_user_1_name ) - strings_displayed = [ 'Repository %s' % "'%s'" % emboss_repository_name, - 'Repository %s has been created' % "%s" % emboss_repository_name ] + strings_displayed = self.expect_repo_created_strings(emboss_repository_name) emboss_repository = self.get_or_create_repository( name=emboss_repository_name, description=emboss_repository_description, long_description=emboss_repository_long_description, @@ -119,8 +117,7 @@ class TestToolShedBrowseUtilities( ShedTwillTestCase ): description='Description of Test 0430 Galaxy Utilities category' ) self.logout() self.login( email=common.test_user_1_email, username=common.test_user_1_name ) - strings_displayed = [ 'Repository %s' % "'%s'" % freebayes_repository_name, - 'Repository %s has been created' % "%s" % freebayes_repository_name ] + strings_displayed = self.expect_repo_created_strings(freebayes_repository_name) repository = self.get_or_create_repository( name=freebayes_repository_name, description=freebayes_repository_description, long_description=freebayes_repository_long_description, diff --git a/test/tool_shed/functional/test_0450_skip_tool_tests.py b/test/tool_shed/functional/test_0450_skip_tool_tests.py index a5d60e6f9f1..ceb3f3821e8 100644 --- a/test/tool_shed/functional/test_0450_skip_tool_tests.py +++ b/test/tool_shed/functional/test_0450_skip_tool_tests.py @@ -75,8 +75,7 @@ class TestSkipToolTestFeature( ShedTwillTestCase ): self.logout() self.login( email=common.test_user_1_email, username=common.test_user_1_name ) category = self.test_db_util.get_category_by_name( category_name ) - strings_displayed = [ 'Repository %s' % "'%s'" % repository_name, - 'Repository %s has been created' % "%s" % repository_name ] + strings_displayed = self.expect_repo_created_strings(repository_name) repository = self.get_or_create_repository( name=repository_name, description=repository_description, long_description=repository_long_description, diff --git a/test/tool_shed/functional/test_1120_simple_repository_dependency_multiple_owners.py b/test/tool_shed/functional/test_1120_simple_repository_dependency_multiple_owners.py index 5eb19662bce..15167026c2c 100644 --- a/test/tool_shed/functional/test_1120_simple_repository_dependency_multiple_owners.py +++ b/test/tool_shed/functional/test_1120_simple_repository_dependency_multiple_owners.py @@ -57,8 +57,7 @@ class TestInstallRepositoryMultipleOwners( ShedTwillTestCase ): category = self.create_category( name='Test 0120', description='Description of test 0120' ) self.logout() self.login( email=common.test_user_2_email, username=common.test_user_2_name ) - strings_displayed = [ 'Repository %s' % "'%s'" % datatypes_repository_name, - 'Repository %s has been created' % "%s" % datatypes_repository_name ] + strings_displayed = self.expect_repo_created_strings(datatypes_repository_name) repository = self.get_or_create_repository( name=datatypes_repository_name, description=datatypes_repository_description, long_description=datatypes_repository_long_description, @@ -99,8 +98,7 @@ class TestInstallRepositoryMultipleOwners( ShedTwillTestCase ): category = self.create_category( name='Test 0120', description='Description of test 0120' ) self.logout() self.login( email=common.test_user_1_email, username=common.test_user_1_name ) - strings_displayed = [ 'Repository %s' % "'%s'" % tool_repository_name, - 'Repository %s has been created' % "%s" % tool_repository_name ] + strings_displayed = self.expect_repo_created_strings(tool_repository_name) repository = self.get_or_create_repository( name=tool_repository_name, description=tool_repository_description, long_description=tool_repository_long_description, diff --git a/test/unit/managers/test_HistoryManager.py b/test/unit/managers/test_HistoryManager.py index c55c25e4f0e..7b3a1818c6f 100644 --- a/test/unit/managers/test_HistoryManager.py +++ b/test/unit/managers/test_HistoryManager.py @@ -441,6 +441,78 @@ class HistorySerializerTestCase( BaseTestCase ): self.log( 'serialized should jsonify well' ) self.assertIsJsonifyable( serialized ) + def _history_state_from_states_and_deleted( self, user, hda_state_and_deleted_tuples ): + history = self.history_manager.create( name='name', user=user ) + for state, deleted in hda_state_and_deleted_tuples: + hda = self.hda_manager.create( history=history ) + hda = self.hda_manager.update( hda, dict( state=state, deleted=deleted ) ) + history_state = self.history_serializer.serialize( history, [ 'state' ] )[ 'state' ] + return history_state + + def test_state( self ): + dataset_states = model.Dataset.states + user2 = self.user_manager.create( **user2_data ) + + ready_states = [ ( state, False ) for state in [ dataset_states.OK, dataset_states.OK ] ] + + self.log( 'a history\'s serialized state should be running if any of its datasets are running' ) + self.assertEqual( 'running', self._history_state_from_states_and_deleted( user2, + ready_states + [( dataset_states.RUNNING, False )] )) + self.assertEqual( 'running', self._history_state_from_states_and_deleted( user2, + ready_states + [( dataset_states.SETTING_METADATA, False )] )) + self.assertEqual( 'running', self._history_state_from_states_and_deleted( user2, + ready_states + [( dataset_states.UPLOAD, False )] )) + + self.log( 'a history\'s serialized state should be queued if any of its datasets are queued' ) + self.assertEqual( 'queued', self._history_state_from_states_and_deleted( user2, + ready_states + [( dataset_states.QUEUED, False )] )) + + self.log( 'a history\'s serialized state should be error if any of its datasets are errored' ) + self.assertEqual( 'error', self._history_state_from_states_and_deleted( user2, + ready_states + [( dataset_states.ERROR, False )] )) + self.assertEqual( 'error', self._history_state_from_states_and_deleted( user2, + ready_states + [( dataset_states.FAILED_METADATA, False )] )) + + self.log( 'a history\'s serialized state should be ok if *all* of its datasets are ok' ) + self.assertEqual( 'ok', self._history_state_from_states_and_deleted( user2, ready_states )) + + self.log( 'a history\'s serialized state should be not be affected by deleted datasets' ) + self.assertEqual( 'ok', self._history_state_from_states_and_deleted( user2, + ready_states + [( dataset_states.RUNNING, True )] )) + + def test_contents( self ): + user2 = self.user_manager.create( **user2_data ) + history1 = self.history_manager.create( name='history1', user=user2 ) + + self.log( 'a history with no contents should be properly reflected in empty, etc.' ) + keys = [ 'empty', 'count', 'state_ids', 'state_details', 'state', 'hdas' ] + serialized = self.history_serializer.serialize( history1, keys ) + self.assertEqual( serialized[ 'state' ], 'new' ) + self.assertEqual( serialized[ 'empty' ], True ) + self.assertEqual( serialized[ 'count' ], 0 ) + self.assertEqual( sum( serialized[ 'state_details' ].values() ), 0 ) + self.assertEqual( serialized[ 'state_ids' ][ 'ok' ], [] ) + self.assertIsInstance( serialized[ 'hdas' ], list ) + + self.log( 'a history with contents should be properly reflected in empty, etc.' ) + hda1 = self.hda_manager.create( history=history1, hid=1 ) + self.hda_manager.update( hda1, dict( state='ok' ) ) + + serialized = self.history_serializer.serialize( history1, keys ) + self.assertEqual( serialized[ 'state' ], 'ok' ) + self.assertEqual( serialized[ 'empty' ], False ) + self.assertEqual( serialized[ 'count' ], 1 ) + self.assertEqual( serialized[ 'state_details' ][ 'ok' ], 1 ) + self.assertIsInstance( serialized[ 'state_ids' ][ 'ok' ], list ) + self.assertIsInstance( serialized[ 'hdas' ], list ) + self.assertIsInstance( serialized[ 'hdas' ][0], basestring ) + + serialized = self.history_serializer.serialize( history1, [ 'contents' ] ) + self.assertHasKeys( serialized[ 'contents' ][0], [ 'id', 'name', 'peek', 'create_time' ]) + + self.log( 'serialized should jsonify well' ) + self.assertIsJsonifyable( serialized ) + # # ============================================================================= # class HistoryDeserializerTestCase( BaseTestCase ):