galaxy-commits
Threads by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- 15302 discussions
commit/galaxy-central: jgoecks: Do not try to display non-text datasets in collaboration framework.
by Bitbucket 18 Feb '13
by Bitbucket 18 Feb '13
18 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/131f63d24221/
changeset: 131f63d24221
user: jgoecks
date: 2013-02-18 15:46:35
summary: Do not try to display non-text datasets in collaboration framework.
affected #: 2 files
diff -r 09c81e81952d4768d63fde4840f31958d8e23041 -r 131f63d242216522ffb06cada3684fbf93fe9254 lib/galaxy/web/base/controller.py
--- a/lib/galaxy/web/base/controller.py
+++ b/lib/galaxy/web/base/controller.py
@@ -20,6 +20,7 @@
from galaxy.exceptions import *
from galaxy.model import NoConverterException, ConverterDependencyException
from galaxy.datatypes.interval import ChromatinInteractions
+from galaxy.datatypes.data import Text
from Cheetah.Template import Template
@@ -270,17 +271,22 @@
def get_data( self, dataset, preview=True ):
""" Gets a dataset's data. """
+
# Get data from file, truncating if necessary.
truncated = False
dataset_data = None
if os.path.exists( dataset.file_name ):
- max_peek_size = 1000000 # 1 MB
- if preview and os.stat( dataset.file_name ).st_size > max_peek_size:
- dataset_data = open( dataset.file_name ).read(max_peek_size)
- truncated = True
+ if isinstance( dataset.datatype, Text ):
+ max_peek_size = 1000000 # 1 MB
+ if preview and os.stat( dataset.file_name ).st_size > max_peek_size:
+ dataset_data = open( dataset.file_name ).read(max_peek_size)
+ truncated = True
+ else:
+ dataset_data = open( dataset.file_name ).read(max_peek_size)
+ truncated = False
else:
- dataset_data = open( dataset.file_name ).read(max_peek_size)
- truncated = False
+ # For now, cannot get data from non-text datasets.
+ dataset_data = None
return truncated, dataset_data
def check_dataset_state( self, trans, dataset ):
diff -r 09c81e81952d4768d63fde4840f31958d8e23041 -r 131f63d242216522ffb06cada3684fbf93fe9254 templates/webapps/galaxy/dataset/display.mako
--- a/templates/webapps/galaxy/dataset/display.mako
+++ b/templates/webapps/galaxy/dataset/display.mako
@@ -61,7 +61,7 @@
<%def name="render_item( data, data_to_render )">
## Chunkable data is rendered in JavaScript above; render unchunkable data below.
- %if not data.datatype.CHUNKABLE:
+ %if not data.datatype.CHUNKABLE and data_to_render:
%if truncated:
<div class="warningmessagelarge">
This dataset is large and only the first megabyte is shown below. |
@@ -70,6 +70,8 @@
%endif
## TODO: why is the default font size so small?
<pre style="font-size: 135%">${ data_to_render | h }</pre>
+ %else:
+ <p align='center'>Cannot show dataset content</p>
%endif
</%def>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: jgoecks: Move grid element initialization to main body to prevent it from happening too early. Pack scripts.
by Bitbucket 17 Feb '13
by Bitbucket 17 Feb '13
17 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/09c81e81952d/
changeset: 09c81e81952d
user: jgoecks
date: 2013-02-17 20:59:02
summary: Move grid element initialization to main body to prevent it from happening too early. Pack scripts.
affected #: 4 files
diff -r 40a7ef4efb22afdc6bde4bce4e75d691e4ac7a7f -r 09c81e81952d4768d63fde4840f31958d8e23041 static/scripts/galaxy.grids.js
--- a/static/scripts/galaxy.grids.js
+++ b/static/scripts/galaxy.grids.js
@@ -4,18 +4,6 @@
// not appended to the identifier of a nested array.
jQuery.ajaxSettings.traditional = true;
-// Initialize grid objects on load.
-$(document).ready(function() {
- init_grid_elements();
- init_grid_controls();
-
- // Initialize text filters to select text on click and use normal font when user is typing.
- $('input[type=text]').each(function() {
- $(this).click(function() { $(this).select(); } )
- .keyup(function () { $(this).css("font-style", "normal"); });
- });
-});
-
/**
* A Galaxy grid.
*/
diff -r 40a7ef4efb22afdc6bde4bce4e75d691e4ac7a7f -r 09c81e81952d4768d63fde4840f31958d8e23041 static/scripts/packed/galaxy.grids.js
--- a/static/scripts/packed/galaxy.grids.js
+++ b/static/scripts/packed/galaxy.grids.js
@@ -1,1 +1,1 @@
-jQuery.ajaxSettings.traditional=true;$(document).ready(function(){init_grid_elements();init_grid_controls();$("input[type=text]").each(function(){$(this).click(function(){$(this).select()}).keyup(function(){$(this).css("font-style","normal")})})});var Grid=Backbone.Model.extend({defaults:{url_base:"",async:false,async_ops:[],categorical_filters:[],filters:{},sort_key:null,show_item_checkboxes:false,cur_page:1,num_pages:1,operation:undefined,item_ids:undefined},can_async_op:function(a){return _.indexOf(this.attributes.async_ops,a)!==-1},add_filter:function(e,f,b){if(b){var c=this.attributes.filters[e],a;if(c===null||c===undefined){a=f}else{if(typeof(c)=="string"){if(c=="All"){a=f}else{var d=[];d[0]=c;d[1]=f;a=d}}else{a=c;a.push(f)}}this.attributes.filters[e]=a}else{this.attributes.filters[e]=f}},remove_filter:function(b,e){var a=this.attributes.filters[b];if(a===null||a===undefined){return false}var d=true;if(typeof(a)==="string"){if(a=="All"){d=false}else{delete this.attributes.filters[b]}}else{var c=_.indexOf(a,e);if(c!==-1){a.splice(c,1)}else{d=false}}return d},get_url_data:function(){var a={async:this.attributes.async,sort:this.attributes.sort_key,page:this.attributes.cur_page,show_item_checkboxes:this.attributes.show_item_checkboxes};if(this.attributes.operation){a.operation=this.attributes.operation}if(this.attributes.item_ids){a.id=this.attributes.item_ids}var b=this;_.each(_.keys(b.attributes.filters),function(c){a["f-"+c]=b.attributes.filters[c]});return a}});function init_operation_buttons(){$("input[name=operation]:submit").each(function(){$(this).click(function(){var b=$(this).val();var a=[];$("input[name=id]:checked").each(function(){a.push($(this).val())});do_operation(b,a)})})}function init_grid_controls(){init_operation_buttons();$(".submit-image").each(function(){$(this).mousedown(function(){$(this).addClass("gray-background")});$(this).mouseup(function(){$(this).removeClass("gray-background")})});$(".sort-link").each(function(){$(this).click(function(){set_sort_condition($(this).attr("sort_key"));return false})});$(".page-link > a").each(function(){$(this).click(function(){set_page($(this).attr("page_num"));return false})});$(".categorical-filter > a").each(function(){$(this).click(function(){set_categorical_filter($(this).attr("filter_key"),$(this).attr("filter_val"));return false})});$(".text-filter-form").each(function(){$(this).submit(function(){var d=$(this).attr("column_key");var c=$("#input-"+d+"-filter");var e=c.val();c.val("");add_filter_condition(d,e,true);return false})});var a=$("#input-tags-filter");if(a.length){a.autocomplete(history_tag_autocomplete_url,{selectFirst:false,autoFill:false,highlight:false,mustMatch:false})}var b=$("#input-name-filter");if(b.length){b.autocomplete(history_name_autocomplete_url,{selectFirst:false,autoFill:false,highlight:false,mustMatch:false})}$(".advanced-search-toggle").each(function(){$(this).click(function(){$("#standard-search").slideToggle("fast");$("#advanced-search").slideToggle("fast");return false})})}function init_grid_elements(){$(".grid").each(function(){var b=$(this).find("input.grid-row-select-checkbox");var a=$(this).find("span.grid-selected-count");var c=function(){a.text($(b).filter(":checked").length)};$(b).each(function(){$(this).change(c)});c()});$(".label").each(function(){var a=$(this).attr("href");if(a!==undefined&&a.indexOf("operation=")!=-1){$(this).click(function(){do_operation_from_href($(this).attr("href"));return false})}});$(".community_rating_star").rating({});make_popup_menus()}function go_page_one(){var a=grid.get("cur_page");if(a!==null&&a!==undefined&&a!=="all"){grid.set("cur_page",1)}}function add_filter_condition(c,e,a){if(e===""){return false}grid.add_filter(c,e,a);var d=$("<span>"+e+"<a href='javascript:void(0);'><span class='delete-search-icon' /></a></span>");d.addClass("text-filter-val");d.click(function(){grid.remove_filter(c,e);$(this).remove();go_page_one();update_grid()});var b=$("#"+c+"-filtering-criteria");b.append(d);go_page_one();update_grid()}function add_tag_to_grid_filter(c,b){var a=c+(b!==undefined&&b!==""?":"+b:"");$("#advanced-search").show("fast");add_filter_condition("tags",a,true)}function set_sort_condition(f){var e=grid.get("sort_key");var d=f;if(e.indexOf(f)!==-1){if(e.substring(0,1)!=="-"){d="-"+f}else{}}$(".sort-arrow").remove();var c=(d.substring(0,1)=="-")?"↑":"↓";var a=$("<span>"+c+"</span>").addClass("sort-arrow");var b=$("#"+f+"-header");b.append(a);grid.set("sort_key",d);go_page_one();update_grid()}function set_categorical_filter(b,d){var a=grid.get("categorical_filters")[b],c=grid.get("filters")[b];$("."+b+"-filter").each(function(){var h=$.trim($(this).text());var f=a[h];var g=f[b];if(g==d){$(this).empty();$(this).addClass("current-filter");$(this).append(h)}else{if(g==c){$(this).empty();var e=$("<a href='#'>"+h+"</a>");e.click(function(){set_categorical_filter(b,g)});$(this).removeClass("current-filter");$(this).append(e)}}});grid.add_filter(b,d);go_page_one();update_grid()}function set_page(a){$(".page-link").each(function(){var g=$(this).attr("id"),e=parseInt(g.split("-")[2],10),c=grid.get("cur_page"),f;if(e===a){f=$(this).children().text();$(this).empty();$(this).addClass("inactive-link");$(this).text(f)}else{if(e===c){f=$(this).text();$(this).empty();$(this).removeClass("inactive-link");var d=$("<a href='#'>"+f+"</a>");d.click(function(){set_page(e)});$(this).append(d)}}});var b=true;if(a==="all"){grid.set("cur_page",a);b=false}else{grid.set("cur_page",parseInt(a,10))}update_grid(b)}function do_operation(b,a){b=b.toLowerCase();grid.set({operation:b,item_ids:a});if(grid.can_async_op(b)){update_grid(true)}else{go_to_URL()}}function do_operation_from_href(c){var f=c.split("?");if(f.length>1){var a=f[1];var e=a.split("&");var b=null;var g=-1;for(var d=0;d<e.length;d++){if(e[d].indexOf("operation")!=-1){b=e[d].split("=")[1]}else{if(e[d].indexOf("id")!=-1){g=e[d].split("=")[1]}}}do_operation(b,g);return false}}function go_to_URL(){grid.set("async",false);window.location=grid.get("url_base")+"?"+$.param(grid.get_url_data())}function update_grid(a){if(!grid.get("async")){go_to_URL();return}var b=(grid.get("operation")?"POST":"GET");$(".loading-elt-overlay").show();$.ajax({type:b,url:grid.get("url_base"),data:grid.get_url_data(),error:function(){alert("Grid refresh failed")},success:function(d){var c=d.split("*****");$("#grid-table-body").html(c[0]);$("#grid-table-footer").html(c[1]);$("#grid-table-body").trigger("update");init_grid_elements();init_operation_buttons();make_popup_menus();$(".loading-elt-overlay").hide();var e=$.trim(c[2]);if(e!==""){$("#grid-message").html(e).show();setTimeout(function(){$("#grid-message").hide()},5000)}},complete:function(){grid.set({operation:undefined,item_ids:undefined})}})}function check_all_items(){var a=document.getElementById("check_all"),b=document.getElementsByTagName("input"),d=0,c;if(a.checked===true){for(c=0;c<b.length;c++){if(b[c].name.indexOf("id")!==-1){b[c].checked=true;d++}}}else{for(c=0;c<b.length;c++){if(b[c].name.indexOf("id")!==-1){b[c].checked=false}}}init_grid_elements()};
\ No newline at end of file
+jQuery.ajaxSettings.traditional=true;var Grid=Backbone.Model.extend({defaults:{url_base:"",async:false,async_ops:[],categorical_filters:[],filters:{},sort_key:null,show_item_checkboxes:false,cur_page:1,num_pages:1,operation:undefined,item_ids:undefined},can_async_op:function(a){return _.indexOf(this.attributes.async_ops,a)!==-1},add_filter:function(e,f,b){if(b){var c=this.attributes.filters[e],a;if(c===null||c===undefined){a=f}else{if(typeof(c)=="string"){if(c=="All"){a=f}else{var d=[];d[0]=c;d[1]=f;a=d}}else{a=c;a.push(f)}}this.attributes.filters[e]=a}else{this.attributes.filters[e]=f}},remove_filter:function(b,e){var a=this.attributes.filters[b];if(a===null||a===undefined){return false}var d=true;if(typeof(a)==="string"){if(a=="All"){d=false}else{delete this.attributes.filters[b]}}else{var c=_.indexOf(a,e);if(c!==-1){a.splice(c,1)}else{d=false}}return d},get_url_data:function(){var a={async:this.attributes.async,sort:this.attributes.sort_key,page:this.attributes.cur_page,show_item_checkboxes:this.attributes.show_item_checkboxes};if(this.attributes.operation){a.operation=this.attributes.operation}if(this.attributes.item_ids){a.id=this.attributes.item_ids}var b=this;_.each(_.keys(b.attributes.filters),function(c){a["f-"+c]=b.attributes.filters[c]});return a}});function init_operation_buttons(){$("input[name=operation]:submit").each(function(){$(this).click(function(){var b=$(this).val();var a=[];$("input[name=id]:checked").each(function(){a.push($(this).val())});do_operation(b,a)})})}function init_grid_controls(){init_operation_buttons();$(".submit-image").each(function(){$(this).mousedown(function(){$(this).addClass("gray-background")});$(this).mouseup(function(){$(this).removeClass("gray-background")})});$(".sort-link").each(function(){$(this).click(function(){set_sort_condition($(this).attr("sort_key"));return false})});$(".page-link > a").each(function(){$(this).click(function(){set_page($(this).attr("page_num"));return false})});$(".categorical-filter > a").each(function(){$(this).click(function(){set_categorical_filter($(this).attr("filter_key"),$(this).attr("filter_val"));return false})});$(".text-filter-form").each(function(){$(this).submit(function(){var d=$(this).attr("column_key");var c=$("#input-"+d+"-filter");var e=c.val();c.val("");add_filter_condition(d,e,true);return false})});var a=$("#input-tags-filter");if(a.length){a.autocomplete(history_tag_autocomplete_url,{selectFirst:false,autoFill:false,highlight:false,mustMatch:false})}var b=$("#input-name-filter");if(b.length){b.autocomplete(history_name_autocomplete_url,{selectFirst:false,autoFill:false,highlight:false,mustMatch:false})}$(".advanced-search-toggle").each(function(){$(this).click(function(){$("#standard-search").slideToggle("fast");$("#advanced-search").slideToggle("fast");return false})})}function init_grid_elements(){$(".grid").each(function(){var b=$(this).find("input.grid-row-select-checkbox");var a=$(this).find("span.grid-selected-count");var c=function(){a.text($(b).filter(":checked").length)};$(b).each(function(){$(this).change(c)});c()});$(".label").each(function(){var a=$(this).attr("href");if(a!==undefined&&a.indexOf("operation=")!=-1){$(this).click(function(){do_operation_from_href($(this).attr("href"));return false})}});$(".community_rating_star").rating({});make_popup_menus()}function go_page_one(){var a=grid.get("cur_page");if(a!==null&&a!==undefined&&a!=="all"){grid.set("cur_page",1)}}function add_filter_condition(c,e,a){if(e===""){return false}grid.add_filter(c,e,a);var d=$("<span>"+e+"<a href='javascript:void(0);'><span class='delete-search-icon' /></a></span>");d.addClass("text-filter-val");d.click(function(){grid.remove_filter(c,e);$(this).remove();go_page_one();update_grid()});var b=$("#"+c+"-filtering-criteria");b.append(d);go_page_one();update_grid()}function add_tag_to_grid_filter(c,b){var a=c+(b!==undefined&&b!==""?":"+b:"");$("#advanced-search").show("fast");add_filter_condition("tags",a,true)}function set_sort_condition(f){var e=grid.get("sort_key");var d=f;if(e.indexOf(f)!==-1){if(e.substring(0,1)!=="-"){d="-"+f}else{}}$(".sort-arrow").remove();var c=(d.substring(0,1)=="-")?"↑":"↓";var a=$("<span>"+c+"</span>").addClass("sort-arrow");var b=$("#"+f+"-header");b.append(a);grid.set("sort_key",d);go_page_one();update_grid()}function set_categorical_filter(b,d){var a=grid.get("categorical_filters")[b],c=grid.get("filters")[b];$("."+b+"-filter").each(function(){var h=$.trim($(this).text());var f=a[h];var g=f[b];if(g==d){$(this).empty();$(this).addClass("current-filter");$(this).append(h)}else{if(g==c){$(this).empty();var e=$("<a href='#'>"+h+"</a>");e.click(function(){set_categorical_filter(b,g)});$(this).removeClass("current-filter");$(this).append(e)}}});grid.add_filter(b,d);go_page_one();update_grid()}function set_page(a){$(".page-link").each(function(){var g=$(this).attr("id"),e=parseInt(g.split("-")[2],10),c=grid.get("cur_page"),f;if(e===a){f=$(this).children().text();$(this).empty();$(this).addClass("inactive-link");$(this).text(f)}else{if(e===c){f=$(this).text();$(this).empty();$(this).removeClass("inactive-link");var d=$("<a href='#'>"+f+"</a>");d.click(function(){set_page(e)});$(this).append(d)}}});var b=true;if(a==="all"){grid.set("cur_page",a);b=false}else{grid.set("cur_page",parseInt(a,10))}update_grid(b)}function do_operation(b,a){b=b.toLowerCase();grid.set({operation:b,item_ids:a});if(grid.can_async_op(b)){update_grid(true)}else{go_to_URL()}}function do_operation_from_href(c){var f=c.split("?");if(f.length>1){var a=f[1];var e=a.split("&");var b=null;var g=-1;for(var d=0;d<e.length;d++){if(e[d].indexOf("operation")!=-1){b=e[d].split("=")[1]}else{if(e[d].indexOf("id")!=-1){g=e[d].split("=")[1]}}}do_operation(b,g);return false}}function go_to_URL(){grid.set("async",false);window.location=grid.get("url_base")+"?"+$.param(grid.get_url_data())}function update_grid(a){if(!grid.get("async")){go_to_URL();return}var b=(grid.get("operation")?"POST":"GET");$(".loading-elt-overlay").show();$.ajax({type:b,url:grid.get("url_base"),data:grid.get_url_data(),error:function(){alert("Grid refresh failed")},success:function(d){var c=d.split("*****");$("#grid-table-body").html(c[0]);$("#grid-table-footer").html(c[1]);$("#grid-table-body").trigger("update");init_grid_elements();init_operation_buttons();make_popup_menus();$(".loading-elt-overlay").hide();var e=$.trim(c[2]);if(e!==""){$("#grid-message").html(e).show();setTimeout(function(){$("#grid-message").hide()},5000)}},complete:function(){grid.set({operation:undefined,item_ids:undefined})}})}function check_all_items(){var a=document.getElementById("check_all"),b=document.getElementsByTagName("input"),d=0,c;if(a.checked===true){for(c=0;c<b.length;c++){if(b[c].name.indexOf("id")!==-1){b[c].checked=true;d++}}}else{for(c=0;c<b.length;c++){if(b[c].name.indexOf("id")!==-1){b[c].checked=false}}}init_grid_elements()};
\ No newline at end of file
diff -r 40a7ef4efb22afdc6bde4bce4e75d691e4ac7a7f -r 09c81e81952d4768d63fde4840f31958d8e23041 static/scripts/packed/viz/visualization.js
--- a/static/scripts/packed/viz/visualization.js
+++ b/static/scripts/packed/viz/visualization.js
@@ -1,1 +1,1 @@
-define(["libs/underscore","mvc/data","viz/trackster/util","utils/config"],function(s,i,l,p){var a=function(u,x,w,v){$.ajax({url:u,data:w,error:function(){alert("Grid failed")},success:function(y){show_modal("Select datasets for new tracks",y,{Cancel:function(){hide_modal()},Add:function(){var z=[];$("input[name=id]:checked,input[name=ldda_ids]:checked").each(function(){var A={data_type:"track_config",hda_ldda:"hda"},B=$(this).val();if($(this).attr("name")!=="id"){A.hda_ldda="ldda"}z[z.length]=$.ajax({url:x+"/"+B,data:A,dataType:"json"})});$.when.apply($,z).then(function(){var A=(arguments[0] instanceof Array?$.map(arguments,function(B){return B[0]}):[arguments[0]]);v(A)});hide_modal()}})}})};var j=function(u){return("isResolved" in u)};var f=function(u){this.default_font=u!==undefined?u:"9px Monaco, Lucida Console, monospace";this.dummy_canvas=this.new_canvas();this.dummy_context=this.dummy_canvas.getContext("2d");this.dummy_context.font=this.default_font;this.char_width_px=this.dummy_context.measureText("A").width;this.patterns={};this.load_pattern("right_strand","/visualization/strand_right.png");this.load_pattern("left_strand","/visualization/strand_left.png");this.load_pattern("right_strand_inv","/visualization/strand_right_inv.png");this.load_pattern("left_strand_inv","/visualization/strand_left_inv.png")};s.extend(f.prototype,{load_pattern:function(u,y){var v=this.patterns,w=this.dummy_context,x=new Image();x.src=galaxy_paths.attributes.image_path+y;x.onload=function(){v[u]=w.createPattern(x,"repeat")}},get_pattern:function(u){return this.patterns[u]},new_canvas:function(){var u=$("<canvas/>")[0];if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(u)}u.manager=this;return u}});var q=Backbone.Model.extend({defaults:{num_elements:20,obj_cache:null,key_ary:null},initialize:function(u){this.clear()},get_elt:function(v){var w=this.attributes.obj_cache,x=this.attributes.key_ary,u=x.indexOf(v);if(u!==-1){if(w[v].stale){x.splice(u,1);delete w[v]}else{this.move_key_to_end(v,u)}}return w[v]},set_elt:function(v,x){var y=this.attributes.obj_cache,z=this.attributes.key_ary,w=this.attributes.num_elements;if(!y[v]){if(z.length>=w){var u=z.shift();delete y[u]}z.push(v)}y[v]=x;return x},move_key_to_end:function(v,u){this.attributes.key_ary.splice(u,1);this.attributes.key_ary.push(v)},clear:function(){this.attributes.obj_cache={};this.attributes.key_ary=[]},size:function(){return this.attributes.key_ary.length}});var d=q.extend({defaults:s.extend({},q.prototype.defaults,{dataset:null,init_data:null,filters_manager:null,data_type:"data",data_mode_compatible:function(u,v){return true},can_subset:function(u){return false}}),initialize:function(u){q.prototype.initialize.call(this);var v=this.get("init_data");if(v){this.add_data(v)}},add_data:function(u){if(this.get("num_elements")<u.length){this.set("num_elements",u.length)}var v=this;s.each(u,function(w){v.set_data(w.region,w)})},data_is_ready:function(){var x=this.get("dataset"),w=$.Deferred(),u=(this.get("data_type")=="raw_data"?"state":this.get("data_type")=="data"?"converted_datasets_state":"error"),v=new l.ServerStateDeferred({ajax_settings:{url:this.get("dataset").url(),data:{hda_ldda:x.get("hda_ldda"),data_type:u},dataType:"json"},interval:5000,success_fn:function(y){return y!=="pending"}});$.when(v.go()).then(function(y){w.resolve(y==="ok"||y==="data")});return w},search_features:function(u){var v=this.get("dataset"),w={query:u,hda_ldda:v.get("hda_ldda"),data_type:"features"};return $.getJSON(v.url(),w)},load_data:function(C,B,v,A){var y=this.get("dataset"),x={data_type:this.get("data_type"),chrom:C.get("chrom"),low:C.get("start"),high:C.get("end"),mode:B,resolution:v,hda_ldda:y.get("hda_ldda")};$.extend(x,A);var E=this.get("filters_manager");if(E){var F=[];var u=E.filters;for(var z=0;z<u.length;z++){F.push(u[z].name)}x.filter_cols=JSON.stringify(F)}var w=this,D=$.getJSON(y.url(),x,function(G){w.set_data(C,G)});this.set_data(C,D);return D},get_data:function(A,z,w,y){var B=this.get_elt(A);if(B&&(j(B)||this.get("data_mode_compatible")(B,z))){return B}var C=this.get("key_ary"),v=this.get("obj_cache"),D,u;for(var x=0;x<C.length;x++){D=C[x];u=new g({from_str:D});if(u.contains(A)){B=v[D];if(j(B)||(this.get("data_mode_compatible")(B,z)&&this.get("can_subset")(B))){this.move_key_to_end(D,x);return B}}}return this.load_data(A,z,w,y)},set_data:function(v,u){this.set_elt(v,u)},DEEP_DATA_REQ:"deep",BROAD_DATA_REQ:"breadth",get_more_data:function(C,B,x,A,y){var E=this._mark_stale(C);if(!(E&&this.get("data_mode_compatible")(E,B))){console.log("ERROR: problem with getting more data: current data is not compatible");return}var w=C.get("start");if(y===this.DEEP_DATA_REQ){$.extend(A,{start_val:E.data.length+1})}else{if(y===this.BROAD_DATA_REQ){w=(E.max_high?E.max_high:E.data[E.data.length-1][2])+1}}var D=C.copy().set("start",w);var v=this,z=this.load_data(D,B,x,A),u=$.Deferred();this.set_data(C,u);$.when(z).then(function(F){if(F.data){F.data=E.data.concat(F.data);if(F.max_low){F.max_low=E.max_low}if(F.message){F.message=F.message.replace(/[0-9]+/,F.data.length)}}v.set_data(C,F);u.resolve(F)});return u},can_get_more_detailed_data:function(v){var u=this.get_elt(v);return(u.dataset_type==="bigwig"&&u.data.length<8000)},get_more_detailed_data:function(x,z,v,y,w){var u=this._mark_stale(x);if(!u){console.log("ERROR getting more detailed data: no current data");return}if(!w){w={}}if(u.dataset_type==="bigwig"){w.num_samples=1000*y}else{if(u.dataset_type==="summary_tree"){w.level=Math.min(u.level-1,2)}}return this.load_data(x,z,v,w)},_mark_stale:function(v){var u=this.get_elt(v);if(!u){console.log("ERROR: no data to mark as stale: ",this.get("dataset"),v.toString())}u.stale=true;return u},get_genome_wide_data:function(u){var w=this,y=true,x=s.map(u.get("chroms_info").chrom_info,function(A){var z=w.get_elt(new g({chrom:A.chrom,start:0,end:A.len}));if(!z){y=false}return z});if(y){return x}var v=$.Deferred();$.getJSON(this.get("dataset").url(),{data_type:"genome_data"},function(z){w.add_data(z.data);v.resolve(z.data)});return v},get_elt:function(u){return q.prototype.get_elt.call(this,u.toString())},set_elt:function(v,u){return q.prototype.set_elt.call(this,v.toString(),u)}});var n=d.extend({initialize:function(u){var v=new Backbone.Model();v.urlRoot=u.data_url;this.set("dataset",v)},load_data:function(w,x,u,v){if(u>1){return{data:null}}return d.prototype.load_data.call(this,w,x,u,v)}});var c=Backbone.Model.extend({defaults:{name:null,key:null,chroms_info:null},initialize:function(u){this.id=u.dbkey},get_chroms_info:function(){return this.attributes.chroms_info.chrom_info},get_chrom_region:function(u){var v=s.find(this.get_chroms_info(),function(w){return w.chrom==u});return new g({chrom:v.chrom,end:v.len})}});var g=Backbone.RelationalModel.extend({defaults:{chrom:null,start:0,end:0},initialize:function(v){if(v.from_str){var x=v.from_str.split(":"),w=x[0],u=x[1].split("-");this.set({chrom:w,start:parseInt(u[0],10),end:parseInt(u[1],10)})}},copy:function(){return new g({chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")})},length:function(){return this.get("end")-this.get("start")},toString:function(){return this.get("chrom")+":"+this.get("start")+"-"+this.get("end")},toJSON:function(){return{chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")}},compute_overlap:function(B){var v=this.get("chrom"),A=B.get("chrom"),z=this.get("start"),x=B.get("start"),y=this.get("end"),w=B.get("end"),u;if(v&&A&&v!==A){return g.overlap_results.DIF_CHROMS}if(z<x){if(y<x){u=g.overlap_results.BEFORE}else{if(y<=w){u=g.overlap_results.OVERLAP_START}else{u=g.overlap_results.CONTAINS}}}else{if(z>w){u=g.overlap_results.AFTER}else{if(y<=w){u=g.overlap_results.CONTAINED_BY}else{u=g.overlap_results.OVERLAP_END}}}return u},contains:function(u){return this.compute_overlap(u)===g.overlap_results.CONTAINS},overlaps:function(u){return s.intersection([this.compute_overlap(u)],[g.overlap_results.DIF_CHROMS,g.overlap_results.BEFORE,g.overlap_results.AFTER]).length===0}},{overlap_results:{DIF_CHROMS:1000,BEFORE:1001,CONTAINS:1002,OVERLAP_START:1003,OVERLAP_END:1004,CONTAINED_BY:1005,AFTER:1006}});var m=Backbone.Collection.extend({model:g});var e=Backbone.RelationalModel.extend({defaults:{region:null,note:""},relations:[{type:Backbone.HasOne,key:"region",relatedModel:g}]});var r=Backbone.Collection.extend({model:e});var t=i.Dataset.extend({initialize:function(u){this.set("id",u.dataset_id);this.set("config",p.ConfigSettingCollection.from_config_dict(u.prefs));this.get("config").add([{key:"name",value:this.get("name")},{key:"color"}]);var v=this.get("preloaded_data");if(v){v=v.data}else{v=[]}this.set("data_manager",new d({dataset:this,init_data:v}))}});var o=Backbone.RelationalModel.extend({defaults:{title:"",type:""},url:galaxy_paths.get("visualization_url"),save:function(){return $.ajax({url:this.url(),type:"POST",dataType:"json",data:{vis_json:JSON.stringify(this)}})}});var k=o.extend({defaults:s.extend({},o.prototype.defaults,{dbkey:"",tracks:null,bookmarks:null,viewport:null}),relations:[{type:Backbone.HasMany,key:"tracks",relatedModel:t}],add_tracks:function(u){this.get("tracks").add(u)}});var b=Backbone.Model.extend({});var h=Backbone.Router.extend({initialize:function(v){this.view=v.view;this.route(/([\w]+)$/,"change_location");this.route(/([\w]+\:[\d,]+-[\d,]+)$/,"change_location");var u=this;u.view.on("navigate",function(w){u.navigate(w)})},change_location:function(u){this.view.go_to(u)}});return{BackboneTrack:t,BrowserBookmark:e,BrowserBookmarkCollection:r,Cache:q,CanvasManager:f,Genome:c,GenomeDataManager:d,GenomeRegion:g,GenomeRegionCollection:m,GenomeVisualization:k,ReferenceTrackDataManager:n,TrackBrowserRouter:h,TrackConfig:b,Visualization:o,select_datasets:a}});
\ No newline at end of file
+define(["libs/underscore","mvc/data","viz/trackster/util","utils/config"],function(s,i,l,p){var a=function(u,x,w,v){$.ajax({url:u,data:w,error:function(){alert("Grid failed")},success:function(y){show_modal("Select datasets for new tracks",y,{Cancel:function(){hide_modal()},Add:function(){var z=[];$("input[name=id]:checked,input[name=ldda_ids]:checked").each(function(){var A={data_type:"track_config",hda_ldda:"hda"},B=$(this).val();if($(this).attr("name")!=="id"){A.hda_ldda="ldda"}z[z.length]=$.ajax({url:x+"/"+B,data:A,dataType:"json"})});$.when.apply($,z).then(function(){var A=(arguments[0] instanceof Array?$.map(arguments,function(B){return B[0]}):[arguments[0]]);v(A)});hide_modal()}})}})};var j=function(u){return("isResolved" in u)};var f=function(u){this.default_font=u!==undefined?u:"9px Monaco, Lucida Console, monospace";this.dummy_canvas=this.new_canvas();this.dummy_context=this.dummy_canvas.getContext("2d");this.dummy_context.font=this.default_font;this.char_width_px=this.dummy_context.measureText("A").width;this.patterns={};this.load_pattern("right_strand","/visualization/strand_right.png");this.load_pattern("left_strand","/visualization/strand_left.png");this.load_pattern("right_strand_inv","/visualization/strand_right_inv.png");this.load_pattern("left_strand_inv","/visualization/strand_left_inv.png")};s.extend(f.prototype,{load_pattern:function(u,y){var v=this.patterns,w=this.dummy_context,x=new Image();x.src=galaxy_paths.attributes.image_path+y;x.onload=function(){v[u]=w.createPattern(x,"repeat")}},get_pattern:function(u){return this.patterns[u]},new_canvas:function(){var u=$("<canvas/>")[0];if(window.G_vmlCanvasManager){G_vmlCanvasManager.initElement(u)}u.manager=this;return u}});var q=Backbone.Model.extend({defaults:{num_elements:20,obj_cache:null,key_ary:null},initialize:function(u){this.clear()},get_elt:function(v){var w=this.attributes.obj_cache,x=this.attributes.key_ary,u=x.indexOf(v);if(u!==-1){if(w[v].stale){x.splice(u,1);delete w[v]}else{this.move_key_to_end(v,u)}}return w[v]},set_elt:function(v,x){var y=this.attributes.obj_cache,z=this.attributes.key_ary,w=this.attributes.num_elements;if(!y[v]){if(z.length>=w){var u=z.shift();delete y[u]}z.push(v)}y[v]=x;return x},move_key_to_end:function(v,u){this.attributes.key_ary.splice(u,1);this.attributes.key_ary.push(v)},clear:function(){this.attributes.obj_cache={};this.attributes.key_ary=[]},size:function(){return this.attributes.key_ary.length}});var d=q.extend({defaults:s.extend({},q.prototype.defaults,{dataset:null,init_data:null,filters_manager:null,data_type:"data",data_mode_compatible:function(u,v){return true},can_subset:function(u){return false}}),initialize:function(u){q.prototype.initialize.call(this);var v=this.get("init_data");if(v){this.add_data(v)}},add_data:function(u){if(this.get("num_elements")<u.length){this.set("num_elements",u.length)}var v=this;s.each(u,function(w){v.set_data(w.region,w)})},data_is_ready:function(){var x=this.get("dataset"),w=$.Deferred(),u=(this.get("data_type")==="raw_data"?"state":this.get("data_type")==="data"?"converted_datasets_state":"error"),v=new l.ServerStateDeferred({ajax_settings:{url:this.get("dataset").url(),data:{hda_ldda:x.get("hda_ldda"),data_type:u},dataType:"json"},interval:5000,success_fn:function(y){return y!=="pending"}});$.when(v.go()).then(function(y){w.resolve(y==="ok"||y==="data")});return w},search_features:function(u){var v=this.get("dataset"),w={query:u,hda_ldda:v.get("hda_ldda"),data_type:"features"};return $.getJSON(v.url(),w)},load_data:function(C,B,v,A){var y=this.get("dataset"),x={data_type:this.get("data_type"),chrom:C.get("chrom"),low:C.get("start"),high:C.get("end"),mode:B,resolution:v,hda_ldda:y.get("hda_ldda")};$.extend(x,A);var E=this.get("filters_manager");if(E){var F=[];var u=E.filters;for(var z=0;z<u.length;z++){F.push(u[z].name)}x.filter_cols=JSON.stringify(F)}var w=this,D=$.getJSON(y.url(),x,function(G){w.set_data(C,G)});this.set_data(C,D);return D},get_data:function(A,z,w,y){var B=this.get_elt(A);if(B&&(j(B)||this.get("data_mode_compatible")(B,z))){return B}var C=this.get("key_ary"),v=this.get("obj_cache"),D,u;for(var x=0;x<C.length;x++){D=C[x];u=new g({from_str:D});if(u.contains(A)){B=v[D];if(j(B)||(this.get("data_mode_compatible")(B,z)&&this.get("can_subset")(B))){this.move_key_to_end(D,x);return B}}}return this.load_data(A,z,w,y)},set_data:function(v,u){this.set_elt(v,u)},DEEP_DATA_REQ:"deep",BROAD_DATA_REQ:"breadth",get_more_data:function(C,B,x,A,y){var E=this._mark_stale(C);if(!(E&&this.get("data_mode_compatible")(E,B))){console.log("ERROR: problem with getting more data: current data is not compatible");return}var w=C.get("start");if(y===this.DEEP_DATA_REQ){$.extend(A,{start_val:E.data.length+1})}else{if(y===this.BROAD_DATA_REQ){w=(E.max_high?E.max_high:E.data[E.data.length-1][2])+1}}var D=C.copy().set("start",w);var v=this,z=this.load_data(D,B,x,A),u=$.Deferred();this.set_data(C,u);$.when(z).then(function(F){if(F.data){F.data=E.data.concat(F.data);if(F.max_low){F.max_low=E.max_low}if(F.message){F.message=F.message.replace(/[0-9]+/,F.data.length)}}v.set_data(C,F);u.resolve(F)});return u},can_get_more_detailed_data:function(v){var u=this.get_elt(v);return(u.dataset_type==="bigwig"&&u.data.length<8000)},get_more_detailed_data:function(x,z,v,y,w){var u=this._mark_stale(x);if(!u){console.log("ERROR getting more detailed data: no current data");return}if(!w){w={}}if(u.dataset_type==="bigwig"){w.num_samples=1000*y}else{if(u.dataset_type==="summary_tree"){w.level=Math.min(u.level-1,2)}}return this.load_data(x,z,v,w)},_mark_stale:function(v){var u=this.get_elt(v);if(!u){console.log("ERROR: no data to mark as stale: ",this.get("dataset"),v.toString())}u.stale=true;return u},get_genome_wide_data:function(u){var w=this,y=true,x=s.map(u.get("chroms_info").chrom_info,function(A){var z=w.get_elt(new g({chrom:A.chrom,start:0,end:A.len}));if(!z){y=false}return z});if(y){return x}var v=$.Deferred();$.getJSON(this.get("dataset").url(),{data_type:"genome_data"},function(z){w.add_data(z.data);v.resolve(z.data)});return v},get_elt:function(u){return q.prototype.get_elt.call(this,u.toString())},set_elt:function(v,u){return q.prototype.set_elt.call(this,v.toString(),u)}});var n=d.extend({initialize:function(u){var v=new Backbone.Model();v.urlRoot=u.data_url;this.set("dataset",v)},load_data:function(w,x,u,v){if(u>1){return{data:null}}return d.prototype.load_data.call(this,w,x,u,v)}});var c=Backbone.Model.extend({defaults:{name:null,key:null,chroms_info:null},initialize:function(u){this.id=u.dbkey},get_chroms_info:function(){return this.attributes.chroms_info.chrom_info},get_chrom_region:function(u){var v=s.find(this.get_chroms_info(),function(w){return w.chrom===u});return new g({chrom:v.chrom,end:v.len})}});var g=Backbone.RelationalModel.extend({defaults:{chrom:null,start:0,end:0},initialize:function(v){if(v.from_str){var x=v.from_str.split(":"),w=x[0],u=x[1].split("-");this.set({chrom:w,start:parseInt(u[0],10),end:parseInt(u[1],10)})}},copy:function(){return new g({chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")})},length:function(){return this.get("end")-this.get("start")},toString:function(){return this.get("chrom")+":"+this.get("start")+"-"+this.get("end")},toJSON:function(){return{chrom:this.get("chrom"),start:this.get("start"),end:this.get("end")}},compute_overlap:function(B){var v=this.get("chrom"),A=B.get("chrom"),z=this.get("start"),x=B.get("start"),y=this.get("end"),w=B.get("end"),u;if(v&&A&&v!==A){return g.overlap_results.DIF_CHROMS}if(z<x){if(y<x){u=g.overlap_results.BEFORE}else{if(y<=w){u=g.overlap_results.OVERLAP_START}else{u=g.overlap_results.CONTAINS}}}else{if(z>w){u=g.overlap_results.AFTER}else{if(y<=w){u=g.overlap_results.CONTAINED_BY}else{u=g.overlap_results.OVERLAP_END}}}return u},contains:function(u){return this.compute_overlap(u)===g.overlap_results.CONTAINS},overlaps:function(u){return s.intersection([this.compute_overlap(u)],[g.overlap_results.DIF_CHROMS,g.overlap_results.BEFORE,g.overlap_results.AFTER]).length===0}},{overlap_results:{DIF_CHROMS:1000,BEFORE:1001,CONTAINS:1002,OVERLAP_START:1003,OVERLAP_END:1004,CONTAINED_BY:1005,AFTER:1006}});var m=Backbone.Collection.extend({model:g});var e=Backbone.RelationalModel.extend({defaults:{region:null,note:""},relations:[{type:Backbone.HasOne,key:"region",relatedModel:g}]});var r=Backbone.Collection.extend({model:e});var t=i.Dataset.extend({initialize:function(u){this.set("id",u.dataset_id);this.set("config",p.ConfigSettingCollection.from_config_dict(u.prefs));this.get("config").add([{key:"name",value:this.get("name")},{key:"color"}]);var v=this.get("preloaded_data");if(v){v=v.data}else{v=[]}this.set("data_manager",new d({dataset:this,init_data:v}))}});var o=Backbone.RelationalModel.extend({defaults:{title:"",type:""},url:galaxy_paths.get("visualization_url"),save:function(){return $.ajax({url:this.url(),type:"POST",dataType:"json",data:{vis_json:JSON.stringify(this)}})}});var k=o.extend({defaults:s.extend({},o.prototype.defaults,{dbkey:"",tracks:null,bookmarks:null,viewport:null}),relations:[{type:Backbone.HasMany,key:"tracks",relatedModel:t}],add_tracks:function(u){this.get("tracks").add(u)}});var b=Backbone.Model.extend({});var h=Backbone.Router.extend({initialize:function(v){this.view=v.view;this.route(/([\w]+)$/,"change_location");this.route(/([\w]+\:[\d,]+-[\d,]+)$/,"change_location");var u=this;u.view.on("navigate",function(w){u.navigate(w)})},change_location:function(u){this.view.go_to(u)}});return{BackboneTrack:t,BrowserBookmark:e,BrowserBookmarkCollection:r,Cache:q,CanvasManager:f,Genome:c,GenomeDataManager:d,GenomeRegion:g,GenomeRegionCollection:m,GenomeVisualization:k,ReferenceTrackDataManager:n,TrackBrowserRouter:h,TrackConfig:b,Visualization:o,select_datasets:a}});
\ No newline at end of file
diff -r 40a7ef4efb22afdc6bde4bce4e75d691e4ac7a7f -r 09c81e81952d4768d63fde4840f31958d8e23041 templates/grid_base.mako
--- a/templates/grid_base.mako
+++ b/templates/grid_base.mako
@@ -129,6 +129,19 @@
cur_page: ${cur_page_num},
num_pages: ${num_pages}
});
+
+ // Initialize grid objects on load.
+ // FIXME: use a grid view object eventually.
+ $(document).ready(function() {
+ init_grid_elements();
+ init_grid_controls();
+
+ // Initialize text filters to select text on click and use normal font when user is typing.
+ $('input[type=text]').each(function() {
+ $(this).click(function() { $(this).select(); } )
+ .keyup(function () { $(this).css("font-style", "normal"); });
+ });
+ });
</script></%def>
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Fix tool shed functional test that was broken in commit 8852:d04aa3ad6132.
by Bitbucket 17 Feb '13
by Bitbucket 17 Feb '13
17 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/40a7ef4efb22/
changeset: 40a7ef4efb22
user: greg
date: 2013-02-17 18:46:13
summary: Fix tool shed functional test that was broken in commit 8852:d04aa3ad6132.
affected #: 2 files
diff -r 64b4ef5e2cc8e18a2872eaeb64fa46f50ae7f814 -r 40a7ef4efb22afdc6bde4bce4e75d691e4ac7a7f test/tool_shed/base/twilltestcase.py
--- a/test/tool_shed/base/twilltestcase.py
+++ b/test/tool_shed/base/twilltestcase.py
@@ -903,28 +903,58 @@
self.reset_installed_repository_metadata( installed_repository )
new_metadata = installed_repository.metadata
assert metadata == new_metadata, 'Metadata for installed repository %s differs after metadata reset.' % name
- def verify_installed_repository_data_table_entries( self, data_tables=[] ):
- data_table = util.parse_xml( self.shed_tool_data_table_conf )
+ def verify_installed_repository_data_table_entries( self, required_data_table_entries ):
+ # The value of the received required_data_table_entries will be something like: [ 'sam_fa_indexes' ]
+ data_tables = util.parse_xml( self.shed_tool_data_table_conf )
found = False
+ # With the tool shed, the "path" attribute that is hard-coded into the tool_data_tble_conf.xml
+ # file is ignored. This is because the tool shed requires the directory location to which this
+ # path points to be empty except when a specific tool is loaded. The default location for this
+ # directory configured for the tool shed is <Galaxy root>/shed-tool-data. When a tool is loaded
+ # in the tool shed, all contained .loc.sample files are copied to this directory and the
+ # ToolDataTableManager parses and loads the files in the same way that Galaxy does with a very
+ # important exception. When the tool shed loads a tool and parses and loads the copied ,loc.sample
+ # files, the ToolDataTableManager is already instantiated, and so it's add_new_entries_from_config_file()
+ # method is called and the tool_data_path parameter is used to over-ride the hard-coded "tool-data"
+ # directory that Galaxy always uses.
+ #
# Tool data table xml structure:
# <tables>
- # <!-- Locations of all fasta files under genome directory -->
- # <table name="all_fasta" comment_char="#">
- # <columns>value, dbkey, name, path</columns>
- # <file path="tool-data/all_fasta.loc" />
+ # <table comment_char="#" name="sam_fa_indexes">
+ # <columns>line_type, value, path</columns>
+ # <file path="tool-data/sam_fa_indices.loc" />
# </table>
# </tables>
- for table_elem in data_table.findall( 'table' ):
- for data_table in data_tables:
- if 'name' in table_elem.attrib and table_elem.attrib[ 'name' ] == data_table:
+ for table_elem in data_tables.findall( 'table' ):
+ # The value of table_elem will be something like: <table comment_char="#" name="sam_fa_indexes">
+ for required_data_table_entry in required_data_table_entries:
+ # The value of required_data_table_entry will be something like: 'sam_fa_indexes'
+ if 'name' in table_elem.attrib and table_elem.attrib[ 'name' ] == required_data_table_entry:
+ found = True
+ # We're processing something like: sam_fa_indexes
file_elem = table_elem.find( 'file' )
+ # We have something like: <file path="tool-data/sam_fa_indices.loc" />
+ # The "path" attribute of the "file" tag is the location that Galaxy always uses because the
+ # Galaxy ToolDataTableManager was implemented in such a way that the hard-coded path is used
+ # rather than allowing the location to be a configurable setting like the tool shed requires.
file_path = file_elem.get( 'path', None )
- full_path = os.path.join( self.tool_data_path, file_path )
- assert file_path is not None, 'No file path configured for this data table.'
- assert os.path.exists( full_path ), 'Tool data table file %s not found.' % full_path
- found = True
+ # The value of file_path will be something like: "tool-data/all_fasta.loc"
+ assert file_path is not None, 'The "path" attribute is missing for the %s entry.' % name
+ # The following test is probably not necesary, but the tool-data directory should exist!
+ galaxy_tool_data_dir, loc_file_name = os.path.split( file_path )
+ assert galaxy_tool_data_dir is not None, 'The hard-coded Galaxy tool-data directory is missing for the %s entry.' % name
+ assert os.path.exists( galaxy_tool_data_dir ), 'The Galaxy tool-data directory does not exist.'
+ # Make sure the loc_file_name was correctly copied into the configured directory location.
+ configured_file_location = os.path.join( self.tool_data_path, loc_file_name )
+ assert os.path.isfile( configured_file_location ), 'The expected copied file "%s" is missing.' % configured_file_location
+ # We've found the value of the required_data_table_entry in data_tables, which is the parsed
+ # shed_tool_data_table_conf.xml, so all is well!
break
- assert found, 'No entry for %s in %s.' % ( data_table, self.shed_tool_data_table_conf )
+ if found:
+ break
+ # We better have an entry like: <table comment_char="#" name="sam_fa_indexes"> in our parsed data_tables
+ # or we know that the repository was not correctly installed!
+ assert found, 'No entry for %s in %s.' % ( required_data_table_entry, self.shed_tool_data_table_conf )
def verify_repository_reviews( self, repository, reviewer=None, strings_displayed=[], strings_not_displayed=[] ):
changeset_revision = self.get_repository_tip( repository )
# Verify that the currently logged in user has a repository review for the specified repository, reviewer, and changeset revision.
diff -r 64b4ef5e2cc8e18a2872eaeb64fa46f50ae7f814 -r 40a7ef4efb22afdc6bde4bce4e75d691e4ac7a7f test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
--- a/test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
+++ b/test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
@@ -127,5 +127,5 @@
self.verify_installed_repository_metadata_unchanged( repository_name, common.test_user_1_name )
def test_0025_verify_sample_files( self ):
'''Verify that the installed repository populated shed_tool_data_table.xml and the sample files.'''
- self.verify_installed_repository_data_table_entries( data_tables=[ 'sam_fa_indexes' ] )
+ self.verify_installed_repository_data_table_entries( required_data_table_entries=[ 'sam_fa_indexes' ] )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Add some comments to the tool shed functional test script that tests behavior of complex repository dependencies.
by Bitbucket 16 Feb '13
by Bitbucket 16 Feb '13
16 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/64b4ef5e2cc8/
changeset: 64b4ef5e2cc8
user: greg
date: 2013-02-16 22:21:40
summary: Add some comments to the tool shed functional test script that tests behavior of complex repository dependencies.
affected #: 1 file
diff -r a41446bf66fda81772b6fe7d02f921a4955f7ce9 -r 64b4ef5e2cc8e18a2872eaeb64fa46f50ae7f814 test/tool_shed/functional/test_0100_complex_repository_dependencies.py
--- a/test/tool_shed/functional/test_0100_complex_repository_dependencies.py
+++ b/test/tool_shed/functional/test_0100_complex_repository_dependencies.py
@@ -27,10 +27,11 @@
assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
admin_user_private_role = test_db_util.get_private_role( admin_user )
def test_0005_create_bwa_tool_repository( self ):
- '''Create and populate bwa_tool_0100.'''
+ '''Create and populate bwa_tool_repository_0100.'''
category = self.create_category( name=category_name, description=category_description )
self.logout()
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ # Create a repository named bwa_tool_repository_0100 owned by user1.
repository = self.get_or_create_repository( name=bwa_tool_repository_name,
description=bwa_tool_repository_description,
long_description=bwa_tool_repository_long_description,
@@ -46,19 +47,21 @@
commit_message='Uploaded tool_dependencies.xml.',
strings_displayed=[ 'The settings for <b>name</b>, <b>version</b> and <b>type</b> from a contained tool' ],
strings_not_displayed=[] )
+ # Visit the manage repository page for bwa_tool_repository_0100.
self.display_manage_repository_page( repository, strings_displayed=[ 'Tool dependencies', 'may not be', 'in this repository' ] )
def test_0010_create_bwa_base_repository( self ):
'''Create and populate bwa_base_0100.'''
category = self.create_category( name=category_name, description=category_description )
self.logout()
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ # Create a repository named bwa_base_repository_0100 owned by user1.
repository = self.get_or_create_repository( name=bwa_base_repository_name,
description=bwa_base_repository_description,
long_description=bwa_base_repository_long_description,
owner=common.test_user_1_name,
category_id=self.security.encode_id( category.id ),
strings_displayed=[] )
- tool_repository = test_db_util.get_repository_by_name_and_owner( bwa_tool_repository_name, common.test_user_1_name )
+ # Populate the repository named bwa_base_repository_0100 with a bwa_base tool archive.
self.upload_file( repository,
filename='bwa/complex/bwa_base.tar',
filepath=None,
@@ -72,14 +75,17 @@
'''Generate and upload a complex repository definition that specifies an invalid tool shed URL.'''
dependency_path = self.generate_temp_path( 'test_0100', additional_paths=[ 'complex', 'invalid' ] )
xml_filename = self.get_filename( 'tool_dependencies.xml', filepath=dependency_path )
+ # The repository named bwa_base_repository_0100 is the dependent repository.
repository = test_db_util.get_repository_by_name_and_owner( bwa_base_repository_name, common.test_user_1_name )
+ # The tool_repository named bwa_tool_repository_0100 is the required repository.
tool_repository = test_db_util.get_repository_by_name_and_owner( bwa_tool_repository_name, common.test_user_1_name )
url = 'http://http://this is not an url!'
- name = tool_repository.name
- owner = tool_repository.user.username
+ name = 'bwa_tool_repository_0100'
+ owner = 'user1'
changeset_revision = self.get_repository_tip( tool_repository )
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=True, package='bwa', version='0.5.9' )
strings_displayed = [ 'Repository dependencies are currently supported only within the same tool shed' ]
+ # Populate the dependent repository named bwa_base_repository_0100 with an invalid tool_dependencies.xml file.
self.upload_file( repository,
filename='tool_dependencies.xml',
filepath=dependency_path,
@@ -93,14 +99,17 @@
'''Generate and upload a complex repository definition that specifies an invalid repository name.'''
dependency_path = self.generate_temp_path( 'test_0100', additional_paths=[ 'complex', 'invalid' ] )
xml_filename = self.get_filename( 'tool_dependencies.xml', filepath=dependency_path )
+ # The base_repository named bwa_base_repository_0100 is the dependent repository.
base_repository = test_db_util.get_repository_by_name_and_owner( bwa_base_repository_name, common.test_user_1_name )
+ # The tool_repository named bwa_tool_repository_0100 is the required repository.
tool_repository = test_db_util.get_repository_by_name_and_owner( bwa_tool_repository_name, common.test_user_1_name )
url = self.url
name = 'invalid_repository!?'
- owner = tool_repository.user.username
+ owner = 'user1'
changeset_revision = self.get_repository_tip( tool_repository )
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=True, package='bwa', version='0.5.9' )
- strings_displayed = [ 'because the name is invalid' ]
+ strings_displayed = [ 'because the name is invalid' ]
+ # # Populate the dependent base_repository named bwa_tool_repository_0100 with an invalid tool_dependencies.xml file.
self.upload_file( base_repository,
filename='tool_dependencies.xml',
filepath=dependency_path,
@@ -114,10 +123,12 @@
'''Generate and upload a complex repository definition that specifies an invalid owner.'''
dependency_path = self.generate_temp_path( 'test_0100', additional_paths=[ 'complex', 'invalid' ] )
xml_filename = self.get_filename( 'tool_dependencies.xml', filepath=dependency_path )
+ # The base_repository named bwa_base_repository_0100 is the dependent repository.
base_repository = test_db_util.get_repository_by_name_and_owner( bwa_base_repository_name, common.test_user_1_name )
+ # The tool_repository named bwa_tool_repository_0100 is the required repository.
tool_repository = test_db_util.get_repository_by_name_and_owner( bwa_tool_repository_name, common.test_user_1_name )
url = self.url
- name = tool_repository.name
+ name = 'bwa_tool_repository_0100'
owner = 'invalid_owner!?'
changeset_revision = self.get_repository_tip( tool_repository )
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=True, package='bwa', version='0.5.9' )
@@ -135,11 +146,13 @@
'''Generate and upload a complex repository definition that specifies an invalid changeset revision.'''
dependency_path = self.generate_temp_path( 'test_0100', additional_paths=[ 'complex', 'invalid' ] )
xml_filename = self.get_filename( 'tool_dependencies.xml', filepath=dependency_path )
+ # The base_repository named bwa_base_repository_0100 is the dependent repository.
base_repository = test_db_util.get_repository_by_name_and_owner( bwa_base_repository_name, common.test_user_1_name )
+ # The tool_repository named bwa_tool_repository_0100 is the required repository.
tool_repository = test_db_util.get_repository_by_name_and_owner( bwa_tool_repository_name, common.test_user_1_name )
url = self.url
- name = tool_repository.name
- owner = tool_repository.user.username
+ name = 'bwa_tool_repository_0100'
+ owner = 'user1'
changeset_revision = '1234abcd'
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=True, package='bwa', version='0.5.9' )
strings_displayed = [ 'because the changeset revision is invalid.' ]
@@ -154,15 +167,19 @@
strings_not_displayed=[] )
def test_0035_generate_complex_repository_dependency( self ):
'''Generate and upload a valid tool_dependencies.xml file that specifies bwa_tool_repository_0100.'''
+ # The base_repository named bwa_base_repository_0100 is the dependent repository.
base_repository = test_db_util.get_repository_by_name_and_owner( bwa_base_repository_name, common.test_user_1_name )
+ # The tool_repository named bwa_tool_repository_0100 is the required repository.
tool_repository = test_db_util.get_repository_by_name_and_owner( bwa_tool_repository_name, common.test_user_1_name )
dependency_path = self.generate_temp_path( 'test_0100', additional_paths=[ 'complex' ] )
xml_filename = self.get_filename( 'tool_dependencies.xml', filepath=dependency_path )
url = self.url
- name = tool_repository.name
- owner = tool_repository.user.username
+ name = 'bwa_tool_repository_0100'
+ owner = 'user1'
changeset_revision = self.get_repository_tip( tool_repository )
self.generate_repository_dependency_xml( [ tool_repository ], xml_filename, complex=True, package='bwa', version='0.5.9' )
+ # Upload the valid tool_dependencies.xml file to bwa_base_repository_0100 that specifies bwa_tool_repository_0100
+ # as a repository dependency via a complex repository dependency definition.
self.upload_file( base_repository,
filename='tool_dependencies.xml',
filepath=dependency_path,
@@ -176,7 +193,9 @@
self.display_manage_repository_page( base_repository, strings_displayed=[ 'bwa', '0.5.9', 'package' ] )
def test_0040_generate_tool_dependency( self ):
'''Generate and upload a new tool_dependencies.xml file that specifies an arbitrary file on the filesystem, and verify that bwa_base depends on the new changeset revision.'''
+ # The base_repository named bwa_base_repository_0100 is the dependent repository.
base_repository = test_db_util.get_repository_by_name_and_owner( bwa_base_repository_name, common.test_user_1_name )
+ # The tool_repository named bwa_tool_repository_0100 is the required repository.
tool_repository = test_db_util.get_repository_by_name_and_owner( bwa_tool_repository_name, common.test_user_1_name )
previous_changeset = self.get_repository_tip( tool_repository )
old_tool_dependency = self.get_filename( os.path.join( 'bwa', 'complex', 'readme', 'tool_dependencies.xml' ) )
@@ -195,6 +214,21 @@
strings_displayed=[],
strings_not_displayed=[] )
# Verify that the dependency display has been updated as a result of the new tool_dependencies.xml file.
+ repository_tip = self.get_repository_tip( tool_repository )
+ strings_displayed = [ 'bwa', '0.5.9', 'package' ]
+ strings_displayed.append( repository_tip )
+ strings_not_displayed=[ previous_changeset ]
+ self.display_manage_repository_page( tool_repository,
+ strings_displayed=strings_displayed,
+ strings_not_displayed=strings_not_displayed )
+ # Visit the manage page of the bwa_tool_repository_0100 to confirm the valid tool dependency definition.
+ self.display_manage_repository_page( tool_repository,
+ strings_displayed=strings_displayed,
+ strings_not_displayed=strings_not_displayed )
+ # Visit the manage page of the bwa_base_repository_0100 to confirm the valid tool dependency definition
+ # and the updated changeset revision (updated tip) of the bwa_tool_repository_0100 repository is displayed
+ # as the required repository revision. The original revision defined in the previously uploaded
+ # tool_dependencies.xml file will be updated.
self.display_manage_repository_page( base_repository,
- strings_displayed=[ self.get_repository_tip( tool_repository ), 'bwa', '0.5.9', 'package' ],
- strings_not_displayed=[ previous_changeset ] )
+ strings_displayed=strings_displayed,
+ strings_not_displayed=strings_not_displayed )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: greg: Fix for handling a complex repository dependency defintiion and a bit of code cleanup.
by Bitbucket 16 Feb '13
by Bitbucket 16 Feb '13
16 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/a41446bf66fd/
changeset: a41446bf66fd
user: greg
date: 2013-02-16 22:20:33
summary: Fix for handling a complex repository dependency defintiion and a bit of code cleanup.
affected #: 1 file
diff -r 2fc2d5ef636913bdb29c4f9ecea42e440a2c326a -r a41446bf66fda81772b6fe7d02f921a4955f7ce9 lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -1429,8 +1429,8 @@
# We have a complex repository dependency. If the retruned value of repository_dependency_is_valid is True, the tool
# dependency definition will be set as invalid. This is currently the only case where a tool dependency definition is
# considered invalid.
- repository_dependencies_tup, repository_dependency_is_valid, error_message = handle_repository_elem( app=app,
- repository_elem=sub_elem )
+ repository_dependency_tup, repository_dependency_is_valid, error_message = \
+ handle_repository_elem( app=app, repository_elem=sub_elem )
if requirements_dict:
dependency_key = '%s/%s' % ( package_name, package_version )
if repository_dependency_is_valid:
@@ -1490,19 +1490,6 @@
If the combination of name, version and type of each element is defined in the <requirement> tag for at least one tool in the repository,
then update the received metadata_dict with information from the parsed tool_dependencies_config.
"""
- """
- "{"orphan_tool_dependencies":
- {"bwa/0.5.9":
- {"name": "bwa",
- "readme": "\\nCompiling BWA requires zlib and libpthread to be present on your system.\\n ",
- "type": "package", "version": "0.5.9"}},
- "tool_dependencies":
- {"bwa/0.5.9":
- {"name": "bwa",
- "readme": "\\nCompiling BWA requires zlib and libpthread to be present on your system.\\n ",
- "type": "package",
- "version": "0.5.9"}}}"
- """
error_message = ''
if original_repository_metadata:
# Keep a copy of the original tool dependencies dictionary and the list of tool dictionaries in the metadata.
@@ -1538,7 +1525,8 @@
# We have an invalid complex repository dependency, so mark the tool dependency as invalid.
tool_dependency_is_valid = False
# Append the error message to the invalid repository dependency tuple.
- repository_dependency_tup.append( message )
+ toolshed, name, owner, changeset_revision = repository_dependency_tup
+ repository_dependency_tup = ( toolshed, name, owner, changeset_revision, message )
invalid_repository_dependency_tups.append( repository_dependency_tup )
error_message = '%s %s' % ( error_message, message )
elif elem.tag == 'set_environment':
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
2 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/ef882ec18f1c/
changeset: ef882ec18f1c
user: jmchilton
date: 2013-02-15 22:58:30
summary: Fix to allow multiple input tool parameters in conditionals and repeats.
affected #: 1 file
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r ef882ec18f1c6c779796cde62ca035c826197bc9 lib/galaxy/tools/actions/__init__.py
--- a/lib/galaxy/tools/actions/__init__.py
+++ b/lib/galaxy/tools/actions/__init__.py
@@ -76,10 +76,10 @@
else:
raise Exception, 'A path for explicit datatype conversion has not been found: %s --/--> %s' % ( input_datasets[ prefix + input.name + str( i + 1 ) ].extension, conversion_extensions )
if parent:
- parent[input.name] = input_datasets[ prefix + input.name + str( i + 1 ) ]
+ parent[input.name][i] = input_datasets[ prefix + input.name + str( i + 1 ) ]
for conversion_name, conversion_data in conversions:
#allow explicit conversion to be stored in job_parameter table
- parent[ conversion_name ] = conversion_data.id #a more robust way to determine JSONable value is desired
+ parent[ conversion_name ][i] = conversion_data.id #a more robust way to determine JSONable value is desired
else:
param_values[input.name][i] = input_datasets[ prefix + input.name + str( i + 1 ) ]
for conversion_name, conversion_data in conversions:
https://bitbucket.org/galaxy/galaxy-central/commits/2fc2d5ef6369/
changeset: 2fc2d5ef6369
user: dannon
date: 2013-02-15 23:18:46
summary: Merged in jmchilton/galaxy-central-multi-input-tool-fixes-2 (pull request #125)
Fix to allow multiple input tool parameters in conditionals and repeats.
affected #: 1 file
diff -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a -r 2fc2d5ef636913bdb29c4f9ecea42e440a2c326a lib/galaxy/tools/actions/__init__.py
--- a/lib/galaxy/tools/actions/__init__.py
+++ b/lib/galaxy/tools/actions/__init__.py
@@ -76,10 +76,10 @@
else:
raise Exception, 'A path for explicit datatype conversion has not been found: %s --/--> %s' % ( input_datasets[ prefix + input.name + str( i + 1 ) ].extension, conversion_extensions )
if parent:
- parent[input.name] = input_datasets[ prefix + input.name + str( i + 1 ) ]
+ parent[input.name][i] = input_datasets[ prefix + input.name + str( i + 1 ) ]
for conversion_name, conversion_data in conversions:
#allow explicit conversion to be stored in job_parameter table
- parent[ conversion_name ] = conversion_data.id #a more robust way to determine JSONable value is desired
+ parent[ conversion_name ][i] = conversion_data.id #a more robust way to determine JSONable value is desired
else:
param_values[input.name][i] = input_datasets[ prefix + input.name + str( i + 1 ) ]
for conversion_name, conversion_data in conversions:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: inithello: Tool shed functional test refactoring for clarity. Functional tests for limiting access to repository component reviews.
by Bitbucket 15 Feb '13
by Bitbucket 15 Feb '13
15 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/8e93ca10b0e2/
changeset: 8e93ca10b0e2
user: inithello
date: 2013-02-15 22:55:29
summary: Tool shed functional test refactoring for clarity. Functional tests for limiting access to repository component reviews.
affected #: 22 files
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/base/twilltestcase.py
--- a/test/tool_shed/base/twilltestcase.py
+++ b/test/tool_shed/base/twilltestcase.py
@@ -83,20 +83,20 @@
tool_panel_section = tool_panel_section_metadata[ tool_guid ][ 0 ][ 'name' ]
assert tool_panel_section == expected_tool_panel_section, 'Expected tool panel section %s, found %s\nMetadata: %s\n' % \
( expected_tool_panel_section, tool_panel_section, metadata )
- def check_installed_repository_tool_dependencies( self, installed_repository, dependencies_installed=False ):
+ def check_installed_repository_tool_dependencies( self,
+ installed_repository,
+ strings_displayed=[],
+ strings_not_displayed=[],
+ dependencies_installed=False ):
# Tool dependencies are not being installed in these functional tests. If this is changed, the test method will also need to be updated.
- strings_not_displayed = []
if not dependencies_installed:
- strings_displayed = [ 'Missing tool dependencies' ]
+ strings_displayed.append( 'Missing tool dependencies' )
else:
- strings_displayed = [ 'Tool dependencies' ]
- for dependency in installed_repository.metadata[ 'tool_dependencies' ]:
- tool_dependency = installed_repository.metadata[ 'tool_dependencies' ][ dependency ]
- strings_displayed.extend( [ tool_dependency[ 'name' ], tool_dependency[ 'version' ], tool_dependency[ 'type' ] ] )
- if dependencies_installed:
- strings_displayed.append( 'Installed' )
- else:
- strings_displayed.append( 'Never installed' )
+ strings_displayed.append( 'Tool dependencies' )
+ if dependencies_installed:
+ strings_displayed.append( 'Installed' )
+ else:
+ strings_displayed.append( 'Never installed' )
url = '/admin_toolshed/manage_repository?id=%s' % self.security.encode_id( installed_repository.id )
self.visit_galaxy_url( url )
self.check_for_strings( strings_displayed, strings_not_displayed )
@@ -122,6 +122,7 @@
Loop through each tool dictionary in the repository metadata associated with the received changeset_revision.
For each of these, check for a tools attribute, and load the tool metadata page if it exists, then display that tool's page.
'''
+ test_db_util.refresh( repository )
repository_metadata = self.get_repository_metadata_by_changeset_revision( repository, changeset_revision )
metadata = repository_metadata.metadata
if 'tools' not in metadata:
@@ -297,11 +298,7 @@
def display_installed_repository_manage_page( self, installed_repository, strings_displayed=[], strings_not_displayed=[] ):
url = '/admin_toolshed/manage_repository?id=%s' % self.security.encode_id( installed_repository.id )
self.visit_galaxy_url( url )
- strings_displayed.extend( [ installed_repository.name,
- installed_repository.description,
- installed_repository.owner,
- installed_repository.tool_shed,
- installed_repository.installed_changeset_revision ] )
+ strings_displayed.append( installed_repository.installed_changeset_revision )
self.check_for_strings( strings_displayed, strings_not_displayed )
def display_installed_workflow_image( self, repository, workflow_name, strings_displayed=[], strings_not_displayed=[] ):
url = '/admin_toolshed/generate_workflow_image?repository_id=%s&workflow_name=%s' % \
@@ -316,19 +313,6 @@
changeset_revision = self.get_repository_tip( repository )
url = base_url
self.visit_url( url )
- metadata = self.get_repository_metadata_by_changeset_revision( repository, changeset_revision )
- if metadata:
- if 'tool_dependencies' in metadata.metadata:
- strings_displayed.append( 'Tool dependencies' )
- for dependency in metadata.metadata[ 'tool_dependencies' ]:
- if dependency == 'set_environment':
- for environment_dependency in metadata.metadata[ 'tool_dependencies' ][ dependency ]:
- strings_displayed.append( environment_dependency[ 'name' ] )
- strings_displayed.append( environment_dependency[ 'type' ] )
- else:
- strings_displayed.append( metadata.metadata[ 'tool_dependencies' ][ dependency ][ 'name' ] )
- strings_displayed.append( metadata.metadata[ 'tool_dependencies' ][ dependency ][ 'version' ] )
- strings_displayed.append( metadata.metadata[ 'tool_dependencies' ][ dependency ][ 'type' ] )
self.check_for_strings( strings_displayed, strings_not_displayed )
def display_repository_clone_page( self, owner_name, repository_name, strings_displayed=[], strings_not_displayed=[] ):
url = '/repos/%s/%s' % ( owner_name, repository_name )
@@ -907,19 +891,12 @@
# else:
# time.sleep( 1 )
# continue
- def verify_installed_uninstalled_repositories( self, installed_repositories=[], uninstalled_repositories=[] ):
- strings_displayed = []
- strings_not_displayed = []
- for repository_name, repository_owner in uninstalled_repositories:
- repository = test_db_util.get_repository_by_name_and_owner( repository_name, repository_owner )
- strings_not_displayed.extend( [ repository_name, self.get_repository_tip( repository ) ] )
+ def verify_installed_repositories( self, installed_repositories=[], uninstalled_repositories=[] ):
for repository_name, repository_owner in installed_repositories:
- repository = test_db_util.get_repository_by_name_and_owner( repository_name, repository_owner )
galaxy_repository = test_db_util.get_installed_repository_by_name_owner( repository_name, repository_owner )
if galaxy_repository:
- assert galaxy_repository.status == 'Installed', 'Repository %s should be installed, but is %s' % ( repository_name, galaxy_repository.status )
- strings_displayed.extend( [ repository_name, self.get_repository_tip( repository ) ] )
- self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed, strings_not_displayed=strings_not_displayed )
+ assert galaxy_repository.status == 'Installed', \
+ 'Repository %s should be installed, but is %s' % ( repository_name, galaxy_repository.status )
def verify_installed_repository_metadata_unchanged( self, name, owner ):
installed_repository = test_db_util.get_installed_repository_by_name_owner( name, owner )
metadata = installed_repository.metadata
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_0000_basic_repository_features.py
--- a/test/tool_shed/functional/test_0000_basic_repository_features.py
+++ b/test/tool_shed/functional/test_0000_basic_repository_features.py
@@ -157,7 +157,7 @@
category = test_db_util.get_category_by_name( 'Test 0000 Basic Repository Features 1' )
tip = self.get_repository_tip( repository )
self.check_for_valid_tools( repository )
- strings_displayed = self.get_repository_metadata_revisions( repository ).append( 'Select a revision' )
+ strings_displayed = [ 'Select a revision' ]
self.display_manage_repository_page( repository, strings_displayed=strings_displayed )
self.check_count_of_metadata_revisions_associated_with_repository( repository, metadata_count=2 )
self.check_repository_tools_for_changeset_revision( repository, tip )
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py
--- a/test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py
+++ b/test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py
@@ -116,5 +116,5 @@
'''Verify that the uploaded tool_dependencies.xml specifies the correct package versions.'''
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.display_manage_repository_page( repository,
- strings_displayed=[ 'freebayes', '0.9.4_9696d0ce8a9', 'samtools', '0.1.18', 'Valid tools' ],
+ strings_displayed=[ 'freebayes', '0.9.4_9696d0ce8a9', 'samtools', '0.1.18', 'Valid tools', 'package' ],
strings_not_displayed=[ 'Invalid tools' ] )
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_0030_repository_dependency_revisions.py
--- a/test/tool_shed/functional/test_0030_repository_dependency_revisions.py
+++ b/test/tool_shed/functional/test_0030_repository_dependency_revisions.py
@@ -178,7 +178,7 @@
# Iterate through all metadata revisions and check for repository dependencies.
for metadata, changeset_revision in repository_metadata:
# Add the dependency description and datatypes repository details to the strings to check.
- strings_displayed.extend( [ 'Emboss requires the Emboss', 'emboss_datatypes_0030', 'user1', datatypes_tip ] )
+ strings_displayed = [ 'Emboss requires the Emboss', 'emboss_datatypes_0030', 'user1', datatypes_tip ]
strings_displayed.extend( [ 'Tool dependencies', 'emboss', '5.0.0', 'package' ] )
self.display_manage_repository_page( repository,
changeset_revision=changeset_revision,
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_0040_repository_circular_dependencies.py
--- a/test/tool_shed/functional/test_0040_repository_circular_dependencies.py
+++ b/test/tool_shed/functional/test_0040_repository_circular_dependencies.py
@@ -127,5 +127,5 @@
'''Verify that freebayes displays tool dependencies.'''
repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
self.display_manage_repository_page( repository,
- strings_displayed=[ 'freebayes', '0.9.4_9696d0ce8a9', 'samtools', '0.1.18', 'Valid tools' ],
+ strings_displayed=[ 'freebayes', '0.9.4_9696d0ce8a9', 'samtools', '0.1.18', 'Valid tools', 'package' ],
strings_not_displayed=[ 'Invalid tools' ] )
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_0050_circular_dependencies_4_levels.py
--- a/test/tool_shed/functional/test_0050_circular_dependencies_4_levels.py
+++ b/test/tool_shed/functional/test_0050_circular_dependencies_4_levels.py
@@ -261,7 +261,7 @@
for repository in [ emboss_datatypes_repository, emboss_repository, column_repository ]:
self.check_repository_dependency( freebayes_repository, repository )
freebayes_dependencies = [ freebayes_repository, emboss_datatypes_repository, emboss_repository, column_repository ]
- strings_displayed = [ '%s depends on %s.' % ( freebayes_repository.name, ', '.join( repo.name for repo in freebayes_dependencies ) ) ]
+ strings_displayed = [ 'freebayes_0050 depends on freebayes_0050, emboss_datatypes_0050, emboss_0050, column_maker_0050.' ]
self.display_manage_repository_page( freebayes_repository,
strings_displayed=strings_displayed )
def test_0050_verify_tool_dependencies( self ):
@@ -269,7 +269,7 @@
freebayes_repository = test_db_util.get_repository_by_name_and_owner( freebayes_repository_name, common.test_user_1_name )
emboss_repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
self.display_manage_repository_page( freebayes_repository,
- strings_displayed=[ 'freebayes', '0.9.4_9696d0ce8a9', 'samtools', '0.1.18', 'Tool dependencies' ] )
+ strings_displayed=[ 'freebayes', '0.9.4_9696d0ce8a9', 'samtools', '0.1.18', 'Tool dependencies', 'package' ] )
self.display_manage_repository_page( emboss_repository, strings_displayed=[ 'Tool dependencies', 'emboss', '5.0.0', 'package' ] )
def test_0055_verify_repository_metadata( self ):
'''Verify that resetting the metadata does not change it.'''
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_0410_repository_component_review_access_control.py
--- /dev/null
+++ b/test/tool_shed/functional/test_0410_repository_component_review_access_control.py
@@ -0,0 +1,196 @@
+from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
+import tool_shed.base.test_db_util as test_db_util
+
+repository_name = 'filtering_0410'
+repository_description = 'Galaxy filtering tool for test 0410'
+repository_long_description = 'Long description of Galaxy filtering tool for test 0410'
+
+'''
+1. Create a repository in the tool shed owned by test_user_1.
+2. Have test_user_2 complete a review of the repository.
+3. Have test_user_1 browse the review.
+4. Have test_user_3 browse the repository and make sure they are not allowed to browse the review.
+5. Have test_user_1 give write permission on the repository to the test_user_3.
+6. Have test_user_3 browse the repository again and they should now have the ability to browse the review.
+7. Have test_user_3 browse the review.
+'''
+
+class TestRepositoryComponentReviews( ShedTwillTestCase ):
+ '''Test repository component review features.'''
+ def test_0000_initiate_users( self ):
+ """Create necessary user accounts and login as an admin user."""
+ """
+ Create all the user accounts that are needed for this test script to run independently of other test.
+ Previously created accounts will not be re-created.
+ """
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ test_user_1 = test_db_util.get_user( common.test_user_1_email )
+ assert test_user_1 is not None, 'Problem retrieving user with email %s from the database' % common.test_user_1_email
+ test_user_1_private_role = test_db_util.get_private_role( test_user_1 )
+ self.logout()
+ self.login( email=common.test_user_2_email, username=common.test_user_2_name )
+ test_user_2 = test_db_util.get_user( common.test_user_2_email )
+ assert test_user_2 is not None, 'Problem retrieving user with email %s from the database' % common.test_user_2_email
+ test_user_2_private_role = test_db_util.get_private_role( test_user_2 )
+ self.logout()
+ self.login( email=common.test_user_3_email, username=common.test_user_3_name )
+ test_user_3 = test_db_util.get_user( common.test_user_3_email )
+ assert test_user_3 is not None, 'Problem retrieving user with email %s from the database' % common.test_user_3_email
+ test_user_3_private_role = test_db_util.get_private_role( test_user_3 )
+ self.logout()
+ self.login( email=common.admin_email, username=common.admin_username )
+ admin_user = test_db_util.get_user( common.admin_email )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % common.admin_email
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
+ def test_0005_grant_reviewer_role( self ):
+ '''Grant the repository reviewer role to test_user_2.'''
+ """
+ We now have an admin user (admin_user) and three non-admin users (test_user_1, test_user_2, and test_user_3). Grant the repository
+ reviewer role to test_user_2, who will not be the owner of the reviewed repositories, and do not grant any roles to test_user_3 yet.
+ """
+ reviewer_role = test_db_util.get_role_by_name( 'Repository Reviewer' )
+ test_user_2 = test_db_util.get_user( common.test_user_2_email )
+ self.grant_role_to_user( test_user_2, reviewer_role )
+ def test_0010_verify_repository_review_components( self ):
+ '''Ensure that the required review components exist.'''
+ """
+ Make sure all the components we are to review are recorded in the database.
+ """
+ self.add_repository_review_component( name='Repository dependencies',
+ description='Repository dependencies defined in a file named repository_dependencies.xml included in the repository' )
+ strings_displayed=[ 'Data types', 'Functional tests', 'README', 'Repository dependencies', 'Tool dependencies', 'Tools', 'Workflows' ]
+ self.manage_review_components( strings_displayed=strings_displayed )
+ def test_0015_create_repository( self ):
+ """Create and populate the filtering repository"""
+ """
+ We are at step 1.
+ Log in as test_user_1 and create the filtering repository, then upload a basic set of
+ components to be reviewed in subsequent tests.
+ """
+ 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 ]
+ repository = self.get_or_create_repository( name=repository_name,
+ description=repository_description,
+ long_description=repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ),
+ strings_displayed=strings_displayed )
+ self.upload_file( repository,
+ filename='filtering/filtering_1.1.0.tar',
+ filepath=None,
+ valid_tools_only=True,
+ uncompress_file=True,
+ remove_repo_files_not_in_tar=False,
+ commit_message='Uploaded filtering 1.1.0 tarball.',
+ strings_displayed=[],
+ strings_not_displayed=[] )
+ self.upload_file( repository,
+ filename='filtering/filtering_test_data.tar',
+ filepath=None,
+ valid_tools_only=True,
+ uncompress_file=True,
+ remove_repo_files_not_in_tar=False,
+ commit_message='Uploaded filtering test data.',
+ strings_displayed=[],
+ strings_not_displayed=[] )
+ self.upload_file( repository,
+ filename='readme.txt',
+ filepath=None,
+ valid_tools_only=True,
+ uncompress_file=True,
+ remove_repo_files_not_in_tar=False,
+ commit_message='Uploaded readme.txt.',
+ strings_displayed=[],
+ strings_not_displayed=[] )
+ def test_0020_review_repository( self ):
+ '''Complete a review of the filtering repository.'''
+ '''
+ We are at step 2 - Have test_user_2 complete a review of the repository.
+ Review all components of the filtering repository, with the appropriate contents and approved/not approved/not applicable status.
+ '''
+ self.logout()
+ self.login( email=common.test_user_2_email, username=common.test_user_2_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ review_contents_dict = {
+ 'Data types': dict(),
+ 'README': dict( rating=5, comment='Clear and concise readme file, a true pleasure to read.', approved='yes', private='no' ),
+ 'Functional tests': dict( rating=5, comment='A good set of functional tests.', approved='yes', private='no' ),
+ 'Repository dependencies': dict(),
+ 'Tool dependencies': dict(),
+ 'Tools': dict( rating=5, comment='Excellent tool, easy to use.', approved='yes', private='no' ),
+ 'Workflows': dict()
+ }
+ self.create_repository_review( repository, review_contents_dict )
+ def test_0025_verify_repository_review( self ):
+ '''Verify that the review was completed and displays properly.'''
+ '''
+ We are at step 3 - Have test_user_1 browse the review.
+ Verify that all the review components were submitted, and that the repository owner can see the review.
+ '''
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ strings_displayed = [ 'Data types', 'Functional tests', 'yes', 'A good set of functional tests.', 'README', 'yes', 'Workflows', 'Tools' ]
+ strings_displayed.extend( [ 'Clear and concise readme file, a true pleasure to read.', 'Tool dependencies', 'not_applicable' ] )
+ strings_displayed.extend( [ 'Repository dependencies', 'Excellent tool, easy to use.' ] )
+ strings_displayed = [ 'Browse reviews of this repository' ]
+ self.display_manage_repository_page( repository, strings_displayed=strings_displayed )
+ self.verify_repository_reviews( repository, reviewer=user, strings_displayed=strings_displayed )
+ def test_0030_browse_with_other_user( self ):
+ '''Verify that test_user_3 is blocked from browsing the review.'''
+ '''
+ We are at step 4 - Have test_user_3 browse the repository and make sure they are not allowed to browse the review.
+ '''
+ self.logout()
+ self.login( email=common.test_user_3_email, username=common.test_user_3_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ strings_not_displayed = [ 'Browse reviews of this repository' ]
+ self.display_manage_repository_page( repository, strings_not_displayed=strings_not_displayed )
+ strings_not_displayed = [ 'A good set of functional tests.', 'Clear and concise readme file, a true pleasure to read.' ]
+ strings_not_displayed.append( 'Excellent tool, easy to use.' )
+ changeset_revision = self.get_repository_tip( repository )
+ review = test_db_util.get_repository_review_by_user_id_changeset_revision( user.id, repository.id, changeset_revision )
+ self.browse_component_review( review, strings_not_displayed=strings_not_displayed )
+ def test_0035_grant_write_access_to_other_user( self ):
+ '''Grant write access on the filtering_0410 repository to test_user_3.'''
+ '''
+ We are at step 5 - Have test_user_1 give write permission on the repository to the test_user_3.
+ '''
+ self.logout()
+ self.login( email=common.test_user_1_email, username=common.test_user_1_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ self.grant_write_access( repository, usernames=[ common.test_user_3_name ] )
+ def test_0040_verify_test_user_3_can_browse_reviews( self ):
+ '''Check that test_user_3 can now browse reviews.'''
+ '''
+ We are at step 6 - Have test_user_3 browse the repository again and they should now have the ability to browse the review.
+ '''
+ self.logout()
+ self.login( email=common.test_user_3_email, username=common.test_user_3_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ strings_displayed = [ 'Browse reviews of this repository' ]
+ self.display_manage_repository_page( repository, strings_displayed=strings_displayed )
+ def test_0045_verify_browse_review_with_write_access( self ):
+ '''Check that test_user_3 can now display reviews.'''
+ '''
+ We are at step 7 - Have test_user_3 browse the review.
+ '''
+ self.logout()
+ self.login( email=common.test_user_3_email, username=common.test_user_3_name )
+ repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
+ user = test_db_util.get_user( common.test_user_2_email )
+ strings_displayed = [ 'A good set of functional tests.',
+ 'Clear and concise readme file',
+ 'a true pleasure to read.',
+ 'Excellent tool, easy to use.' ]
+ changeset_revision = self.get_repository_tip( repository )
+ review = test_db_util.get_repository_review_by_user_id_changeset_revision( user.id, repository.id, changeset_revision )
+ self.browse_component_review( review, strings_displayed=strings_displayed )
+
\ No newline at end of file
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_1000_install_basic_repository.py
--- a/test/tool_shed/functional/test_1000_install_basic_repository.py
+++ b/test/tool_shed/functional/test_1000_install_basic_repository.py
@@ -88,14 +88,14 @@
'Test 0000 Basic Repository Features 1',
new_tool_panel_section='test_1000' )
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'filtering_0000', common.test_user_1_name )
- strings_displayed = [ installed_repository.name,
- installed_repository.description,
- installed_repository.owner,
- installed_repository.tool_shed,
+ strings_displayed = [ 'filtering_0000',
+ "Galaxy's filtering tool",
+ 'user1',
+ self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
- self.display_installed_repository_manage_page( installed_repository,
- strings_displayed=[ 'Installed tool shed repository', 'Valid tools', 'Filter1' ] )
+ strings_displayed.extend( [ 'Installed tool shed repository', 'Valid tools', 'Filter1' ] )
+ self.display_installed_repository_manage_page( installed_repository, strings_displayed=strings_displayed )
self.verify_tool_metadata_for_installed_repository( installed_repository )
def test_0030_verify_installed_repository_metadata( self ):
'''Verify that resetting the metadata on an installed repository does not change the metadata.'''
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
--- a/test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
+++ b/test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
@@ -117,9 +117,10 @@
self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
- self.display_installed_repository_manage_page( installed_repository,
- strings_displayed=[ 'Installed tool shed repository', 'Valid tools', 'FreeBayes' ] )
- self.check_installed_repository_tool_dependencies( installed_repository, dependencies_installed=False )
+ strings_displayed.extend( [ 'Installed tool shed repository', 'Valid tools', 'FreeBayes' ] )
+ self.display_installed_repository_manage_page( installed_repository, strings_displayed=strings_displayed )
+ strings_displayed = [ 'freebayes', '0.9.4_9696d0ce8a9', 'samtools', '0.1.18' ]
+ self.check_installed_repository_tool_dependencies( installed_repository, strings_displayed=strings_displayed, dependencies_installed=False )
self.verify_tool_metadata_for_installed_repository( installed_repository )
def test_0020_verify_installed_repository_metadata( self ):
'''Verify that resetting the metadata on an installed repository does not change the metadata.'''
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_1020_install_repository_with_repository_dependencies.py
--- a/test/tool_shed/functional/test_1020_install_repository_with_repository_dependencies.py
+++ b/test/tool_shed/functional/test_1020_install_repository_with_repository_dependencies.py
@@ -109,9 +109,10 @@
self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
- self.display_installed_repository_manage_page( installed_repository,
- strings_displayed=[ 'Installed tool shed repository', 'Valid tools', 'antigenic' ] )
- self.check_installed_repository_tool_dependencies( installed_repository, dependencies_installed=False )
+ strings_displayed.extend( [ 'Installed tool shed repository', 'Valid tools', 'antigenic' ] )
+ self.display_installed_repository_manage_page( installed_repository, strings_displayed=strings_displayed )
+ strings_displayed = [ 'emboss', '5.0.0', 'package' ]
+ self.check_installed_repository_tool_dependencies( installed_repository, strings_displayed=strings_displayed, dependencies_installed=False )
self.verify_tool_metadata_for_installed_repository( installed_repository )
current_datatypes = int( self.get_datatypes_count() )
assert current_datatypes == base_datatypes_count + repository_datatypes_count, 'Installing emboss did not add new datatypes. Expected: %d. Found: %d' % \
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_1030_install_repository_with_dependency_revisions.py
--- a/test/tool_shed/functional/test_1030_install_repository_with_dependency_revisions.py
+++ b/test/tool_shed/functional/test_1030_install_repository_with_dependency_revisions.py
@@ -175,13 +175,14 @@
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'emboss_0030', common.test_user_1_name )
strings_displayed = [ 'emboss_0030',
'Galaxy wrappers for Emboss version 5.0.0 tools for test 0030',
- installed_repository.owner,
- installed_repository.tool_shed,
+ 'user1',
+ self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
- self.display_installed_repository_manage_page( installed_repository,
- strings_displayed=[ 'Installed tool shed repository', 'Valid tools', 'antigenic' ] )
- self.check_installed_repository_tool_dependencies( installed_repository, dependencies_installed=False )
+ strings_displayed.extend( [ 'Installed tool shed repository', 'Valid tools', 'antigenic' ] )
+ self.display_installed_repository_manage_page( installed_repository, strings_displayed=strings_displayed )
+ strings_displayed = [ 'emboss', '5.0.0', 'package' ]
+ self.check_installed_repository_tool_dependencies( installed_repository, strings_displayed=strings_displayed, dependencies_installed=False )
self.verify_tool_metadata_for_installed_repository( installed_repository )
self.update_installed_repository( installed_repository, strings_displayed=[ "there are no updates available" ] )
current_datatypes = int( self.get_datatypes_count() )
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_1040_install_repository_basic_circular_dependencies.py
--- a/test/tool_shed/functional/test_1040_install_repository_basic_circular_dependencies.py
+++ b/test/tool_shed/functional/test_1040_install_repository_basic_circular_dependencies.py
@@ -129,7 +129,7 @@
self.uninstall_repository( installed_freebayes_repository, remove_from_disk=True )
test_db_util.ga_refresh( installed_freebayes_repository )
self.check_galaxy_repository_tool_panel_section( installed_freebayes_repository, '' )
- strings_displayed = [ 'Missing repository', 'freebayes' ]
+ strings_displayed = [ 'Missing repository', 'freebayes', 'filtering_0040', 'user1', "Galaxy's filtering tool for test 0040" ]
self.display_installed_repository_manage_page( installed_filtering_repository, strings_displayed=strings_displayed )
self.check_galaxy_repository_db_status( freebayes_repository_name,
common.test_user_1_name,
@@ -150,7 +150,7 @@
self.uninstall_repository( installed_filtering_repository, remove_from_disk=True )
test_db_util.ga_refresh( installed_filtering_repository )
self.check_galaxy_repository_tool_panel_section( installed_filtering_repository, '' )
- strings_displayed = [ 'Missing repository', 'filtering' ]
+ strings_displayed = [ 'Missing repository', 'filtering', 'freebayes_0040', 'user1', "Galaxy's freebayes tool for test 0040" ]
self.display_installed_repository_manage_page( installed_freebayes_repository, strings_displayed=strings_displayed )
self.check_galaxy_repository_db_status( filtering_repository_name,
common.test_user_1_name,
@@ -162,7 +162,7 @@
self.uninstall_repository( installed_freebayes_repository, remove_from_disk=True )
test_db_util.ga_refresh( installed_freebayes_repository )
self.check_galaxy_repository_tool_panel_section( installed_freebayes_repository, 'freebayes' )
- strings_displayed = [ 'Missing repository', 'freebayes' ]
+ strings_displayed = [ 'Missing repository', 'freebayes', 'filtering_0040', 'user1', "Galaxy's filtering tool for test 0040" ]
self.display_installed_repository_manage_page( installed_filtering_repository, strings_displayed=strings_displayed )
self.check_galaxy_repository_db_status( 'freebayes_0040',
'user1',
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_1050_circular_dependencies_4_levels.py
--- a/test/tool_shed/functional/test_1050_circular_dependencies_4_levels.py
+++ b/test/tool_shed/functional/test_1050_circular_dependencies_4_levels.py
@@ -267,12 +267,10 @@
# This should result in column_maker and convert_chars being installed, and the rest never installed.
installed_repositories = [ ( column_repository_name, common.test_user_1_name ),
( convert_repository_name, common.test_user_1_name ) ]
- uninstalled_repositories = [ ( emboss_datatypes_repository_name, common.test_user_1_name ),
- ( emboss_repository_name, common.test_user_1_name ),
- ( filtering_repository_name, common.test_user_1_name ),
- ( freebayes_repository_name, common.test_user_1_name ),
- ( bismark_repository_name, common.test_user_1_name ) ]
- self.verify_installed_uninstalled_repositories( installed_repositories=installed_repositories, uninstalled_repositories=uninstalled_repositories )
+ strings_displayed = [ 'column_maker_0050', 'convert_chars_0050' ]
+ strings_not_displayed = [ 'emboss_datatypes_0050', 'emboss_0050', 'filtering_0050', 'freebayes_0050', 'bismark_0050' ]
+ self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed, strings_not_displayed=strings_not_displayed )
+ self.verify_installed_repositories( installed_repositories=installed_repositories )
def test_0060_install_emboss_repository( self ):
'''Install emboss_5 with repository dependencies.'''
global running_standalone
@@ -291,9 +289,10 @@
( emboss_repository_name, common.test_user_1_name ),
( convert_repository_name, common.test_user_1_name ),
( bismark_repository_name, common.test_user_1_name ) ]
- uninstalled_repositories = [ ( filtering_repository_name, common.test_user_1_name ),
- ( freebayes_repository_name, common.test_user_1_name ) ]
- self.verify_installed_uninstalled_repositories( installed_repositories=installed_repositories, uninstalled_repositories=uninstalled_repositories )
+ strings_displayed = [ 'emboss_datatypes_0050', 'emboss_0050', 'column_maker_0050', 'convert_chars_0050', 'bismark_0050' ]
+ strings_not_displayed = [ 'filtering_0050', 'freebayes_0050' ]
+ self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed, strings_not_displayed=strings_not_displayed )
+ self.verify_installed_repositories( installed_repositories )
def test_0065_deactivate_datatypes_repository( self ):
'''Deactivate emboss_datatypes and verify that the datatypes count is reduced.'''
original_datatypes = self.get_datatypes_count()
@@ -305,12 +304,10 @@
( emboss_repository_name, common.test_user_1_name ),
( convert_repository_name, common.test_user_1_name ),
( bismark_repository_name, common.test_user_1_name ) ]
- uninstalled_repositories = [ ( emboss_datatypes_repository_name, common.test_user_1_name ),
- ( filtering_repository_name, common.test_user_1_name ),
- ( freebayes_repository_name, common.test_user_1_name ) ]
- self.verify_installed_uninstalled_repositories( installed_repositories=installed_repositories, uninstalled_repositories=uninstalled_repositories )
- strings_not_displayed = [ repository.name, repository.installed_changeset_revision ]
- self.display_galaxy_browse_repositories_page( strings_not_displayed=strings_not_displayed )
+ strings_displayed = [ 'emboss_0050', 'column_maker_0050', 'convert_chars_0050', 'bismark_0050' ]
+ strings_not_displayed = [ 'emboss_datatypes_0050', 'filtering_0050', 'freebayes_0050' ]
+ self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed, strings_not_displayed=strings_not_displayed )
+ self.verify_installed_repositories( installed_repositories )
def test_0070_uninstall_emboss_repository( self ):
'''Uninstall the emboss_5 repository.'''
repository = test_db_util.get_installed_repository_by_name_owner( emboss_repository_name, common.test_user_1_name )
@@ -324,11 +321,10 @@
installed_repositories = [ ( column_repository_name, common.test_user_1_name ),
( convert_repository_name, common.test_user_1_name ),
( bismark_repository_name, common.test_user_1_name ) ]
- uninstalled_repositories = [ ( emboss_datatypes_repository_name, common.test_user_1_name ),
- ( emboss_repository_name, common.test_user_1_name ),
- ( filtering_repository_name, common.test_user_1_name ),
- ( freebayes_repository_name, common.test_user_1_name ) ]
- self.verify_installed_uninstalled_repositories( installed_repositories=installed_repositories, uninstalled_repositories=uninstalled_repositories )
+ strings_displayed = [ 'column_maker_0050', 'convert_chars_0050', 'bismark_0050' ]
+ strings_not_displayed = [ 'emboss_0050', 'emboss_datatypes_0050', 'filtering_0050', 'freebayes_0050' ]
+ self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed, strings_not_displayed=strings_not_displayed )
+ self.verify_installed_repositories( installed_repositories )
def test_0075_install_freebayes_repository( self ):
'''Install freebayes with repository dependencies. This should also automatically reactivate emboss_datatypes and reinstall emboss_5.'''
original_datatypes = self.get_datatypes_count()
@@ -356,6 +352,8 @@
( freebayes_repository_name, common.test_user_1_name ),
( convert_repository_name, common.test_user_1_name ),
( bismark_repository_name, common.test_user_1_name ) ]
- uninstalled_repositories = [ ( filtering_repository_name, common.test_user_1_name ) ]
- self.verify_installed_uninstalled_repositories( installed_repositories=installed_repositories, uninstalled_repositories=uninstalled_repositories )
+ strings_displayed = [ 'emboss_0050', 'emboss_datatypes_0050', 'column_maker_0050', 'convert_chars_0050', 'bismark_0050', 'freebayes_0050' ]
+ strings_not_displayed = [ 'filtering_0050' ]
+ self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed, strings_not_displayed=strings_not_displayed )
+ self.verify_installed_repositories( installed_repositories )
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_1070_invalid_tool.py
--- a/test/tool_shed/functional/test_1070_invalid_tool.py
+++ b/test/tool_shed/functional/test_1070_invalid_tool.py
@@ -79,8 +79,9 @@
self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
+ strings_displayed.extend( [ 'methylation extractor', 'Invalid tools' ] )
self.display_installed_repository_manage_page( installed_repository,
- strings_displayed=[ 'methylation extractor', 'Invalid tools' ],
+ strings_displayed=strings_displayed,
strings_not_displayed=[ 'bisulfite mapper' ] )
self.verify_tool_metadata_for_installed_repository( installed_repository )
self.update_installed_repository( installed_repository, strings_displayed=[ "there are no updates available" ] )
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_1080_advanced_circular_dependency_installation.py
--- a/test/tool_shed/functional/test_1080_advanced_circular_dependency_installation.py
+++ b/test/tool_shed/functional/test_1080_advanced_circular_dependency_installation.py
@@ -199,12 +199,16 @@
common.test_user_1_name )
self.reactivate_repository( installed_convert_repository )
strings_displayed = [ 'convert_chars_0080',
- 'Convert delimiters',
- self.url.replace( 'http://', '' ),
- installed_convert_repository.installed_changeset_revision,
+ 'Compute',
+ 'an expression on every row',
+ '1.1.0',
'column_maker_0080',
- installed_column_repository.installed_changeset_revision,
- 'Installed repository dependencies' ]
+ 'Installed repository dependencies',
+ self.url.replace( 'http://', '' ),
+ installed_column_repository.installed_changeset_revision,
+ installed_convert_repository.installed_changeset_revision ]
+ self.display_installed_repository_manage_page( installed_column_repository,
+ strings_displayed=strings_displayed )
def test_0040_deactivate_column_repository( self ):
'''Deactivate column_maker, verify that convert_chars is installed and missing repository dependencies.'''
installed_convert_repository = test_db_util.get_installed_repository_by_name_owner( convert_repository_name,
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_1087_install_updated_repository_dependencies.py
--- a/test/tool_shed/functional/test_1087_install_updated_repository_dependencies.py
+++ b/test/tool_shed/functional/test_1087_install_updated_repository_dependencies.py
@@ -108,5 +108,5 @@
url = '/admin_toolshed/browse_repositories?operation=activate+or+reinstall&id=%s' % self.security.encode_id( installed_column_repository.id )
self.visit_galaxy_url( url )
self.check_for_strings( strings_displayed )
- uninstalled_repositories = [ ( column_repository_name, common.test_user_1_name ) ]
- self.verify_installed_uninstalled_repositories( uninstalled_repositories=uninstalled_repositories, installed_repositories=[] )
+ strings_not_displayed = [ 'column_maker_1087' ]
+ self.display_galaxy_browse_repositories_page( strings_not_displayed=strings_not_displayed )
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_1090_install_tool_from_tool_search.py
--- a/test/tool_shed/functional/test_1090_install_tool_from_tool_search.py
+++ b/test/tool_shed/functional/test_1090_install_tool_from_tool_search.py
@@ -213,12 +213,10 @@
install_repository_dependencies=False,
new_tool_panel_section='freebayes_1090' )
installed_repositories = [ ( freebayes_repository_name, common.test_user_1_name ) ]
- uninstalled_repositories = [ ( filtering_repository_name, common.test_user_1_name ),
- ( emboss_repository_name, common.test_user_1_name ),
- ( emboss_datatypes_repository_name, common.test_user_1_name ),
- ( bwa_color_repository_name, common.test_user_1_name ),
- ( bwa_base_repository_name, common.test_user_1_name ) ]
- self.verify_installed_uninstalled_repositories( installed_repositories=installed_repositories, uninstalled_repositories=uninstalled_repositories )
+ strings_displayed = [ 'freebayes_0090' ]
+ strings_not_displayed = [ 'filtering_0090', 'emboss_0090', 'emboss_datatypes_0090', 'bwa_color_0090', 'bwa_base_0090' ]
+ self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed, strings_not_displayed=strings_not_displayed )
+ self.verify_installed_repositories( installed_repositories )
def test_0050_install_deactivate_filtering_repository( self ):
'''Install and deactivate filtering.'''
global running_standalone
@@ -235,13 +233,15 @@
new_tool_panel_section='filtering_1090' )
installed_repositories = [ ( filtering_repository_name, common.test_user_1_name ),
( freebayes_repository_name, common.test_user_1_name ) ]
- uninstalled_repositories = [ ( emboss_repository_name, common.test_user_1_name ),
- ( emboss_datatypes_repository_name, common.test_user_1_name ),
- ( bwa_color_repository_name, common.test_user_1_name ),
- ( bwa_base_repository_name, common.test_user_1_name ) ]
- self.verify_installed_uninstalled_repositories( installed_repositories=installed_repositories, uninstalled_repositories=uninstalled_repositories )
+ strings_displayed = [ 'filtering_0090', 'freebayes_0090' ]
+ strings_not_displayed = [ 'emboss_0090', 'emboss_datatypes_0090', 'bwa_color_0090', 'bwa_base_0090' ]
+ self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed, strings_not_displayed=strings_not_displayed )
+ self.verify_installed_repositories( installed_repositories )
filtering_repository = test_db_util.get_installed_repository_by_name_owner( filtering_repository_name, common.test_user_1_name )
self.uninstall_repository( filtering_repository, remove_from_disk=False )
+ strings_displayed = [ 'freebayes_0090' ]
+ strings_not_displayed = [ 'filtering_0090', 'emboss_0090', 'emboss_datatypes_0090', 'bwa_color_0090', 'bwa_base_0090' ]
+ self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed, strings_not_displayed=strings_not_displayed )
def test_0055_install_uninstall_datatypes_repository( self ):
'''Install and uninstall emboss_datatypes.'''
# After this test, the repositories should be in the following states:
@@ -259,9 +259,15 @@
( filtering_repository_name, common.test_user_1_name ),
( bwa_color_repository_name, common.test_user_1_name ),
( bwa_base_repository_name, common.test_user_1_name ) ]
- self.verify_installed_uninstalled_repositories( installed_repositories=installed_repositories, uninstalled_repositories=uninstalled_repositories )
+ strings_displayed = [ 'emboss_datatypes_0090', 'freebayes_0090' ]
+ strings_not_displayed = [ 'filtering_0090', 'emboss_0090', 'bwa_color_0090', 'bwa_base_0090' ]
+ self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed, strings_not_displayed=strings_not_displayed )
+ self.verify_installed_repositories( installed_repositories )
datatypes_repository = test_db_util.get_installed_repository_by_name_owner( emboss_datatypes_repository_name, common.test_user_1_name )
self.uninstall_repository( datatypes_repository, remove_from_disk=True )
+ strings_displayed = [ 'freebayes_0090' ]
+ strings_not_displayed = [ 'emboss_datatypes_0090', 'filtering_0090', 'emboss_0090', 'bwa_color_0090', 'bwa_base_0090' ]
+ self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed, strings_not_displayed=strings_not_displayed )
def test_0060_search_for_bwa_tools( self ):
'''Search for and install the repositories with BWA tools, and verify that this reinstalls emboss_datatypes and reactivates filtering.'''
bwa_color_repository = test_db_util.get_repository_by_name_and_owner( bwa_color_repository_name, common.test_user_1_name )
@@ -292,5 +298,6 @@
( bwa_base_repository_name, common.test_user_1_name ),
( emboss_datatypes_repository_name, common.test_user_1_name ),
( freebayes_repository_name, common.test_user_1_name ) ]
- uninstalled_repositories = []
- self.verify_installed_uninstalled_repositories( installed_repositories=installed_repositories, uninstalled_repositories=uninstalled_repositories )
+ strings_displayed = [ 'emboss_datatypes_0090', 'filtering_0090', 'emboss_0090', 'bwa_color_0090', 'bwa_base_0090', 'freebayes_0090' ]
+ self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
+ self.verify_installed_repositories( installed_repositories )
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_1100_install_repository_with_complex_dependencies.py
--- a/test/tool_shed/functional/test_1100_install_repository_with_complex_dependencies.py
+++ b/test/tool_shed/functional/test_1100_install_repository_with_complex_dependencies.py
@@ -238,19 +238,24 @@
'''Verify that the installed repositories are displayed properly.'''
base_repository = test_db_util.get_installed_repository_by_name_owner( bwa_base_repository_name, common.test_user_1_name )
tool_repository = test_db_util.get_installed_repository_by_name_owner( bwa_tool_repository_name, common.test_user_1_name )
- strings_displayed = [ base_repository.name, base_repository.owner, base_repository.installed_changeset_revision ]
- strings_displayed.extend( [ tool_repository.name, tool_repository.owner, tool_repository.installed_changeset_revision ] )
+ strings_displayed = [ 'bwa_base_repository_0100', 'user1', base_repository.installed_changeset_revision ]
+ strings_displayed.extend( [ 'bwa_tool_repository_0100', 'user1', tool_repository.installed_changeset_revision ] )
strings_displayed.append( self.url.replace( 'http://', '' ) )
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed, strings_not_displayed=[] )
- checks = [ ( tool_repository,
- [ 'bwa_tool_repository_0100', 'user1', tool_repository.installed_changeset_revision ],
- [ 'Missing tool dependencies' ] ),
- ( base_repository,
- [ 'bwa_base_repository_0100', 'user1', base_repository.installed_changeset_revision, 'bwa_tool_repository_0100',
- tool_repository.installed_changeset_revision ],
- [ 'Missing tool dependencies' ] ) ]
- for repository, strings_displayed, strings_not_displayed in checks:
- self.display_installed_repository_manage_page( repository, strings_displayed=strings_displayed, strings_not_displayed=strings_not_displayed )
+ strings_displayed = [ 'bwa_tool_repository_0100', 'user1', tool_repository.installed_changeset_revision ]
+ strings_not_displayed = [ 'Missing tool dependencies' ]
+ self.display_installed_repository_manage_page( tool_repository,
+ strings_displayed=strings_displayed,
+ strings_not_displayed=strings_not_displayed )
+ strings_displayed = [ 'bwa_base_repository_0100',
+ 'user1',
+ 'bwa_tool_repository_0100',
+ base_repository.installed_changeset_revision,
+ tool_repository.installed_changeset_revision ]
+ strings_not_displayed = [ 'Missing tool dependencies' ]
+ self.display_installed_repository_manage_page( base_repository,
+ strings_displayed=strings_displayed,
+ strings_not_displayed=strings_not_displayed )
def test_0055_verify_complex_tool_dependency( self ):
'''Verify that the generated env.sh contains the right data.'''
base_repository = test_db_util.get_installed_repository_by_name_owner( bwa_base_repository_name, common.test_user_1_name )
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_1200_uninstall_and_reinstall_basic_repository.py
--- a/test/tool_shed/functional/test_1200_uninstall_and_reinstall_basic_repository.py
+++ b/test/tool_shed/functional/test_1200_uninstall_and_reinstall_basic_repository.py
@@ -101,8 +101,8 @@
self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
- self.display_installed_repository_manage_page( installed_repository,
- strings_displayed=[ 'Installed tool shed repository', 'Valid tools', 'Filter1' ] )
+ strings_displayed.extend( [ 'Installed tool shed repository', 'Valid tools', 'Filter1' ] )
+ self.display_installed_repository_manage_page( installed_repository, strings_displayed=strings_displayed )
self.verify_tool_metadata_for_installed_repository( installed_repository )
def test_0025_deactivate_filtering_repository( self ):
'''Deactivate the filtering repository without removing it from disk.'''
@@ -122,6 +122,6 @@
self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
- self.display_installed_repository_manage_page( installed_repository,
- strings_displayed=[ 'Installed tool shed repository', 'Valid tools', 'Filter1' ] )
+ strings_displayed.extend( [ 'Installed tool shed repository', 'Valid tools', 'Filter1' ] )
+ self.display_installed_repository_manage_page( installed_repository, strings_displayed=strings_displayed )
self.verify_tool_metadata_for_installed_repository( installed_repository )
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_1210_uninstall_reinstall_repository_with_tool_dependencies.py
--- a/test/tool_shed/functional/test_1210_uninstall_reinstall_repository_with_tool_dependencies.py
+++ b/test/tool_shed/functional/test_1210_uninstall_reinstall_repository_with_tool_dependencies.py
@@ -118,8 +118,8 @@
self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
- self.display_installed_repository_manage_page( installed_repository,
- strings_displayed=[ 'Installed tool shed repository', 'Valid tools', 'FreeBayes' ] )
+ strings_displayed.extend( [ 'Installed tool shed repository', 'Valid tools', 'FreeBayes' ] )
+ self.display_installed_repository_manage_page( installed_repository, strings_displayed=strings_displayed )
self.verify_tool_metadata_for_installed_repository( installed_repository )
def test_0025_deactivate_freebayes_repository( self ):
'''Deactivate the freebayes repository without removing it from disk.'''
@@ -137,6 +137,6 @@
self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
- self.display_installed_repository_manage_page( installed_repository,
- strings_displayed=[ 'Installed tool shed repository', 'Valid tools', 'FreeBayes' ] )
+ strings_displayed.extend( [ 'Installed tool shed repository', 'Valid tools', 'FreeBayes' ] )
+ self.display_installed_repository_manage_page( installed_repository, strings_displayed=strings_displayed )
self.verify_tool_metadata_for_installed_repository( installed_repository )
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_1220_uninstall_reinstall_repository_with_repository_dependencies.py
--- a/test/tool_shed/functional/test_1220_uninstall_reinstall_repository_with_repository_dependencies.py
+++ b/test/tool_shed/functional/test_1220_uninstall_reinstall_repository_with_repository_dependencies.py
@@ -128,8 +128,8 @@
self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
- self.display_installed_repository_manage_page( installed_repository,
- strings_displayed=[ 'Installed tool shed repository', 'Valid tools', 'emboss' ] )
+ strings_displayed.extend( [ 'Installed tool shed repository', 'Valid tools', 'emboss' ] )
+ self.display_installed_repository_manage_page( installed_repository, strings_displayed=strings_displayed )
self.verify_tool_metadata_for_installed_repository( installed_repository )
def test_0025_deactivate_emboss_repository( self ):
'''Deactivate the emboss repository without removing it from disk.'''
@@ -148,6 +148,6 @@
self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
- self.display_installed_repository_manage_page( installed_repository,
- strings_displayed=[ 'Installed tool shed repository', 'Valid tools', 'emboss' ] )
+ strings_displayed.extend( [ 'Installed tool shed repository', 'Valid tools', 'emboss' ] )
+ self.display_installed_repository_manage_page( installed_repository, strings_displayed=strings_displayed )
self.verify_tool_metadata_for_installed_repository( installed_repository )
diff -r ec4da708e45175610a33d16fcfc68732e425f54f -r 8e93ca10b0e2523ba78a02bfb36e371db5f17e0a test/tool_shed/functional/test_1230_uninstall_reinstall_repository_with_dependency_revisions.py
--- a/test/tool_shed/functional/test_1230_uninstall_reinstall_repository_with_dependency_revisions.py
+++ b/test/tool_shed/functional/test_1230_uninstall_reinstall_repository_with_dependency_revisions.py
@@ -188,8 +188,8 @@
self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
- self.display_installed_repository_manage_page( installed_repository,
- strings_displayed=[ 'Installed tool shed repository', 'Valid tools', 'emboss' ] )
+ strings_displayed.extend( [ 'Installed tool shed repository', 'Valid tools', 'emboss' ] )
+ self.display_installed_repository_manage_page( installed_repository, strings_displayed=strings_displayed )
self.verify_tool_metadata_for_installed_repository( installed_repository )
def test_0025_deactivate_emboss_repository( self ):
'''Deactivate the emboss repository without removing it from disk.'''
@@ -207,6 +207,6 @@
self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
- self.display_installed_repository_manage_page( installed_repository,
- strings_displayed=[ 'Installed tool shed repository', 'Valid tools', 'emboss' ] )
+ strings_displayed.extend( [ 'Installed tool shed repository', 'Valid tools', 'emboss' ] )
+ self.display_installed_repository_manage_page( installed_repository, strings_displayed=strings_displayed )
self.verify_tool_metadata_for_installed_repository( installed_repository )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/ec4da708e451/
changeset: ec4da708e451
user: greg
date: 2013-02-15 22:41:24
summary: Enhance tool shed repository metadata to include information about invalid tool dependencies, invalid repository dependencies and orphan tool dependenccies. Display invalid dependencies in separate containers, and display appropriate warning messages when browsing repositories that contain orphan dependencies.
affected #: 14 files
diff -r b9a5aee402b31c2a316de0f68efe66fdb141418e -r ec4da708e45175610a33d16fcfc68732e425f54f lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -129,30 +129,32 @@
requirements_dict[ 'install_dir' ] = install_dir
tool_dependencies[ dependency_key ] = requirements_dict
return tool_dependencies
-def add_tool_shed_orphan_settings_to_tool_dependencies( tool_dependencies, tools ):
- """Inspect all received tool dependencies and label those that are orphans within the repository in the tool shed."""
+def add_orphan_settings_to_tool_dependencies( tool_dependencies, orphan_tool_dependencies ):
+ """Inspect all received tool dependencies and label those that are orphans within the repository."""
+ orphan_env_dependencies = orphan_tool_dependencies.get( 'set_environment', None )
new_tool_dependencies = {}
if tool_dependencies:
for td_key, requirements_dict in tool_dependencies.items():
if td_key in [ 'set_environment' ]:
- new_set_environment_dict_list = []
- for set_environment_dict in requirements_dict:
- type = 'set_environment'
- name = set_environment_dict.get( 'name', None )
- version = None
- is_orphan_in_tool_shed = tool_dependency_is_orphan_in_tool_shed( type, name, version, tools )
- set_environment_dict[ 'is_orphan_in_tool_shed' ] = is_orphan_in_tool_shed
- new_set_environment_dict_list.append( set_environment_dict )
+ # "set_environment": [{"name": "R_SCRIPT_PATH", "type": "set_environment"}]
+ if orphan_env_dependencies:
+ new_set_environment_dict_list = []
+ for set_environment_dict in requirements_dict:
+ if set_environment_dict in orphan_env_dependencies:
+ set_environment_dict[ 'is_orphan' ] = True
+ else:
+ set_environment_dict[ 'is_orphan' ] = False
+ new_set_environment_dict_list.append( set_environment_dict )
new_tool_dependencies[ td_key ] = new_set_environment_dict_list
- new_tool_dependencies[ td_key ] = new_set_environment_dict_list
+ else:
+ new_tool_dependencies[ td_key ] = requirements_dict
else:
- type = requirements_dict.get( 'type', 'package' )
- name = requirements_dict.get( 'name', None )
- version = requirements_dict.get( 'version', None )
- if type and name:
- is_orphan_in_tool_shed = tool_dependency_is_orphan_in_tool_shed( type, name, version, tools )
- requirements_dict[ 'is_orphan_in_tool_shed' ] = is_orphan_in_tool_shed
- new_tool_dependencies[ td_key ] = requirements_dict
+ # {"R/2.15.1": {"name": "R", "readme": "some string", "type": "package", "version": "2.15.1"}
+ if td_key in orphan_tool_dependencies:
+ requirements_dict[ 'is_orphan' ] = True
+ else:
+ requirements_dict[ 'is_orphan' ] = False
+ new_tool_dependencies[ td_key ] = requirements_dict
return new_tool_dependencies
def add_tool_versions( trans, id, repository_metadata, changeset_revisions ):
# Build a dictionary of { 'tool id' : 'parent tool id' } pairs for each tool in repository_metadata.
@@ -318,6 +320,24 @@
datatypes = metadata[ 'datatypes' ]
folder_id, datatypes_root_folder = container_util.build_datatypes_folder( trans, folder_id, datatypes )
containers_dict[ 'datatypes' ] = datatypes_root_folder
+ # Invalid repository dependencies container.
+ if metadata:
+ if 'invalid_repository_dependencies' in metadata:
+ invalid_repository_dependencies = metadata[ 'invalid_repository_dependencies' ]
+ folder_id, invalid_repository_dependencies_root_folder = \
+ container_util.build_invalid_repository_dependencies_root_folder( trans,
+ folder_id,
+ invalid_repository_dependencies )
+ containers_dict[ 'invalid_repository_dependencies' ] = invalid_repository_dependencies_root_folder
+ # Invalid tool dependencies container.
+ if metadata:
+ if 'invalid_tool_dependencies' in metadata:
+ invalid_tool_dependencies = metadata[ 'invalid_tool_dependencies' ]
+ folder_id, invalid_tool_dependencies_root_folder = \
+ container_util.build_invalid_tool_dependencies_root_folder( trans,
+ folder_id,
+ invalid_tool_dependencies )
+ containers_dict[ 'invalid_tool_dependencies' ] = invalid_tool_dependencies_root_folder
# Invalid tools container.
if metadata:
if 'invalid_tools' in metadata:
@@ -348,8 +368,9 @@
if 'tool_dependencies' in metadata:
tool_dependencies = metadata[ 'tool_dependencies' ]
if trans.webapp.name == 'community':
- tools = metadata.get( 'tools', None )
- tool_dependencies = add_tool_shed_orphan_settings_to_tool_dependencies( tool_dependencies, tools )
+ if 'orphan_tool_dependencies' in metadata:
+ orphan_tool_dependencies = metadata[ 'orphan_tool_dependencies' ]
+ tool_dependencies = add_orphan_settings_to_tool_dependencies( tool_dependencies, orphan_tool_dependencies )
folder_id, tool_dependencies_root_folder = container_util.build_tool_dependencies_folder( trans,
folder_id,
tool_dependencies,
@@ -1123,20 +1144,28 @@
if datatypes:
metadata_dict[ 'datatypes' ] = datatypes
return metadata_dict
-def generate_environment_dependency_metadata( elem, tool_dependencies_dict ):
- """The value of env_var_name must match the value of the "set_environment" type in the tool config's <requirements> tag set."""
+def generate_environment_dependency_metadata( elem, valid_tool_dependencies_dict ):
+ """
+ The value of env_var_name must match the value of the "set_environment" type in the tool config's <requirements> tag set, or the tool dependency
+ will be considered an orphan. Tool dependencies of type set_environment are always defined as valid, but may be orphans.
+ """
+ # The value of the received elem looks something like this:
+ # <set_environment version="1.0">
+ # <environment_variable name="JAVA_JAR_PATH" action="set_to">$INSTALL_DIR</environment_variable>
+ # </set_environment>
requirements_dict = {}
for env_elem in elem:
+ # <environment_variable name="JAVA_JAR_PATH" action="set_to">$INSTALL_DIR</environment_variable>
env_name = env_elem.get( 'name', None )
if env_name:
requirements_dict[ 'name' ] = env_name
requirements_dict[ 'type' ] = 'set_environment'
if requirements_dict:
- if 'set_environment' in tool_dependencies_dict:
- tool_dependencies_dict[ 'set_environment' ].append( requirements_dict )
+ if 'set_environment' in valid_tool_dependencies_dict:
+ valid_tool_dependencies_dict[ 'set_environment' ].append( requirements_dict )
else:
- tool_dependencies_dict[ 'set_environment' ] = [ requirements_dict ]
- return tool_dependencies_dict
+ valid_tool_dependencies_dict[ 'set_environment' ] = [ requirements_dict ]
+ return valid_tool_dependencies_dict
def generate_message_for_invalid_tools( trans, invalid_file_tups, repository, metadata_dict, as_html=True, displaying_invalid_tool=False ):
if as_html:
new_line = '<br/>'
@@ -1173,6 +1202,43 @@
correction_msg = exception_msg.replace( '<br/>', new_line ).replace( '<b>', bold_start ).replace( '</b>', bold_end )
message += "%s%s%s - %s%s" % ( bold_start, tool_file, bold_end, correction_msg, new_line )
return message
+def generate_message_for_orphan_tool_dependencies( metadata_dict ):
+ """
+ The introduction of the support for orphan tool dependency definitions in tool shed repositories has resulted in the inability
+ to define an improperly configured tool dependency definition / tool config requirements tag combination as an invalid tool
+ dependency. This is certainly a weakness which cannot be correctly handled since now the only way to categorize a tool dependency
+ as invalid is if it consists of a complex repository dependency that is invalid. Any tool dependency definition other than those
+ is considered valid but perhaps an orphan due to it's actual invalidity.
+ """
+ message = ''
+ status = 'done'
+ if metadata_dict:
+ orphan_tool_dependencies = metadata_dict.get( 'orphan_tool_dependencies', None )
+ if orphan_tool_dependencies:
+ if 'tools' not in metadata_dict and 'invalid_tools' not in metadata_dict:
+ message += "This repository contains no tools, so these tool dependencies are considered orphans within this repository.<br/>"
+ for td_key, requirements_dict in orphan_tool_dependencies.items():
+ if td_key == 'set_environment':
+ # "set_environment": [{"name": "R_SCRIPT_PATH", "type": "set_environment"}]
+ message += "The settings for <b>name</b> and <b>type</b> from a contained tool configuration file's <b>requirement</b> tag "
+ message += "does not match the information for the following tool dependency definitions in the <b>tool_dependencies.xml</b> "
+ message += "file, so these tool dependencies are considered orphans within this repository.<br/>"
+ for env_requirements_dict in requirements_dict:
+ name = env_requirements_dict[ 'name' ]
+ type = env_requirements_dict[ 'type' ]
+ message += "<b>* name:</b> %s, <b>type:</b> %s<br/>" % ( str( name ), str( type ) )
+ else:
+ # "R/2.15.1": {"name": "R", "readme": "some string", "type": "package", "version": "2.15.1"}
+ message += "The settings for <b>name</b>, <b>version</b> and <b>type</b> from a contained tool configuration file's "
+ message += "<b>requirement</b> tag does not match the information for the following tool dependency definitions in the "
+ message += "<b>tool_dependencies.xml</b> file, so these tool dependencies are considered orphans within this repository.<br/>"
+ name = requirements_dict[ 'name' ]
+ type = requirements_dict[ 'type' ]
+ version = requirements_dict[ 'version' ]
+ message += "<b>* name:</b> %s, <b>type:</b> %s, <b>version:</b> %s<br/>" % ( str( name ), str( type ), str( version ) )
+ message += "<br/>"
+ status = 'warning'
+ return message, status
def generate_metadata_for_changeset_revision( app, repository, changeset_revision, repository_clone_url, shed_config_dict=None, relative_install_dir=None,
repository_files_dir=None, resetting_all_metadata_on_repository=False, updating_installed_repository=False,
persist=False ):
@@ -1255,18 +1321,9 @@
# See if we have a repository dependencies defined.
if name == 'repository_dependencies.xml':
path_to_repository_dependencies_config = os.path.join( root, name )
- if app.name == 'community':
- metadata_dict, error_message = generate_repository_dependency_metadata_for_tool_shed( app,
- path_to_repository_dependencies_config,
- metadata_dict )
- if error_message:
- invalid_file_tups.append( ( name, error_message ) )
- elif app.name == 'galaxy':
- metadata_dict, error_message = generate_repository_dependency_metadata_for_installed_repository( app,
- path_to_repository_dependencies_config,
- metadata_dict )
- if error_message:
- invalid_file_tups.append( ( name, error_message ) )
+ metadata_dict, error_message = generate_repository_dependency_metadata( app, path_to_repository_dependencies_config, metadata_dict )
+ if error_message:
+ invalid_file_tups.append( ( name, error_message ) )
# See if we have one or more READ_ME files.
elif name.lower() in readme_file_names:
relative_path_to_readme = get_relative_path_to_repository_file( root,
@@ -1350,11 +1407,12 @@
app.config.tool_data_path = original_tool_data_path
app.config.tool_data_table_config_path = original_tool_data_table_config_path
return metadata_dict, invalid_file_tups
-def generate_package_dependency_metadata( app, elem, tool_dependencies_dict ):
+def generate_package_dependency_metadata( app, elem, valid_tool_dependencies_dict, invalid_tool_dependencies_dict ):
"""
Generate the metadata for a tool dependencies package defined for a repository. The value of package_name must match the value of the "package"
type in the tool config's <requirements> tag set. This method is called from both Galaxy and the tool shed.
"""
+ repository_dependency_is_valid = True
repository_dependency_tup = []
requirements_dict = {}
error_message = ''
@@ -1368,75 +1426,55 @@
if sub_elem.tag == 'readme':
requirements_dict[ 'readme' ] = sub_elem.text
elif sub_elem.tag == 'repository':
- # We have a complex repository dependency.
- current_rd_tups, error_message = handle_repository_elem( app=app,
- repository_elem=sub_elem,
- repository_dependencies_tups=None )
- if current_rd_tups:
- repository_dependency_tup = current_rd_tups[ 0 ]
+ # We have a complex repository dependency. If the retruned value of repository_dependency_is_valid is True, the tool
+ # dependency definition will be set as invalid. This is currently the only case where a tool dependency definition is
+ # considered invalid.
+ repository_dependencies_tup, repository_dependency_is_valid, error_message = handle_repository_elem( app=app,
+ repository_elem=sub_elem )
if requirements_dict:
dependency_key = '%s/%s' % ( package_name, package_version )
- tool_dependencies_dict[ dependency_key ] = requirements_dict
- return tool_dependencies_dict, repository_dependency_tup, error_message
-def generate_repository_dependency_metadata_for_installed_repository( app, repository_dependencies_config, metadata_dict ):
+ if repository_dependency_is_valid:
+ valid_tool_dependencies_dict[ dependency_key ] = requirements_dict
+ else:
+ # Append the error message to the requirements_dict.
+ requirements_dict[ 'error' ] = error_message
+ invalid_tool_dependencies_dict[ dependency_key ] = requirements_dict
+ return valid_tool_dependencies_dict, invalid_tool_dependencies_dict, repository_dependency_tup, repository_dependency_is_valid, error_message
+def generate_repository_dependency_metadata( app, repository_dependencies_config, metadata_dict ):
"""
Generate a repository dependencies dictionary based on valid information defined in the received repository_dependencies_config. This method
- is called only from Galaxy.
+ is called from the tool shed as well as from Galaxy.
"""
- repository_dependencies_tups = []
error_message = ''
try:
# Make sure we're looking at a valid repository_dependencies.xml file.
tree = util.parse_xml( repository_dependencies_config )
root = tree.getroot()
- is_valid = root.tag == 'repositories'
+ xml_is_valid = root.tag == 'repositories'
except Exception, e:
error_message = "Error parsing %s, exception: %s" % ( repository_dependencies_config, str( e ) )
log.debug( error_message )
- is_valid = False
- if is_valid:
- sa_session = app.model.context.current
+ xml_is_valid = False
+ if xml_is_valid:
+ invalid_repository_dependencies_dict = dict( description=root.get( 'description' ) )
+ invalid_repository_dependencies_tups = []
+ valid_repository_dependencies_dict = dict( description=root.get( 'description' ) )
+ valid_repository_dependencies_tups = []
for repository_elem in root.findall( 'repository' ):
- toolshed = repository_elem.attrib[ 'toolshed' ]
- name = repository_elem.attrib[ 'name' ]
- owner = repository_elem.attrib[ 'owner']
- changeset_revision = repository_elem.attrib[ 'changeset_revision' ]
- repository_dependencies_tup = ( toolshed, name, owner, changeset_revision )
- if repository_dependencies_tup not in repository_dependencies_tups:
- repository_dependencies_tups.append( repository_dependencies_tup )
- if repository_dependencies_tups:
- repository_dependencies_dict = dict( description=root.get( 'description' ),
- repository_dependencies=repository_dependencies_tups )
- metadata_dict[ 'repository_dependencies' ] = repository_dependencies_dict
- return metadata_dict, error_message
-def generate_repository_dependency_metadata_for_tool_shed( app, repository_dependencies_config, metadata_dict ):
- """
- Generate a repository dependencies dictionary based on valid information defined in the received repository_dependencies_config. This method
- is called only from the tool shed.
- """
- repository_dependencies_tups = []
- error_message = ''
- try:
- # Make sure we're looking at a valid repository_dependencies.xml file.
- tree = util.parse_xml( repository_dependencies_config )
- root = tree.getroot()
- is_valid = root.tag == 'repositories'
- except Exception, e:
- error_message = "Error parsing %s, exception: %s" % ( repository_dependencies_config, str( e ) )
- log.debug( error_message )
- is_valid = False
- if is_valid:
- for repository_elem in root.findall( 'repository' ):
- current_rd_tups, error_message = handle_repository_elem( app, repository_elem, repository_dependencies_tups )
- if error_message:
- # Log the problem, but generate metadata for the invalid repository dependencies.
- log.debug( error_message )
- for crdt in current_rd_tups:
- repository_dependencies_tups.append( crdt )
- if repository_dependencies_tups:
- repository_dependencies_dict = dict( description=root.get( 'description' ),
- repository_dependencies=repository_dependencies_tups )
- metadata_dict[ 'repository_dependencies' ] = repository_dependencies_dict
+ repository_dependencies_tup, repository_dependency_is_valid, error_message = handle_repository_elem( app, repository_elem )
+ if repository_dependency_is_valid:
+ valid_repository_dependencies_tups.append( repository_dependencies_tup )
+ else:
+ # Append the error_message to the repository dependencies tuple.
+ toolshed, name, owner, changeset_revision = repository_dependencies_tup
+ repository_dependencies_tup = ( toolshed, name, owner, changeset_revision, error_message )
+ invalid_repository_dependencies_tups.append( repository_dependencies_tup )
+ if invalid_repository_dependencies_tups:
+ invalid_repository_dependencies_dict[ 'repository_dependencies' ] = invalid_repository_dependencies_tups
+ metadata_dict[ 'invalid_repository_dependencies' ] = invalid_repository_dependencies_dict
+ if valid_repository_dependencies_tups:
+ valid_repository_dependencies_dict[ 'repository_dependencies' ] = valid_repository_dependencies_tups
+ metadata_dict[ 'repository_dependencies' ] = valid_repository_dependencies_dict
return metadata_dict, error_message
def generate_sharable_link_for_repository_in_tool_shed( trans, repository, changeset_revision=None ):
"""Generate the URL for sharing a repository that is in the tool shed."""
@@ -1452,12 +1490,27 @@
If the combination of name, version and type of each element is defined in the <requirement> tag for at least one tool in the repository,
then update the received metadata_dict with information from the parsed tool_dependencies_config.
"""
+ """
+ "{"orphan_tool_dependencies":
+ {"bwa/0.5.9":
+ {"name": "bwa",
+ "readme": "\\nCompiling BWA requires zlib and libpthread to be present on your system.\\n ",
+ "type": "package", "version": "0.5.9"}},
+ "tool_dependencies":
+ {"bwa/0.5.9":
+ {"name": "bwa",
+ "readme": "\\nCompiling BWA requires zlib and libpthread to be present on your system.\\n ",
+ "type": "package",
+ "version": "0.5.9"}}}"
+ """
error_message = ''
if original_repository_metadata:
# Keep a copy of the original tool dependencies dictionary and the list of tool dictionaries in the metadata.
- original_tool_dependencies_dict = original_repository_metadata.get( 'tool_dependencies', None )
+ original_valid_tool_dependencies_dict = original_repository_metadata.get( 'tool_dependencies', None )
+ original_invalid_tool_dependencies_dict = original_repository_metadata.get( 'invalid_tool_dependencies', None )
else:
- original_tool_dependencies_dict = None
+ original_valid_tool_dependencies_dict = None
+ original_invalid_tool_dependencies_dict = None
try:
tree = ElementTree.parse( tool_dependencies_config )
except Exception, e:
@@ -1466,81 +1519,53 @@
return metadata_dict, error_message
root = tree.getroot()
ElementInclude.include( root )
- tool_dependencies_dict = {}
- repository_dependency_tups = []
+ tool_dependency_is_valid = True
+ valid_tool_dependencies_dict = {}
+ invalid_tool_dependencies_dict = {}
+ valid_repository_dependency_tups = []
+ invalid_repository_dependency_tups = []
+ description = root.get( 'description' )
for elem in root:
if elem.tag == 'package':
- tool_dependencies_dict, repository_dependency_tup, message = generate_package_dependency_metadata( app, elem, tool_dependencies_dict )
- if repository_dependency_tup and repository_dependency_tup not in repository_dependency_tups:
- repository_dependency_tups.append( repository_dependency_tup )
- if message:
- log.debug( message )
- error_message = '%s %s' % ( error_message, message )
+ valid_tool_dependencies_dict, invalid_tool_dependencies_dict, repository_dependency_tup, repository_dependency_is_valid, message = \
+ generate_package_dependency_metadata( app, elem, valid_tool_dependencies_dict, invalid_tool_dependencies_dict )
+ if repository_dependency_is_valid:
+ if repository_dependency_tup and repository_dependency_tup not in valid_repository_dependency_tups:
+ # We have a valid complex repository dependency.
+ valid_repository_dependency_tups.append( repository_dependency_tup )
+ else:
+ if repository_dependency_tup and repository_dependency_tup not in invalid_repository_dependency_tups:
+ # We have an invalid complex repository dependency, so mark the tool dependency as invalid.
+ tool_dependency_is_valid = False
+ # Append the error message to the invalid repository dependency tuple.
+ repository_dependency_tup.append( message )
+ invalid_repository_dependency_tups.append( repository_dependency_tup )
+ error_message = '%s %s' % ( error_message, message )
elif elem.tag == 'set_environment':
- tool_dependencies_dict = generate_environment_dependency_metadata( elem, tool_dependencies_dict )
- if tool_dependencies_dict:
- if original_tool_dependencies_dict:
+ # Tool dependencies of this type are always considered valid, but may be orphans.
+ valid_tool_dependencies_dict = generate_environment_dependency_metadata( elem, valid_tool_dependencies_dict )
+ if valid_tool_dependencies_dict:
+ if original_valid_tool_dependencies_dict:
# We're generating metadata on an update pulled to a tool shed repository installed into a Galaxy instance, so handle changes to
# tool dependencies appropriately.
- handle_existing_tool_dependencies_that_changed_in_update( app, repository, original_tool_dependencies_dict, tool_dependencies_dict )
- metadata_dict[ 'tool_dependencies' ] = tool_dependencies_dict
- if repository_dependency_tups:
- repository_dependencies_dict = metadata_dict.get( 'repository_dependencies', None )
- for repository_dependency_tup in repository_dependency_tups:
- rd_tool_shed, rd_name, rd_owner, rd_changeset_revision = repository_dependency_tup
- if app.name == 'community':
- if tool_shed_is_this_tool_shed( rd_tool_shed ):
- # Make sure the repository name id valid.
- valid_named_repository = get_repository_by_name( app, rd_name )
- if valid_named_repository:
- # See if the owner is valid.
- valid_owned_repository = get_repository_by_name_and_owner( app, rd_name, rd_owner )
- if valid_owned_repository:
- # See if the defined changeset revision is valid.
- if not changeset_is_valid( app, valid_owned_repository, rd_changeset_revision ):
- err_msg = "Ignoring repository dependency definition for tool shed %s, name %s, owner %s, changeset revision %s "% \
- ( rd_tool_shed, rd_name, rd_owner, rd_changeset_revision )
- err_msg += "because the changeset revision is invalid. "
- log.debug( err_msg )
- error_message += err_msg
- else:
- err_msg = "Ignoring repository dependency definition for tool shed %s, name %s, owner %s, changeset revision %s "% \
- ( rd_tool_shed, rd_name, rd_owner, rd_changeset_revision )
- err_msg += "because the owner is invalid. "
- log.debug( err_msg )
- error_message += err_msg
- else:
- err_msg = "Ignoring repository dependency definition for tool shed %s, name %s, owner %s, changeset revision %s "% \
- ( rd_tool_shed, rd_name, rd_owner, rd_changeset_revision )
- err_msg += "because the name is invalid. "
- log.debug( err_msg )
- error_message += err_msg
- else:
- err_msg = "Repository dependencies are currently supported only within the same tool shed. Ignoring repository dependency definition "
- err_msg += "for tool shed %s, name %s, owner %s, changeset revision %s. " % ( rd_tool_shed, rd_name, rd_owner, rd_changeset_revision )
- log.debug( err_msg )
- error_message += err_msg
- else:
- repository_owner = repository.owner
- rd_key = container_util.generate_repository_dependencies_key_for_repository( toolshed_base_url=rd_tool_shed,
- repository_name=rd_name,
- repository_owner=rd_owner,
- changeset_revision=rd_changeset_revision )
- if repository_dependencies_dict:
- if rd_key in repository_dependencies_dict:
- repository_dependencies = repository_dependencies_dict[ rd_key ]
- for repository_dependency_tup in repository_dependency_tups:
- if repository_dependency_tup not in repository_dependencies:
- repository_dependencies.append( repository_dependency_tup )
- repository_dependencies_dict[ rd_key ] = repository_dependencies
- else:
- repository_dependencies_dict[ rd_key ] = repository_dependency_tups
- else:
- repository_dependencies_dict = dict( root_key=rd_key,
- description=root.get( 'description' ),
- repository_dependencies=repository_dependency_tups )
- if repository_dependencies_dict:
- metadata_dict[ 'repository_dependencies' ] = repository_dependencies_dict
+ handle_existing_tool_dependencies_that_changed_in_update( app, repository, original_valid_tool_dependencies_dict, valid_tool_dependencies_dict )
+ metadata_dict[ 'tool_dependencies' ] = valid_tool_dependencies_dict
+ if invalid_tool_dependencies_dict:
+ metadata_dict[ 'invalid_tool_dependencies' ] = invalid_tool_dependencies_dict
+ if valid_repository_dependency_tups:
+ metadata_dict = update_repository_dependencies_metadata( metadata=metadata_dict,
+ repository_dependency_tups=valid_repository_dependency_tups,
+ is_valid=True,
+ description=description )
+ if invalid_repository_dependency_tups:
+ metadata_dict = update_repository_dependencies_metadata( metadata=metadata_dict,
+ repository_dependency_tups=invalid_repository_dependency_tups,
+ is_valid=False,
+ description=description )
+ # Determine and store orphan tool dependencies.
+ orphan_tool_dependencies = get_orphan_tool_dependencies( metadata_dict )
+ if orphan_tool_dependencies:
+ metadata_dict[ 'orphan_tool_dependencies' ] = orphan_tool_dependencies
return metadata_dict, error_message
def generate_tool_elem( tool_shed, repository_name, changeset_revision, owner, tool_file_path, tool, tool_section ):
if tool_section is not None:
@@ -1926,6 +1951,33 @@
sorted_changeset_tups = sorted( changeset_tups )
sorted_changeset_revisions = [ changeset_tup[ 1 ] for changeset_tup in sorted_changeset_tups ]
return sorted_changeset_revisions
+def get_orphan_tool_dependencies( metadata ):
+ """Inspect tool dependencies included in the received metadata and determine if any of them are orphans within the repository."""
+ orphan_tool_dependencies_dict = {}
+ if metadata:
+ tools = metadata.get( 'tools', None )
+ tool_dependencies = metadata.get( 'tool_dependencies', None )
+ if tool_dependencies:
+ for td_key, requirements_dict in tool_dependencies.items():
+ if td_key in [ 'set_environment' ]:
+ for set_environment_dict in requirements_dict:
+ type = 'set_environment'
+ name = set_environment_dict.get( 'name', None )
+ version = None
+ if name:
+ if tool_dependency_is_orphan( type, name, version, tools ):
+ if td_key in orphan_tool_dependencies_dict:
+ orphan_tool_dependencies_dict[ td_key ].append( set_environment_dict )
+ else:
+ orphan_tool_dependencies_dict[ td_key ] = [ set_environment_dict ]
+ else:
+ type = requirements_dict.get( 'type', None )
+ name = requirements_dict.get( 'name', None )
+ version = requirements_dict.get( 'version', None )
+ if type and name:
+ if tool_dependency_is_orphan( type, name, version, tools ):
+ orphan_tool_dependencies_dict[ td_key ] = requirements_dict
+ return orphan_tool_dependencies_dict
def get_parent_id( trans, id, old_id, version, guid, changeset_revisions ):
parent_id = None
# Compare from most recent to oldest.
@@ -2409,6 +2461,14 @@
( str( rd_changeset_revision ), str( rd_name ), str( rd_owner ), str( repository_name ) )
log.debug( message )
return updated_key_rd_dicts
+def get_updated_changeset_revisions_from_tool_shed( tool_shed_url, name, owner, changeset_revision ):
+ """Get all appropriate newer changeset revisions for the repository defined by the received tool_shed_url / name / owner combination."""
+ url = url_join( tool_shed_url,
+ 'repository/updated_changeset_revisions?name=%s&owner=%s&changeset_revision=%s' % ( name, owner, changeset_revision ) )
+ response = urllib2.urlopen( url )
+ text = response.read()
+ response.close()
+ return text
def get_url_from_repository_tool_shed( app, repository ):
"""
The stored value of repository.tool_shed is something like: toolshed.g2.bx.psu.edu. We need the URL to this tool shed, which is
@@ -2635,63 +2695,78 @@
all_repository_dependencies=all_repository_dependencies,
handled_key_rd_dicts=handled_key_rd_dicts,
circular_repository_dependencies=circular_repository_dependencies )
-def handle_repository_elem( app, repository_elem, repository_dependencies_tups ):
+def handle_repository_elem( app, repository_elem ):
"""
Process the received repository_elem which is a <repository> tag either from a repository_dependencies.xml file or a tool_dependencies.xml file.
If the former, we're generating repository dependencies metadata for a repository in the tool shed. If the latter, we're generating package
- dependency metadata with in Galaxy or the tool shed.
+ dependency metadata within Galaxy or the tool shed.
"""
- if repository_dependencies_tups is None:
- new_rd_tups = []
- else:
- new_rd_tups = [ rdt for rdt in repository_dependencies_tups ]
+ sa_session = app.model.context.current
+ is_valid = True
error_message = ''
- sa_session = app.model.context.current
toolshed = repository_elem.attrib[ 'toolshed' ]
name = repository_elem.attrib[ 'name' ]
owner = repository_elem.attrib[ 'owner' ]
changeset_revision = repository_elem.attrib[ 'changeset_revision' ]
+ repository_dependencies_tup = ( toolshed, name, owner, changeset_revision )
user = None
repository = None
if app.name == 'galaxy':
- # We're in Galaxy.
- try:
- repository = sa_session.query( app.model.ToolShedRepository ) \
- .filter( and_( app.model.ToolShedRepository.table.c.name == name,
- app.model.ToolShedRepository.table.c.owner == owner ) ) \
- .first()
- except:
- error_message = "Invalid name <b>%s</b> or owner <b>%s</b> defined for repository. Repository dependencies will be ignored." % ( name, owner )
+ # We're in Galaxy. We reach here when we're generating the metadata for a tool dependencies package defined for a repository or when we're
+ # generating metadata for an installed repository..
+ #try:
+ # See if we can locate the installed repository via the changeset_revision defined in the repository_elem (it may be outdated). If we're
+ # successful in locating an installed repository with the attributes defined in the repository_elem, we know it is valid.
+ repository = get_repository_for_dependency_relationship( app, toolshed, name, owner, changeset_revision )
+ if repository:
+ return repository_dependencies_tup, is_valid, error_message
+ else:
+ # Send a request to the tool shed to retrieve appropriate additional changeset revisions with which the repository may have been installed.
+ try:
+ # Hopefully the tool shed is accessible.
+ text = get_updated_changeset_revisions_from_tool_shed( toolshed, name, owner, changeset_revision )
+ except:
+ text = None
+ if text:
+ updated_changeset_revisions = util.listify( text )
+ for updated_changeset_revision in updated_changeset_revisions:
+ repository = get_repository_for_dependency_relationship( app, toolshed, name, owner, updated_changeset_revision )
+ if repository:
+ return repository_dependencies_tup, is_valid, error_message
+ # We'll currently default to setting the repository dependency definition as invalid if an installed repository cannot be found.
+ # This may not be ideal because the tool shed may have simply been inaccessible when metadata was being generated for the installed
+ # tool shed repository.
+ error_message = "Ignoring invalid repository dependency definition for tool shed %s, name %s, owner %s, changeset revision %s "% \
+ ( toolshed, name, owner, changeset_revision )
log.debug( error_message )
- return new_rd_tups, error_message
- repository_dependencies_tup = ( toolshed, name, owner, changeset_revision )
- if repository_dependencies_tup not in new_rd_tups:
- new_rd_tups.append( repository_dependencies_tup )
+ is_valid = False
+ return repository_dependencies_tup, is_valid, error_message
else:
# We're in the tool shed.
if tool_shed_is_this_tool_shed( toolshed ):
- # Append the repository dependency definition regardless of whether it's valid or not, as Galaxy needs this to
- # properly display an error when the repository dependency is invalid at the time of installation.
- repository_dependencies_tup = ( toolshed, name, owner, changeset_revision )
- if repository_dependencies_tup not in new_rd_tups:
- new_rd_tups.append( repository_dependencies_tup )
try:
user = sa_session.query( app.model.User ) \
.filter( app.model.User.table.c.username == owner ) \
.one()
- except Exception, e:
- error_message = "Invalid owner <b>%s</b> defined for repository <b>%s</b>. Repository dependencies will be ignored." % ( str( owner ), str( name ) )
+ except Exception, e:
+ error_message = "Ignoring repository dependency definition for tool shed %s, name %s, owner %s, changeset revision %s "% \
+ ( toolshed, name, owner, changeset_revision )
+ error_message += "because the owner is invalid. "
log.debug( error_message )
- return new_rd_tups, error_message
+ is_valid = False
+ return repository_dependencies_tup, is_valid, error_message
try:
repository = sa_session.query( app.model.Repository ) \
.filter( and_( app.model.Repository.table.c.name == name,
app.model.Repository.table.c.user_id == user.id ) ) \
.one()
except:
- error_message = "Invalid repository name <b>%s</b> defined. Repository dependencies will be ignored." % str( name )
+ error_message = "Ignoring repository dependency definition for tool shed %s, name %s, owner %s, changeset revision %s "% \
+ ( toolshed, name, owner, changeset_revision )
+ error_message += "because the name is invalid. "
log.debug( error_message )
- return new_rd_tups, error_message
+ is_valid = False
+ return repository_dependencies_tup, is_valid, error_message
# Find the specified changeset revision in the repository's changelog to see if it's valid.
found = False
repo = hg.repository( get_configured_ui(), repository.repo_path( app ) )
@@ -2701,15 +2776,20 @@
found = True
break
if not found:
- error_message = "Invalid changeset revision <b>%s</b> defined. Repository dependencies will be ignored." % str( changeset_revision )
+ error_message = "Ignoring repository dependency definition for tool shed %s, name %s, owner %s, changeset revision %s "% \
+ ( toolshed, name, owner, changeset_revision )
+ error_message += "because the changeset revision is invalid. "
log.debug( error_message )
- return new_rd_tups, error_message
+ is_valid = False
+ return repository_dependencies_tup, is_valid, error_message
else:
- # Repository dependencies are currentlhy supported within a single tool shed.
- error_message = "Invalid tool shed <b>%s</b> defined for repository <b>%s</b>. " % ( toolshed, name )
- error_message += "Repository dependencies are currently supported within a single tool shed."
+ # Repository dependencies are currently supported within a single tool shed.
+ error_message = "Repository dependencies are currently supported only within the same tool shed. Ignoring repository dependency definition "
+ error_message += "for tool shed %s, name %s, owner %s, changeset revision %s. " % ( toolshed, name, owner, changeset_revision )
log.debug( error_message )
- return new_rd_tups, error_message
+ is_valid = False
+ return repository_dependencies_tup, is_valid, error_message
+ return repository_dependencies_tup, is_valid, error_message
def handle_sample_files_and_load_tool_from_disk( trans, repo_files_dir, tool_config_filepath, work_dir ):
# Copy all sample files from disk to a temporary directory since the sample files may be in multiple directories.
message = ''
@@ -2761,31 +2841,6 @@
message = str( e )
error = True
return error, message
-def has_orphan_tool_dependencies_in_tool_shed( metadata ):
- """Inspect tool dependencies included in the received metadata and determine if any of them are orphans within the repository in the tool shed."""
- if metadata:
- tools = metadata.get( 'tools', None )
- tool_dependencies = metadata.get( 'tool_dependencies', None )
- if tool_dependencies:
- for td_key, requirements_dict in tool_dependencies.items():
- if td_key in [ 'set_environment' ]:
- for set_environment_dict in requirements_dict:
- type = 'set_environment'
- name = set_environment_dict.get( 'name', None )
- version = None
- if name:
- is_orphan_in_tool_shed = tool_dependency_is_orphan_in_tool_shed( type, name, version, tools )
- if is_orphan_in_tool_shed:
- return True
- else:
- type = requirements_dict.get( 'type', None )
- name = requirements_dict.get( 'name', None )
- version = requirements_dict.get( 'version', None )
- if type and name:
- is_orphan_in_tool_shed = tool_dependency_is_orphan_in_tool_shed( type, name, version, tools )
- if is_orphan_in_tool_shed:
- return True
- return False
def has_previous_repository_reviews( trans, repository, changeset_revision ):
"""Determine if a repository has a changeset revision review prior to the received changeset revision."""
repo = hg.repository( get_configured_ui(), repository.repo_path( trans.app ) )
@@ -2839,6 +2894,8 @@
return True
return False
def is_downloadable( metadata_dict ):
+ # NOTE: although repository README files are considered Galaxy utilities, they have no effect on determining if a revision is instakllable.
+ # See the comments in the compare_readme_files() method.
if 'datatypes' in metadata_dict:
# We have proprietary datatypes.
return True
@@ -3640,6 +3697,7 @@
"""Set metadata on the repository tip in the tool shed - this method is not called from Galaxy."""
error_message, status = set_repository_metadata( trans, repository, content_alert_str=content_alert_str, **kwd )
if error_message:
+ # FIXME: This probably should not redirect since this method is called from the upload controller as well as the repository controller.
# If there is an error, display it.
return trans.response.send_redirect( web.url_for( controller='repository',
action='manage_repository',
@@ -3654,7 +3712,7 @@
except:
file_name = fpath
return file_name
-def tool_dependency_is_orphan_in_tool_shed( type, name, version, tools ):
+def tool_dependency_is_orphan( type, name, version, tools ):
"""
Determine if the combination of the received type, name and version is defined in the <requirement> tag for at least one tool in the received list of tools.
If not, the tool dependency defined by the combination is considered an orphan in it's repository in the tool shed.
@@ -3841,6 +3899,39 @@
# It would be nice if we could use mercurial's purge extension to remove untracked files. The problem is that
# purging is not supported by the mercurial API.
commands.update( get_configured_ui(), repo, rev=ctx_rev )
+def update_repository_dependencies_metadata( metadata, repository_dependency_tups, is_valid, description ):
+ if is_valid:
+ repository_dependencies_dict = metadata.get( 'repository_dependencies', None )
+ else:
+ repository_dependencies_dict = metadata.get( 'invalid_repository_dependencies', None )
+ for repository_dependency_tup in repository_dependency_tups:
+ if is_valid:
+ tool_shed, name, owner, changeset_revision = repository_dependency_tup
+ else:
+ tool_shed, name, owner, changeset_revision, error_message = repository_dependency_tup
+ rd_key = container_util.generate_repository_dependencies_key_for_repository( toolshed_base_url=tool_shed,
+ repository_name=name,
+ repository_owner=owner,
+ changeset_revision=changeset_revision )
+ if repository_dependencies_dict:
+ if rd_key in repository_dependencies_dict:
+ repository_dependencies = repository_dependencies_dict[ rd_key ]
+ for repository_dependency_tup in repository_dependency_tups:
+ if repository_dependency_tup not in repository_dependencies:
+ repository_dependencies.append( repository_dependency_tup )
+ repository_dependencies_dict[ rd_key ] = repository_dependencies
+ else:
+ repository_dependencies_dict[ rd_key ] = repository_dependency_tups
+ else:
+ repository_dependencies_dict = dict( root_key=rd_key,
+ description=description,
+ repository_dependencies=repository_dependency_tups )
+ if repository_dependencies_dict:
+ if is_valid:
+ metadata[ 'repository_dependencies' ] = repository_dependencies_dict
+ else:
+ metadata[ 'invalid_repository_dependencies' ] = repository_dependencies_dict
+ return metadata
def url_join( *args ):
parts = []
for arg in args:
diff -r b9a5aee402b31c2a316de0f68efe66fdb141418e -r ec4da708e45175610a33d16fcfc68732e425f54f lib/galaxy/webapps/community/controllers/repository.py
--- a/lib/galaxy/webapps/community/controllers/repository.py
+++ b/lib/galaxy/webapps/community/controllers/repository.py
@@ -2001,11 +2001,9 @@
all_repository_dependencies=None,
handled_key_rd_dicts=None )
if metadata:
- if 'repository_dependencies' in metadata and not repository_dependencies:
- message += 'The repository dependency definitions for this repository are invalid and will be ignored. Make sure valid <b>toolshed</b>, '
- message += '<b>name</b>, <b>owner</b> and <b>changeset_revision</b> values are defined in the contained <b>repository_dependencies.xml</b> '
- message += 'file to correct this problem.'
- status = 'error'
+ if 'orphan_tool_dependencies' in metadata:
+ orphan_message, status = suc.generate_message_for_orphan_tool_dependencies( metadata )
+ message += orphan_message
if is_malicious:
if trans.app.security_agent.can_push( trans.app, trans.user, repository ):
message += malicious_error_can_push
@@ -2221,7 +2219,7 @@
message = suc.generate_message_for_invalid_tools( trans, invalid_file_tups, repository, metadata_dict )
status = 'error'
else:
- message = "All repository metadata has been reset."
+ message = "All repository metadata has been reset. "
status = 'done'
return trans.response.send_redirect( web.url_for( controller='repository',
action='manage_repository',
@@ -2755,9 +2753,9 @@
all_repository_dependencies=None,
handled_key_rd_dicts=None )
if metadata:
- if 'repository_dependencies' in metadata and not repository_dependencies:
- message += 'The repository dependency definitions for this repository are invalid and will be ignored.'
- status = 'error'
+ if 'orphan_tool_dependencies' in metadata:
+ orphan_message, status = suc.generate_message_for_orphan_tool_dependencies( metadata )
+ message += orphan_message
else:
repository_metadata_id = None
metadata = None
diff -r b9a5aee402b31c2a316de0f68efe66fdb141418e -r ec4da708e45175610a33d16fcfc68732e425f54f lib/galaxy/webapps/community/controllers/upload.py
--- a/lib/galaxy/webapps/community/controllers/upload.py
+++ b/lib/galaxy/webapps/community/controllers/upload.py
@@ -156,7 +156,7 @@
else:
source_type = "file"
source = uploaded_file_filename
- message = "The %s '%s' has been successfully%suploaded to the repository. " % ( source_type, source, uncompress_str )
+ message = "The %s <b>%s</b> has been successfully%suploaded to the repository. " % ( source_type, source, uncompress_str )
if istar and ( undesirable_dirs_removed or undesirable_files_removed ):
items_removed = undesirable_dirs_removed + undesirable_files_removed
message += " %d undesirable items (.hg .svn .git directories, .DS_Store, hgrc files, etc) were removed from the archive. " % items_removed
@@ -169,16 +169,32 @@
suc.set_repository_metadata_due_to_new_tip( trans, repository, content_alert_str=content_alert_str, **kwd )
# Provide a warning message if a tool_dependencies.xml file is provided, but tool dependencies weren't loaded due to a requirement tag mismatch
# or some other problem.
- if suc.get_config_from_disk( 'tool_dependencies.xml', repo_dir ):
- if repository.metadata_revisions:
- # A repository's metadata revisions are order descending by update_time, so the zeroth revision will be the tip just after an upload.
- metadata_dict = repository.metadata_revisions[0].metadata
- else:
- metadata_dict = {}
- if suc.has_orphan_tool_dependencies_in_tool_shed( metadata_dict ):
- message += 'Name, version and type from a tool requirement tag does not match the information in the "tool_dependencies.xml file", '
- message += 'so one or more of the defined tool dependencies are considered orphans within this repository.'
- status = 'warning'
+ if repository.metadata_revisions:
+ # A repository's metadata revisions are order descending by update_time, so the zeroth revision will be the tip just after an upload.
+ metadata_dict = repository.metadata_revisions[0].metadata
+ else:
+ metadata_dict = {}
+ # Handle messaging for orphan tool dependencies.
+ orphan_message, status = suc.generate_message_for_orphan_tool_dependencies( metadata_dict )
+ if orphan_message:
+ message += orphan_message
+ # Display message for invalid tool sependencies.
+ invalid_tool_dependencies = metadata_dict.get( 'invalid_tool_dependencies', None )
+ if invalid_tool_dependencies:
+ for td_key, requirement_dict in invalid_tool_dependencies.items():
+ error = requirement_dict.get( 'error', None )
+ if error:
+ message = "%s %s" % ( message, str( error ) )
+ status = 'error'
+ # Display message for invalid repository dependencies.
+ invalid_repository_dependencies_dict = metadata_dict.get( 'invalid_repository_dependencies', None )
+ if invalid_repository_dependencies_dict:
+ invalid_repository_dependencies = invalid_repository_dependencies_dict[ 'invalid_repository_dependencies' ]
+ for repository_dependency_tup in invalid_repository_dependencies:
+ toolshed, name, owner, changeset_revision, error = repository_dependency_tup
+ if error:
+ message += "%s %s" % ( message, str( error ) )
+ status = 'error'
# Reset the tool_data_tables by loading the empty tool_data_table_conf.xml file.
suc.reset_tool_data_tables( trans.app )
trans.response.send_redirect( web.url_for( controller='repository',
diff -r b9a5aee402b31c2a316de0f68efe66fdb141418e -r ec4da708e45175610a33d16fcfc68732e425f54f lib/galaxy/webapps/community/util/container_util.py
--- a/lib/galaxy/webapps/community/util/container_util.py
+++ b/lib/galaxy/webapps/community/util/container_util.py
@@ -15,6 +15,8 @@
self.description = None
self.datatypes = []
self.folders = []
+ self.invalid_repository_dependencies = []
+ self.invalid_tool_dependencies = []
self.invalid_tools = []
self.valid_tools = []
self.tool_dependencies = []
@@ -54,6 +56,16 @@
self.mimetype = mimetype
self.subclass = subclass
+class InvalidRepositoryDependency( object ):
+ """Invalid repository dependency definition object"""
+ def __init__( self, id=None, toolshed=None, repository_name=None, repository_owner=None, changeset_revision=None, error=None ):
+ self.id = id
+ self.toolshed = toolshed
+ self.repository_name = repository_name
+ self.repository_owner = repository_owner
+ self.changeset_revision = changeset_revision
+ self.error = error
+
class InvalidTool( object ):
"""Invalid tool object"""
def __init__( self, id=None, tool_config=None, repository_id=None, changeset_revision=None, repository_installation_status=None ):
@@ -63,6 +75,15 @@
self.changeset_revision = changeset_revision
self.repository_installation_status = repository_installation_status
+class InvalidToolDependency( object ):
+ """Invalid tool dependency definition object"""
+ def __init__( self, id=None, name=None, version=None, type=None, error=None ):
+ self.id = id
+ self.name = name
+ self.version = version
+ self.type = type
+ self.error = error
+
class ReadMe( object ):
"""Readme text object"""
def __init__( self, id=None, name=None, text=None ):
@@ -158,6 +179,79 @@
else:
datatypes_root_folder = None
return folder_id, datatypes_root_folder
+def build_invalid_repository_dependencies_root_folder( trans, folder_id, invalid_repository_dependencies_dict ):
+ """Return a folder hierarchy containing invalid repository dependencies."""
+ label = 'Invalid repository dependencies'
+ if invalid_repository_dependencies_dict:
+ invalid_repository_dependency_id = 0
+ folder_id += 1
+ invalid_repository_dependencies_root_folder = Folder( id=folder_id, key='root', label='root', parent=None )
+ folder_id += 1
+ invalid_repository_dependencies_folder = Folder( id=folder_id,
+ key='invalid_repository_dependencies',
+ label=label,
+ parent=invalid_repository_dependencies_root_folder )
+ invalid_repository_dependencies_root_folder.folders.append( invalid_repository_dependencies_folder )
+ invalid_repository_dependencies = invalid_repository_dependencies_dict[ 'repository_dependencies' ]
+ for invalid_repository_dependency in invalid_repository_dependencies:
+ folder_id += 1
+ invalid_repository_dependency_id += 1
+ toolshed, name, owner, changeset_revision, error = invalid_repository_dependency
+ key = generate_repository_dependencies_key_for_repository( toolshed, name, owner, changeset_revision )
+ label = "Repository <b>%s</b> revision <b>%s</b> owned by <b>%s</b>" % ( name, changeset_revision, owner )
+ folder = Folder( id=folder_id,
+ key=key,
+ label=label,
+ parent=invalid_repository_dependencies_folder )
+ ird = InvalidRepositoryDependency( id=invalid_repository_dependency_id,
+ toolshed=toolshed,
+ repository_name=name,
+ repository_owner=owner,
+ changeset_revision=changeset_revision,
+ error=error )
+ folder.invalid_repository_dependencies.append( ird )
+ invalid_repository_dependencies_folder.folders.append( folder )
+ else:
+ invalid_repository_dependencies_root_folder = None
+ return folder_id, invalid_repository_dependencies_root_folder
+def build_invalid_tool_dependencies_root_folder( trans, folder_id, invalid_tool_dependencies_dict ):
+ """Return a folder hierarchy containing invalid tool dependencies."""
+ # # INvalid tool dependencies are always packages like:
+ # {"R/2.15.1": {"name": "R", "readme": "some string", "type": "package", "version": "2.15.1" "error" : "some sting" }
+ label = 'Invalid tool dependencies'
+ if invalid_tool_dependencies_dict:
+ invalid_tool_dependency_id = 0
+ folder_id += 1
+ invalid_tool_dependencies_root_folder = Folder( id=folder_id, key='root', label='root', parent=None )
+ folder_id += 1
+ invalid_tool_dependencies_folder = Folder( id=folder_id,
+ key='invalid_tool_dependencies',
+ label=label,
+ parent=invalid_tool_dependencies_root_folder )
+ invalid_tool_dependencies_root_folder.folders.append( invalid_tool_dependencies_folder )
+ for td_key, requirements_dict in invalid_tool_dependencies_dict.items():
+ folder_id += 1
+ invalid_tool_dependency_id += 1
+ name = requirements_dict[ 'name' ]
+ type = requirements_dict[ 'type' ]
+ version = requirements_dict[ 'version' ]
+ error = requirements_dict[ 'error' ]
+ key = generate_tool_dependencies_key( name, version, type )
+ label = "Version <b>%s</b> of the <b>%s</b><b>%s</b>" % ( version, name, type )
+ folder = Folder( id=folder_id,
+ key=key,
+ label=label,
+ parent=invalid_tool_dependencies_folder )
+ itd = InvalidToolDependency( id=invalid_tool_dependency_id,
+ name=name,
+ version=version,
+ type=type,
+ error=error )
+ folder.invalid_tool_dependencies.append( itd )
+ invalid_tool_dependencies_folder.folders.append( folder )
+ else:
+ invalid_tool_dependencies_root_folder = None
+ return folder_id, invalid_tool_dependencies_root_folder
def build_invalid_tools_folder( trans, folder_id, invalid_tool_configs, changeset_revision, repository=None, label='Invalid tools' ):
"""Return a folder hierarchy containing invalid tools."""
# TODO: Should we display invalid tools on the tool panel selection page when installing the repository into Galaxy?
@@ -346,7 +440,7 @@
if dependency_key in [ 'set_environment' ]:
for set_environment_dict in requirements_dict:
if trans.webapp.name == 'community':
- is_orphan = set_environment_dict.get( 'is_orphan_in_tool_shed', False )
+ is_orphan = set_environment_dict.get( 'is_orphan', False )
else:
# TODO: handle this is Galaxy
is_orphan = False
@@ -373,7 +467,7 @@
folder.tool_dependencies.append( tool_dependency )
else:
if trans.webapp.name == 'community':
- is_orphan = requirements_dict.get( 'is_orphan_in_tool_shed', False )
+ is_orphan = requirements_dict.get( 'is_orphan', False )
else:
# TODO: handle this is Galaxy
is_orphan = False
@@ -476,6 +570,8 @@
str( repository_owner ),
STRSEP,
str( changeset_revision ) )
+def generate_tool_dependencies_key( name, version, type ):
+ return '%s%s%s%s%s' % ( str( name ), STRSEP, str( version ), STRSEP, str( type ) )
def get_folder( folder, key ):
if folder.key == key:
return folder
diff -r b9a5aee402b31c2a316de0f68efe66fdb141418e -r ec4da708e45175610a33d16fcfc68732e425f54f templates/webapps/community/repository/common.mako
--- a/templates/webapps/community/repository/common.mako
+++ b/templates/webapps/community/repository/common.mako
@@ -224,6 +224,10 @@
folder_label = "%s<i> - installation of these additional repositories is required</i>" % folder_label
if trans.webapp.name == 'galaxy':
col_span_str = 'colspan="4"'
+ elif folder.label == 'Invalid repository dependencies':
+ folder_label = "%s<i> - click the repository dependency to see why it is invalid</i>" % folder_label
+ elif folder.label == 'Invalid tool dependencies':
+ folder_label = "%s<i> - click the tool dependency to see why it is invalid</i>" % folder_label
elif folder.label == 'Valid tools':
col_span_str = 'colspan="3"'
if folder.description:
@@ -266,10 +270,16 @@
%for readme in folder.readme_files:
${render_readme( readme, pad, my_row, row_counter )}
%endfor
+ %for invalid_repository_dependency in folder.invalid_repository_dependencies:
+ ${render_invalid_repository_dependency( invalid_repository_dependency, pad, my_row, row_counter )}
+ %endfor
%for index, repository_dependency in enumerate( folder.repository_dependencies ):
<% row_is_header = index == 0 %>
${render_repository_dependency( repository_dependency, pad, my_row, row_counter, row_is_header )}
%endfor
+ %for invalid_tool_dependency in folder.invalid_tool_dependencies:
+ ${render_invalid_tool_dependency( invalid_tool_dependency, pad, my_row, row_counter )}
+ %endfor
%for index, tool_dependency in enumerate( folder.tool_dependencies ):
<% row_is_header = index == 0 %>
${render_tool_dependency( tool_dependency, pad, my_row, row_counter, row_is_header )}
@@ -321,6 +331,25 @@
%></%def>
+<%def name="render_invalid_repository_dependency( invalid_repository_dependency, pad, parent, row_counter )">
+ <%
+ encoded_id = trans.security.encode_id( invalid_repository_dependency.id )
+ %>
+ <tr class="datasetRow"
+ %if parent is not None:
+ parent="${parent}"
+ %endif
+ id="libraryItem-${encoded_id}">
+ <td style="padding-left: ${pad+20}px;">
+ ${ invalid_repository_dependency.error | h }
+ </td>
+ </tr>
+ <%
+ my_row = row_counter.count
+ row_counter.increment()
+ %>
+</%def>
+
<%def name="render_invalid_tool( invalid_tool, pad, parent, row_counter, valid=True )"><% encoded_id = trans.security.encode_id( invalid_tool.id ) %><tr class="datasetRow"
@@ -344,6 +373,25 @@
%></%def>
+<%def name="render_invalid_tool_dependency( invalid_tool_dependency, pad, parent, row_counter )">
+ <%
+ encoded_id = trans.security.encode_id( invalid_tool_dependency.id )
+ %>
+ <tr class="datasetRow"
+ %if parent is not None:
+ parent="${parent}"
+ %endif
+ id="libraryItem-${encoded_id}">
+ <td style="padding-left: ${pad+20}px;">
+ ${ invalid_tool_dependency.error | h }
+ </td>
+ </tr>
+ <%
+ my_row = row_counter.count
+ row_counter.increment()
+ %>
+</%def>
+
<%def name="render_readme( readme, pad, parent, row_counter )"><%
from galaxy.util.shed_util_common import to_safe_string
@@ -581,15 +629,24 @@
datatypes_root_folder = containers_dict.get( 'datatypes', None )
invalid_tools_root_folder = containers_dict.get( 'invalid_tools', None )
+ invalid_repository_dependencies_root_folder = containers_dict.get( 'invalid_repository_dependencies', None )
readme_files_root_folder = containers_dict.get( 'readme_files', None )
repository_dependencies_root_folder = containers_dict.get( 'repository_dependencies', None )
missing_repository_dependencies_root_folder = containers_dict.get( 'missing_repository_dependencies', None )
+ invalid_tool_dependencies_root_folder = containers_dict.get( 'invalid_tool_dependencies', None )
tool_dependencies_root_folder = containers_dict.get( 'tool_dependencies', None )
missing_tool_dependencies_root_folder = containers_dict.get( 'missing_tool_dependencies', None )
valid_tools_root_folder = containers_dict.get( 'valid_tools', None )
workflows_root_folder = containers_dict.get( 'workflows', None )
has_contents = datatypes_root_folder or invalid_tools_root_folder or valid_tools_root_folder or workflows_root_folder
+ has_dependencies = \
+ invalid_repository_dependencies_root_folder or \
+ invalid_tool_dependencies_root_folder or \
+ missing_repository_dependencies_root_folder or \
+ repository_dependencies_root_folder or \
+ tool_dependencies_root_folder or \
+ missing_tool_dependencies_root_folder
class RowCounter( object ):
def __init__( self ):
@@ -611,10 +668,17 @@
</div></div>
%endif
- %if missing_repository_dependencies_root_folder or repository_dependencies_root_folder or tool_dependencies_root_folder or missing_tool_dependencies_root_folder:
+ %if has_dependencies:
<div class="toolForm"><div class="toolFormTitle">Dependencies of this repository</div><div class="toolFormBody">
+ %if invalid_repository_dependencies_root_folder:
+ <p/>
+ <% row_counter = RowCounter() %>
+ <table cellspacing="2" cellpadding="2" border="0" width="100%" class="tables container-table" id="invalid_repository_dependencies">
+ ${render_folder( invalid_repository_dependencies_root_folder, 0, parent=None, row_counter=row_counter, is_root_folder=True )}
+ </table>
+ %endif
%if missing_repository_dependencies_root_folder:
<p/><% row_counter = RowCounter() %>
@@ -629,6 +693,13 @@
${render_folder( repository_dependencies_root_folder, 0, parent=None, row_counter=row_counter, is_root_folder=True )}
</table>
%endif
+ %if invalid_tool_dependencies_root_folder:
+ <p/>
+ <% row_counter = RowCounter() %>
+ <table cellspacing="2" cellpadding="2" border="0" width="100%" class="tables container-table" id="invalid_tool_dependencies">
+ ${render_folder( invalid_tool_dependencies_root_folder, 0, parent=None, row_counter=row_counter, is_root_folder=True )}
+ </table>
+ %endif
%if tool_dependencies_root_folder:
<p/><% row_counter = RowCounter() %>
diff -r b9a5aee402b31c2a316de0f68efe66fdb141418e -r ec4da708e45175610a33d16fcfc68732e425f54f templates/webapps/community/repository/view_workflow.mako
--- a/templates/webapps/community/repository/view_workflow.mako
+++ b/templates/webapps/community/repository/view_workflow.mako
@@ -21,7 +21,6 @@
browse_label = 'Browse or delete repository tip files'
else:
browse_label = 'Browse repository tip files'
- has_readme = metadata and 'readme_files' in metadata
# <li><a class="action-button" href="${h.url_for( controller='repository', action='install_repositories_by_revision', repository_ids=trans.security.encode_id( repository.id ), changeset_revisions=changeset_revision )}">Install repository to Galaxy</a></li>
%>
diff -r b9a5aee402b31c2a316de0f68efe66fdb141418e -r ec4da708e45175610a33d16fcfc68732e425f54f test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py
--- a/test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py
+++ b/test/tool_shed/functional/test_0010_repository_with_tool_dependencies.py
@@ -98,7 +98,7 @@
uncompress_file=False,
remove_repo_files_not_in_tar=False,
commit_message='Uploaded invalid tool dependency XML.',
- strings_displayed=[ 'Name, version and type from a tool requirement tag does not match' ],
+ strings_displayed=[ 'The settings for <b>name</b>, <b>version</b> and <b>type</b> from a contained tool configuration' ],
strings_not_displayed=[] )
def test_0035_upload_valid_tool_dependency_xml( self ):
'''Upload tool_dependencies.xml defining version 0.9.4_9696d0ce8a962f7bb61c4791be5ce44312b81cf8 of the freebayes package.'''
diff -r b9a5aee402b31c2a316de0f68efe66fdb141418e -r ec4da708e45175610a33d16fcfc68732e425f54f test/tool_shed/functional/test_0030_repository_dependency_revisions.py
--- a/test/tool_shed/functional/test_0030_repository_dependency_revisions.py
+++ b/test/tool_shed/functional/test_0030_repository_dependency_revisions.py
@@ -174,6 +174,7 @@
repository_metadata = [ ( metadata.metadata, metadata.changeset_revision ) for metadata in self.get_repository_metadata( repository ) ]
datatypes_repository = test_db_util.get_repository_by_name_and_owner( datatypes_repository_name, common.test_user_1_name )
datatypes_tip = self.get_repository_tip( datatypes_repository )
+ strings_displayed = []
# Iterate through all metadata revisions and check for repository dependencies.
for metadata, changeset_revision in repository_metadata:
# Add the dependency description and datatypes repository details to the strings to check.
diff -r b9a5aee402b31c2a316de0f68efe66fdb141418e -r ec4da708e45175610a33d16fcfc68732e425f54f test/tool_shed/functional/test_0100_complex_repository_dependencies.py
--- a/test/tool_shed/functional/test_0100_complex_repository_dependencies.py
+++ b/test/tool_shed/functional/test_0100_complex_repository_dependencies.py
@@ -44,7 +44,7 @@
uncompress_file=False,
remove_repo_files_not_in_tar=False,
commit_message='Uploaded tool_dependencies.xml.',
- strings_displayed=[ 'Name, version and type from a tool requirement tag does not match' ],
+ strings_displayed=[ 'The settings for <b>name</b>, <b>version</b> and <b>type</b> from a contained tool' ],
strings_not_displayed=[] )
self.display_manage_repository_page( repository, strings_displayed=[ 'Tool dependencies', 'may not be', 'in this repository' ] )
def test_0010_create_bwa_base_repository( self ):
@@ -79,7 +79,7 @@
owner = tool_repository.user.username
changeset_revision = self.get_repository_tip( tool_repository )
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=True, package='bwa', version='0.5.9' )
- strings_displayed = [ 'Invalid tool shed <b>%s</b> defined' % url ]
+ strings_displayed = [ 'Repository dependencies are currently supported only within the same tool shed' ]
self.upload_file( repository,
filename='tool_dependencies.xml',
filepath=dependency_path,
@@ -100,7 +100,7 @@
owner = tool_repository.user.username
changeset_revision = self.get_repository_tip( tool_repository )
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=True, package='bwa', version='0.5.9' )
- strings_displayed = [ 'Invalid repository name <b>%s</b> defined.' % name ]
+ strings_displayed = [ 'because the name is invalid' ]
self.upload_file( base_repository,
filename='tool_dependencies.xml',
filepath=dependency_path,
@@ -121,7 +121,7 @@
owner = 'invalid_owner!?'
changeset_revision = self.get_repository_tip( tool_repository )
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=True, package='bwa', version='0.5.9' )
- strings_displayed = [ 'Invalid owner <b>%s</b> defined' % owner ]
+ strings_displayed = [ 'because the owner is invalid.' ]
self.upload_file( base_repository,
filename='tool_dependencies.xml',
filepath=dependency_path,
@@ -142,7 +142,7 @@
owner = tool_repository.user.username
changeset_revision = '1234abcd'
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=True, package='bwa', version='0.5.9' )
- strings_displayed = [ 'Invalid changeset revision <b>%s</b> defined.' % changeset_revision ]
+ strings_displayed = [ 'because the changeset revision is invalid.' ]
self.upload_file( base_repository,
filename='tool_dependencies.xml',
filepath=dependency_path,
diff -r b9a5aee402b31c2a316de0f68efe66fdb141418e -r ec4da708e45175610a33d16fcfc68732e425f54f test/tool_shed/functional/test_0110_invalid_simple_repository_dependencies.py
--- a/test/tool_shed/functional/test_0110_invalid_simple_repository_dependencies.py
+++ b/test/tool_shed/functional/test_0110_invalid_simple_repository_dependencies.py
@@ -82,7 +82,7 @@
owner = repository.user.username
changeset_revision = self.get_repository_tip( repository )
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=False, description='This is invalid.' )
- strings_displayed = [ 'Invalid tool shed <b>%s</b> defined for repository <b>%s</b>' % ( url, repository.name ) ]
+ strings_displayed = [ 'Repository dependencies are currently supported only within the same tool shed' ]
self.upload_file( emboss_repository,
filename='repository_dependencies.xml',
filepath=dependency_path,
@@ -103,7 +103,7 @@
owner = repository.user.username
changeset_revision = self.get_repository_tip( repository )
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=False, description='This is invalid.' )
- strings_displayed = [ 'Invalid repository name <b>%s</b> defined.' % name ]
+ strings_displayed = [ 'because the name is invalid.' ]
self.upload_file( emboss_repository,
filename='repository_dependencies.xml',
filepath=dependency_path,
@@ -124,7 +124,7 @@
owner = '!?invalid?!'
changeset_revision = self.get_repository_tip( repository )
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=False, description='This is invalid.' )
- strings_displayed = [ 'Invalid owner <b>%s</b> defined for repository <b>%s</b>' % ( owner, repository.name ) ]
+ strings_displayed = [ 'because the owner is invalid.' ]
self.upload_file( emboss_repository,
filename='repository_dependencies.xml',
filepath=dependency_path,
@@ -145,7 +145,7 @@
owner = repository.user.username
changeset_revision = '!?invalid?!'
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=False, description='This is invalid.' )
- strings_displayed = [ 'Invalid changeset revision <b>%s</b> defined.' % changeset_revision ]
+ strings_displayed = [ 'because the changeset revision is invalid.' ]
self.upload_file( emboss_repository,
filename='repository_dependencies.xml',
filepath=dependency_path,
diff -r b9a5aee402b31c2a316de0f68efe66fdb141418e -r ec4da708e45175610a33d16fcfc68732e425f54f test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
--- a/test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
+++ b/test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
@@ -80,7 +80,7 @@
uncompress_file=False,
remove_repo_files_not_in_tar=False,
commit_message='Uploaded invalid tool dependency XML.',
- strings_displayed=[ 'Name, version and type from a tool requirement tag does not match' ],
+ strings_displayed=[ 'The settings for <b>name</b>, <b>version</b> and <b>type</b> from a contained tool configuration' ],
strings_not_displayed=[] )
self.upload_file( repository,
filename=os.path.join( 'freebayes', 'tool_dependencies.xml' ),
diff -r b9a5aee402b31c2a316de0f68efe66fdb141418e -r ec4da708e45175610a33d16fcfc68732e425f54f test/tool_shed/functional/test_1100_install_repository_with_complex_dependencies.py
--- a/test/tool_shed/functional/test_1100_install_repository_with_complex_dependencies.py
+++ b/test/tool_shed/functional/test_1100_install_repository_with_complex_dependencies.py
@@ -53,7 +53,7 @@
uncompress_file=False,
remove_repo_files_not_in_tar=False,
commit_message='Uploaded tool_dependencies.xml.',
- strings_displayed=[ 'Name, version and type from a tool requirement tag does not match' ],
+ strings_displayed=[ 'The settings for <b>name</b>, <b>version</b> and <b>type</b> from a contained tool' ],
strings_not_displayed=[] )
self.display_manage_repository_page( repository, strings_displayed=[ 'Tool dependencies', 'may not be', 'in this repository' ] )
def test_0010_create_bwa_base_repository( self ):
@@ -92,7 +92,7 @@
owner = tool_repository.user.username
changeset_revision = self.get_repository_tip( tool_repository )
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=True, package='bwa', version='0.5.9' )
- strings_displayed = [ 'Invalid tool shed <b>%s</b> defined' % url ]
+ strings_displayed = [ 'Repository dependencies are currently supported only within the same tool shed' ]
self.upload_file( repository,
filename='tool_dependencies.xml',
filepath=dependency_path,
@@ -115,7 +115,7 @@
owner = tool_repository.user.username
changeset_revision = self.get_repository_tip( tool_repository )
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=True, package='bwa', version='0.5.9' )
- strings_displayed = [ 'Invalid repository name <b>%s</b> defined.' % name ]
+ strings_displayed = [ 'because the name is invalid.' ]
self.upload_file( base_repository,
filename='tool_dependencies.xml',
filepath=dependency_path,
@@ -138,7 +138,7 @@
owner = 'invalid_owner!?'
changeset_revision = self.get_repository_tip( tool_repository )
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=True, package='bwa', version='0.5.9' )
- strings_displayed = [ 'Invalid owner <b>%s</b> defined' % owner ]
+ strings_displayed = [ 'because the owner is invalid.' ]
self.upload_file( base_repository,
filename='tool_dependencies.xml',
filepath=dependency_path,
@@ -161,7 +161,7 @@
owner = tool_repository.user.username
changeset_revision = '1234abcd'
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=True, package='bwa', version='0.5.9' )
- strings_displayed = [ 'Invalid changeset revision <b>%s</b> defined.' % changeset_revision ]
+ strings_displayed = [ 'because the changeset revision is invalid.' ]
self.upload_file( base_repository,
filename='tool_dependencies.xml',
filepath=dependency_path,
diff -r b9a5aee402b31c2a316de0f68efe66fdb141418e -r ec4da708e45175610a33d16fcfc68732e425f54f test/tool_shed/functional/test_1110_install_repository_with_invalid_repository_dependency.py
--- a/test/tool_shed/functional/test_1110_install_repository_with_invalid_repository_dependency.py
+++ b/test/tool_shed/functional/test_1110_install_repository_with_invalid_repository_dependency.py
@@ -90,7 +90,7 @@
owner = repository.user.username
changeset_revision = self.get_repository_tip( repository )
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=False, description='This is invalid.' )
- strings_displayed = [ 'Invalid tool shed <b>%s</b> defined for repository <b>%s</b>' % ( url, repository.name ) ]
+ strings_displayed = [ 'Repository dependencies are currently supported only within the same tool shed' ]
self.upload_file( emboss_repository,
filename='repository_dependencies.xml',
filepath=dependency_path,
@@ -113,7 +113,7 @@
owner = repository.user.username
changeset_revision = self.get_repository_tip( repository )
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=False, description='This is invalid.' )
- strings_displayed = [ 'Invalid repository name <b>%s</b> defined.' % name ]
+ strings_displayed = [ 'because the name is invalid.' ]
self.upload_file( emboss_repository,
filename='repository_dependencies.xml',
filepath=dependency_path,
@@ -136,7 +136,7 @@
owner = '!?invalid?!'
changeset_revision = self.get_repository_tip( repository )
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=False, description='This is invalid.' )
- strings_displayed = [ 'Invalid owner <b>%s</b> defined for repository <b>%s</b>' % ( owner, repository.name ) ]
+ strings_displayed = [ 'because the owner is invalid' ]
self.upload_file( emboss_repository,
filename='repository_dependencies.xml',
filepath=dependency_path,
@@ -159,7 +159,7 @@
owner = repository.user.username
changeset_revision = '!?invalid?!'
self.generate_invalid_dependency_xml( xml_filename, url, name, owner, changeset_revision, complex=False, description='This is invalid.' )
- strings_displayed = [ 'Invalid changeset revision <b>%s</b> defined.' % changeset_revision ]
+ strings_displayed = [ 'because the changeset revision is invalid.' ]
self.upload_file( emboss_repository,
filename='repository_dependencies.xml',
filepath=dependency_path,
@@ -174,7 +174,7 @@
self.galaxy_logout()
self.galaxy_login( email=common.admin_email, username=common.admin_username )
repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
- preview_strings_displayed = [ 'emboss_0110', self.get_repository_tip( repository ), 'will be ignored' ]
+ preview_strings_displayed = [ 'emboss_0110', self.get_repository_tip( repository ), 'Ignoring repository dependency definition' ]
self.install_repository( emboss_repository_name,
common.test_user_1_name,
category_name,
diff -r b9a5aee402b31c2a316de0f68efe66fdb141418e -r ec4da708e45175610a33d16fcfc68732e425f54f test/tool_shed/functional/test_1210_uninstall_reinstall_repository_with_tool_dependencies.py
--- a/test/tool_shed/functional/test_1210_uninstall_reinstall_repository_with_tool_dependencies.py
+++ b/test/tool_shed/functional/test_1210_uninstall_reinstall_repository_with_tool_dependencies.py
@@ -74,7 +74,7 @@
uncompress_file=False,
remove_repo_files_not_in_tar=False,
commit_message='Uploaded invalid tool dependency XML.',
- strings_displayed=[ 'Name, version and type from a tool requirement tag does not match' ],
+ strings_displayed=[ 'The settings for <b>name</b>, <b>version</b> and <b>type</b> from a contained tool configuration' ],
strings_not_displayed=[] )
self.upload_file( repository,
filename=os.path.join( 'freebayes', 'tool_dependencies.xml' ),
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
15 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/b9a5aee402b3/
changeset: b9a5aee402b3
user: inithello
date: 2013-02-15 20:13:33
summary: Core twill framework for automatically installing a defined list of tool shed repositories. This is the first component of a suite of scripts to install a repository, then run all functional tests defined in its tools, and record the result.
affected #: 7 files
diff -r 8e430a612aee6bb14fe373ae9e67d80ba84723d9 -r b9a5aee402b31c2a316de0f68efe66fdb141418e test/install_and_test_tool_shed_repositories/__init__.py
--- /dev/null
+++ b/test/install_and_test_tool_shed_repositories/__init__.py
@@ -0,0 +1,1 @@
+"""Install and test tool shed repositories."""
\ No newline at end of file
diff -r 8e430a612aee6bb14fe373ae9e67d80ba84723d9 -r b9a5aee402b31c2a316de0f68efe66fdb141418e test/install_and_test_tool_shed_repositories/base/test_db_util.py
--- /dev/null
+++ b/test/install_and_test_tool_shed_repositories/base/test_db_util.py
@@ -0,0 +1,47 @@
+import logging
+import galaxy.model as model
+from galaxy.model.orm import and_
+from galaxy.model.mapping import context as sa_session
+
+log = logging.getLogger(__name__)
+
+def delete_obj( obj ):
+ sa_session.delete( obj )
+ sa_session.flush()
+def delete_user_roles( user ):
+ for ura in user.roles:
+ sa_session.delete( ura )
+ sa_session.flush()
+def flush( obj ):
+ sa_session.add( obj )
+ sa_session.flush()
+def get_repository( repository_id ):
+ return sa_session.query( model.ToolShedRepository ) \
+ .filter( model.ToolShedRepository.table.c.id == repository_id ) \
+ .first()
+def get_installed_repository_by_name_owner_changeset_revision( name, owner, changeset_revision ):
+ return sa_session.query( model.ToolShedRepository ) \
+ .filter( and_( model.ToolShedRepository.table.c.name == name,
+ model.ToolShedRepository.table.c.owner == owner,
+ model.ToolShedRepository.table.c.installed_changeset_revision == changeset_revision ) ) \
+ .one()
+def get_private_role( user ):
+ for role in user.all_roles():
+ if role.name == user.email and role.description == 'Private Role for %s' % user.email:
+ return role
+ raise AssertionError( "Private role not found for user '%s'" % user.email )
+def mark_obj_deleted( obj ):
+ obj.deleted = True
+ sa_session.add( obj )
+ sa_session.flush()
+def refresh( obj ):
+ sa_session.refresh( obj )
+def get_private_role( user ):
+ for role in user.all_roles():
+ if role.name == user.email and role.description == 'Private Role for %s' % user.email:
+ return role
+ raise AssertionError( "Private role not found for user '%s'" % user.email )
+def get_user( email ):
+ return sa_session.query( model.User ) \
+ .filter( model.User.table.c.email==email ) \
+ .first()
diff -r 8e430a612aee6bb14fe373ae9e67d80ba84723d9 -r b9a5aee402b31c2a316de0f68efe66fdb141418e test/install_and_test_tool_shed_repositories/base/twilltestcase.py
--- /dev/null
+++ b/test/install_and_test_tool_shed_repositories/base/twilltestcase.py
@@ -0,0 +1,124 @@
+import galaxy.model as model
+import common, string, os, re, test_db_util, simplejson, logging, time, sys
+import galaxy.util as util
+from base.twilltestcase import tc, from_json_string, TwillTestCase, security, urllib
+from galaxy.tool_shed.encoding_util import tool_shed_encode, tool_shed_decode
+
+log = logging.getLogger( __name__ )
+
+class InstallTestRepository( TwillTestCase ):
+ def setUp( self ):
+ # Security helper
+ id_secret = os.environ.get( 'GALAXY_INSTALL_TEST_SECRET', 'changethisinproductiontoo' )
+ self.security = security.SecurityHelper( id_secret=id_secret )
+ self.history_id = None
+ self.test_tmp_dir = os.environ.get( 'GALAXY_INSTALL_TEST_TMP_DIR', None)
+ self.host = os.environ.get( 'GALAXY_INSTALL_TEST_HOST' )
+ self.port = os.environ.get( 'GALAXY_INSTALL_TEST_PORT' )
+ self.url = "http://%s:%s" % ( self.host, self.port )
+ self.shed_tool_data_table_conf = os.environ.get( 'GALAXY_INSTALL_TEST_SHED_TOOL_DATA_TABLE_CONF' )
+ self.file_dir = os.environ.get( 'GALAXY_INSTALL_TEST_FILE_DIR', None )
+ self.tool_data_path = os.environ.get( 'GALAXY_INSTALL_TEST_TOOL_DATA_PATH' )
+ self.shed_tool_conf = os.environ.get( 'GALAXY_INSTALL_TEST_SHED_TOOL_CONF' )
+ # TODO: Figure out a way to alter these attributes during tests.
+ self.galaxy_tool_dependency_dir = os.environ.get( 'GALAXY_INSTALL_TEST_TOOL_DEPENDENCY_DIR' )
+ self.shed_tools_dict = {}
+ self.home()
+ def initiate_installation_process( self,
+ install_tool_dependencies=False,
+ install_repository_dependencies=True,
+ no_changes=True,
+ new_tool_panel_section=None ):
+ html = self.last_page()
+ # Since the installation process is by necessity asynchronous, we have to get the parameters to 'manually' initiate the
+ # installation process. This regex will return the tool shed repository IDs in group(1), the encoded_kwd parameter in
+ # group(2), and the reinstalling flag in group(3) and pass them to the manage_repositories method in the Galaxy
+ # admin_toolshed controller.
+ install_parameters = re.search( 'initiate_repository_installation\( "([^"]+)", "([^"]+)", "([^"]+)" \);', html )
+ if install_parameters:
+ iri_ids = install_parameters.group(1)
+ # In some cases, the returned iri_ids are of the form: "[u'<encoded id>', u'<encoded id>']"
+ # This regex ensures that non-hex characters are stripped out of the list, so that util.listify/decode_id
+ # will handle them correctly. It's safe to pass the cleaned list to manage_repositories, because it can parse
+ # comma-separated values.
+ repository_ids = str( iri_ids )
+ repository_ids = re.sub( '[^a-fA-F0-9,]+', '', repository_ids )
+ encoded_kwd = install_parameters.group(2)
+ reinstalling = install_parameters.group(3)
+ url = '/admin_toolshed/manage_repositories?operation=install&tool_shed_repository_ids=%s&encoded_kwd=%s&reinstalling=%s' % \
+ ( ','.join( util.listify( repository_ids ) ), encoded_kwd, reinstalling )
+ self.visit_url( url )
+ return util.listify( repository_ids )
+ def install_repository( self, repository_info_dict, install_tool_dependencies=True, install_repository_dependencies=True,
+ strings_displayed=[], strings_not_displayed=[], preview_strings_displayed=[],
+ post_submit_strings_displayed=[], new_tool_panel_section=None, **kwd ):
+ name = repository_info_dict[ 'name' ]
+ owner = repository_info_dict[ 'owner' ]
+ changeset_revision = repository_info_dict[ 'changeset_revision' ]
+ encoded_repository_id = repository_info_dict[ 'encoded_repository_id' ]
+ tool_shed_url = repository_info_dict[ 'tool_shed_url' ]
+ preview_params = urllib.urlencode( dict( repository_id=encoded_repository_id, changeset_revision=changeset_revision ) )
+ self.visit_url( '%s/repository/preview_tools_in_changeset?%s' % ( tool_shed_url, preview_params ) )
+ install_params = urllib.urlencode( dict( repository_ids=encoded_repository_id,
+ changeset_revisions=changeset_revision,
+ galaxy_url=self.url ) )
+ # If the tool shed does not have the same hostname as the Galaxy server being used for these tests,
+ # twill will not carry over previously set cookies for the Galaxy server when following the
+ # install_repositories_by_revision redirect, so we have to include 403 in the allowed HTTP
+ # status codes and log in again.
+ url = '%s/repository/install_repositories_by_revision?%s' % ( tool_shed_url, install_params )
+ self.visit_url( url, allowed_codes=[ 200, 403 ] )
+ self.logout()
+ self.login( email='test(a)bx.psu.edu', username='test' )
+ install_params = urllib.urlencode( dict( repository_ids=encoded_repository_id,
+ changeset_revisions=changeset_revision,
+ tool_shed_url=tool_shed_url ) )
+ url = '/admin_toolshed/prepare_for_install?%s' % install_params
+ self.visit_url( url )
+ # This section is tricky, due to the way twill handles form submission. The tool dependency checkbox needs to
+ # be hacked in through tc.browser, putting the form field in kwd doesn't work.
+ if 'install_tool_dependencies' in self.last_page():
+ form = tc.browser.get_form( 'select_tool_panel_section' )
+ checkbox = form.find_control( id="install_tool_dependencies" )
+ checkbox.disabled = False
+ if install_tool_dependencies:
+ checkbox.selected = True
+ kwd[ 'install_tool_dependencies' ] = 'True'
+ else:
+ checkbox.selected = False
+ kwd[ 'install_tool_dependencies' ] = 'False'
+ if 'install_repository_dependencies' in self.last_page():
+ kwd[ 'install_repository_dependencies' ] = str( install_repository_dependencies ).lower()
+ if 'shed_tool_conf' not in kwd:
+ kwd[ 'shed_tool_conf' ] = self.shed_tool_conf
+ if new_tool_panel_section:
+ kwd[ 'new_tool_panel_section' ] = new_tool_panel_section
+ self.submit_form( 1, 'select_tool_panel_section_button', **kwd )
+ self.check_for_strings( post_submit_strings_displayed, strings_not_displayed )
+ repository_ids = self.initiate_installation_process( new_tool_panel_section=new_tool_panel_section )
+ self.wait_for_repository_installation( repository_ids )
+ def visit_url( self, url, allowed_codes=[ 200 ] ):
+ new_url = tc.go( url )
+ return_code = tc.browser.get_code()
+ assert return_code in allowed_codes, 'Invalid HTTP return code %s, allowed codes: %s' % \
+ ( return_code, ', '.join( str( code ) for code in allowed_codes ) )
+ return new_url
+ def wait_for_repository_installation( self, repository_ids ):
+ final_states = [ model.ToolShedRepository.installation_status.ERROR,
+ model.ToolShedRepository.installation_status.INSTALLED ]
+ # Wait until all repositories are in a final state before returning. This ensures that subsequent tests
+ # are running against an installed repository, and not one that is still in the process of installing.
+ if repository_ids:
+ for repository_id in repository_ids:
+ galaxy_repository = test_db_util.get_repository( self.security.decode_id( repository_id ) )
+ timeout_counter = 0
+ while galaxy_repository.status not in final_states:
+ test_db_util.refresh( galaxy_repository )
+ timeout_counter = timeout_counter + 1
+ # This timeout currently defaults to 180 seconds, or 3 minutes.
+ if timeout_counter > common.repository_installation_timeout:
+ raise AssertionError( 'Repository installation timed out, %d seconds elapsed, repository state is %s.' % \
+ ( timeout_counter, repository.status ) )
+ break
+ time.sleep( 1 )
+
diff -r 8e430a612aee6bb14fe373ae9e67d80ba84723d9 -r b9a5aee402b31c2a316de0f68efe66fdb141418e test/install_and_test_tool_shed_repositories/functional/__init__.py
--- /dev/null
+++ b/test/install_and_test_tool_shed_repositories/functional/__init__.py
@@ -0,0 +1,1 @@
+'''Tests'''
\ No newline at end of file
diff -r 8e430a612aee6bb14fe373ae9e67d80ba84723d9 -r b9a5aee402b31c2a316de0f68efe66fdb141418e test/install_and_test_tool_shed_repositories/functional/test_install_repositories.py
--- /dev/null
+++ b/test/install_and_test_tool_shed_repositories/functional/test_install_repositories.py
@@ -0,0 +1,39 @@
+import new
+import install_and_test_tool_shed_repositories.base.test_db_util as test_db_util
+from install_and_test_tool_shed_repositories.base.twilltestcase import InstallTestRepository
+
+class TestInstallRepositories( InstallTestRepository ):
+ """Abstract test case that installs a predefined list of repositories."""
+ def do_installation( self, repository_info_dict ):
+ self.logout()
+ self.login( email='test(a)bx.psu.edu', username='test' )
+ admin_user = test_db_util.get_user( 'test(a)bx.psu.edu' )
+ assert admin_user is not None, 'Problem retrieving user with email %s from the database' % admin_email
+ admin_user_private_role = test_db_util.get_private_role( admin_user )
+ self.install_repository( repository_info_dict )
+
+def build_tests( repository_dict=None ):
+ """Generate abstract test cases for the defined list of repositories."""
+ if repository_dict is None:
+ return
+ # Push all the toolbox tests to module level
+ G = globals()
+ # Eliminate all previous tests from G.
+ for key, val in G.items():
+ if key.startswith( 'TestInstallRepository_' ):
+ del G[ key ]
+ # Create a new subclass with a method named install_repository_XXX that installs the repository specified by the provided dict.
+ name = "TestInstallRepository_" + repository_dict[ 'name' ]
+ baseclasses = ( TestInstallRepositories, )
+ namespace = dict()
+ def make_install_method( repository_dict ):
+ def test_install_repository( self ):
+ self.do_installation( repository_dict )
+ return test_install_repository
+ test_method = make_install_method( repository_dict )
+ test_method.__doc__ = "Install the repository %s from %s." % ( repository_dict[ 'name' ], repository_dict[ 'tool_shed_url' ] )
+ namespace[ 'install_repository_%s' % repository_dict[ 'name' ] ] = test_method
+ # The new.classobj function returns a new class object, with name name, derived
+ # from baseclasses (which should be a tuple of classes) and with namespace dict.
+ new_class_obj = new.classobj( name, baseclasses, namespace )
+ G[ name ] = new_class_obj
diff -r 8e430a612aee6bb14fe373ae9e67d80ba84723d9 -r b9a5aee402b31c2a316de0f68efe66fdb141418e test/install_and_test_tool_shed_repositories/functional_tests.py
--- /dev/null
+++ b/test/install_and_test_tool_shed_repositories/functional_tests.py
@@ -0,0 +1,323 @@
+#!/usr/bin/env python
+
+import os, sys, shutil, tempfile, re, string
+
+# Assume we are run from the galaxy root directory, add lib to the python path
+cwd = os.getcwd()
+sys.path.append( cwd )
+
+test_home_directory = os.path.join( cwd, 'test', 'install_and_test_tool_shed_repositories' )
+default_test_file_dir = os.path.join( test_home_directory, 'test_data' )
+# Here's the directory where everything happens. Temporary directories are created within this directory to contain
+# the hgweb.config file, the database, new repositories, etc. Since the tool shed browses repository contents via HTTP,
+# the full path to the temporary directroy wher eht repositories are located cannot contain invalid url characters.
+galaxy_test_tmp_dir = os.path.join( test_home_directory, 'tmp' )
+default_galaxy_locales = 'en'
+default_galaxy_test_file_dir = "test-data"
+os.environ[ 'GALAXY_INSTALL_TEST_TMP_DIR' ] = galaxy_test_tmp_dir
+new_path = [ os.path.join( cwd, "lib" ), os.path.join( cwd, 'test' ) ]
+new_path.extend( sys.path )
+sys.path = new_path
+
+from galaxy import eggs
+
+eggs.require( "nose" )
+eggs.require( "NoseHTML" )
+eggs.require( "NoseTestDiff" )
+eggs.require( "twill==0.9" )
+eggs.require( "Paste" )
+eggs.require( "PasteDeploy" )
+eggs.require( "Cheetah" )
+eggs.require( "simplejson" )
+
+# This should not be required, but it is under certain conditions, thanks to this bug: http://code.google.com/p/python-nose/issues/detail?id=284
+eggs.require( "pysqlite" )
+
+import atexit, logging, os, os.path, sys, tempfile, simplejson
+import twill, unittest, time
+import sys, threading, random
+import httplib, socket
+from paste import httpserver
+
+# This is for the galaxy application.
+import galaxy.app
+from galaxy.app import UniverseApplication
+from galaxy.web import buildapp
+
+import nose.core
+import nose.config
+import nose.loader
+import nose.plugins.manager
+
+log = logging.getLogger( 'install_and_test_repositories' )
+
+default_galaxy_test_port_min = 10000
+default_galaxy_test_port_max = 10999
+default_galaxy_test_host = '127.0.0.1'
+
+# Optionally, set the environment variable GALAXY_INSTALL_TEST_TOOL_SHEDS_CONF
+# to the location of a tool sheds configuration file that includes the tool shed
+# that repositories will be installed from.
+
+tool_sheds_conf_xml = '''<?xml version="1.0"?>
+<tool_sheds>
+ <tool_shed name="Galaxy main tool shed" url="http://toolshed.g2.bx.psu.edu/"/>
+ <tool_shed name="Galaxy test tool shed" url="http://testtoolshed.g2.bx.psu.edu/"/>
+</tool_sheds>
+'''
+
+shed_tool_conf_xml_template = '''<?xml version="1.0"?>
+<toolbox tool_path="${shed_tool_path}">
+</toolbox>
+'''
+
+tool_conf_xml = '''<?xml version="1.0"?>
+<toolbox>
+ <section name="Get Data" id="getext">
+ <tool file="data_source/upload.xml"/>
+ </section>
+</toolbox>
+'''
+
+tool_data_table_conf_xml_template = '''<?xml version="1.0"?>
+<tables>
+</tables>
+'''
+
+galaxy_repository_list = os.environ.get( 'GALAXY_INSTALL_TEST_REPOSITORY_FILE', 'repository_list.json' )
+
+if 'GALAXY_INSTALL_TEST_SECRET' not in os.environ:
+ galaxy_encode_secret = 'changethisinproductiontoo'
+ os.environ[ 'GALAXY_INSTALL_TEST_SECRET' ] = galaxy_encode_secret
+else:
+ galaxy_encode_secret = os.environ[ 'GALAXY_INSTALL_TEST_SECRET' ]
+
+def get_repositories_to_install():
+ '''
+ Get a list of repository info dicts to install. This method expects a json list of dicts with the following structure:
+ [
+ {
+ "changeset_revision": <revision>,
+ "encoded_repository_id": <encoded repository id from the tool shed>,
+ "name": <name>,
+ "owner": <owner>,
+ "tool_shed_url": <url>
+ },
+ ...
+ ]
+ NOTE: If the tool shed URL specified in any dict is not present in the tool_sheds_conf.xml, the installation will fail.
+ '''
+ return simplejson.loads( file( galaxy_repository_list, 'r' ).read() )
+
+def run_tests( test_config ):
+ loader = nose.loader.TestLoader( config=test_config )
+ plug_loader = test_config.plugins.prepareTestLoader( loader )
+ if plug_loader is not None:
+ loader = plug_loader
+ tests = loader.loadTestsFromNames( test_config.testNames )
+ test_runner = nose.core.TextTestRunner( stream=test_config.stream,
+ verbosity=test_config.verbosity,
+ config=test_config )
+ plug_runner = test_config.plugins.prepareTestRunner( test_runner )
+ if plug_runner is not None:
+ test_runner = plug_runner
+ return test_runner.run( tests )
+
+def main():
+ # ---- Configuration ------------------------------------------------------
+ galaxy_test_host = os.environ.get( 'GALAXY_INSTALL_TEST_HOST', default_galaxy_test_host )
+ galaxy_test_port = os.environ.get( 'GALAXY_INSTALL_TEST_PORT', None )
+
+ tool_path = os.environ.get( 'GALAXY_INSTALL_TEST_TOOL_PATH', 'tools' )
+ if 'HTTP_ACCEPT_LANGUAGE' not in os.environ:
+ os.environ[ 'HTTP_ACCEPT_LANGUAGE' ] = default_galaxy_locales
+ galaxy_test_file_dir = os.environ.get( 'GALAXY_INSTALL_TEST_FILE_DIR', default_galaxy_test_file_dir )
+ if not os.path.isabs( galaxy_test_file_dir ):
+ galaxy_test_file_dir = os.path.abspath( galaxy_test_file_dir )
+ tool_dependency_dir = os.environ.get( 'GALAXY_INSTALL_TEST_TOOL_DEPENDENCY_DIR', None )
+ use_distributed_object_store = os.environ.get( 'GALAXY_INSTALL_TEST_USE_DISTRIBUTED_OBJECT_STORE', False )
+ if not os.path.isdir( galaxy_test_tmp_dir ):
+ os.mkdir( galaxy_test_tmp_dir )
+ galaxy_test_proxy_port = None
+ shed_tool_data_table_conf_file = os.environ.get( 'GALAXY_INSTALL_TEST_SHED_TOOL_DATA_TABLE_CONF', os.path.join( galaxy_test_tmp_dir, 'test_shed_tool_data_table_conf.xml' ) )
+ galaxy_tool_data_table_conf_file = os.environ.get( 'GALAXY_INSTALL_TEST_TOOL_DATA_TABLE_CONF', os.path.join( galaxy_test_tmp_dir, 'test_tool_data_table_conf.xml' ) )
+ galaxy_tool_conf_file = os.environ.get( 'GALAXY_INSTALL_TEST_TOOL_CONF', os.path.join( galaxy_test_tmp_dir, 'test_tool_conf.xml' ) )
+ galaxy_shed_tool_conf_file = os.environ.get( 'GALAXY_INSTALL_TEST_SHED_TOOL_CONF', os.path.join( galaxy_test_tmp_dir, 'test_shed_tool_conf.xml' ) )
+ galaxy_migrated_tool_conf_file = os.environ.get( 'GALAXY_INSTALL_TEST_MIGRATED_TOOL_CONF', os.path.join( galaxy_test_tmp_dir, 'test_migrated_tool_conf.xml' ) )
+ galaxy_tool_sheds_conf_file = os.environ.get( 'GALAXY_INSTALL_TEST_TOOL_SHEDS_CONF', os.path.join( galaxy_test_tmp_dir, 'test_tool_sheds_conf.xml' ) )
+ shed_tool_dict = os.environ.get( 'GALAXY_INSTALL_TEST_SHED_TOOL_DICT_FILE', os.path.join( galaxy_test_tmp_dir, 'shed_tool_dict' ) )
+ if 'GALAXY_INSTALL_TEST_TOOL_DATA_PATH' in os.environ:
+ tool_data_path = os.environ.get( 'GALAXY_INSTALL_TEST_TOOL_DATA_PATH' )
+ else:
+ tool_data_path = tempfile.mkdtemp( dir=galaxy_test_tmp_dir )
+ os.environ[ 'GALAXY_INSTALL_TEST_TOOL_DATA_PATH' ] = tool_data_path
+ if 'GALAXY_INSTALL_TEST_DBPATH' in os.environ:
+ galaxy_db_path = os.environ[ 'GALAXY_INSTALL_TEST_DBPATH' ]
+ else:
+ tempdir = tempfile.mkdtemp( dir=galaxy_test_tmp_dir )
+ galaxy_db_path = os.path.join( tempdir, 'database' )
+ galaxy_file_path = os.path.join( galaxy_db_path, 'files' )
+ new_repos_path = tempfile.mkdtemp( dir=galaxy_test_tmp_dir )
+ galaxy_tempfiles = tempfile.mkdtemp( dir=galaxy_test_tmp_dir )
+ galaxy_shed_tool_path = tempfile.mkdtemp( dir=galaxy_test_tmp_dir )
+ galaxy_migrated_tool_path = tempfile.mkdtemp( dir=galaxy_test_tmp_dir )
+ galaxy_tool_dependency_dir = tempfile.mkdtemp( dir=galaxy_test_tmp_dir )
+ os.environ[ 'GALAXY_INSTALL_TEST_TOOL_DEPENDENCY_DIR' ] = galaxy_tool_dependency_dir
+ if 'GALAXY_INSTALL_TEST_DBURI' in os.environ:
+ database_connection = os.environ[ 'GALAXY_INSTALL_TEST_DBURI' ]
+ else:
+ database_connection = 'sqlite:///' + os.path.join( galaxy_db_path, 'install_and_test_repositories.sqlite' )
+ kwargs = {}
+ for dir in [ galaxy_test_tmp_dir ]:
+ try:
+ os.makedirs( dir )
+ except OSError:
+ pass
+
+ print "Database connection: ", database_connection
+
+ # Generate the tool_data_table_conf.xml file.
+ file( galaxy_tool_data_table_conf_file, 'w' ).write( tool_data_table_conf_xml_template )
+ os.environ[ 'GALAXY_INSTALL_TEST_TOOL_DATA_TABLE_CONF' ] = galaxy_tool_data_table_conf_file
+ # Generate the shed_tool_data_table_conf.xml file.
+ file( shed_tool_data_table_conf_file, 'w' ).write( tool_data_table_conf_xml_template )
+ os.environ[ 'GALAXY_INSTALL_TEST_SHED_TOOL_DATA_TABLE_CONF' ] = shed_tool_data_table_conf_file
+ # ---- Start up a Galaxy instance ------------------------------------------------------
+ # Generate the tool_conf.xml file.
+ file( galaxy_tool_conf_file, 'w' ).write( tool_conf_xml )
+ # Generate the tool_sheds_conf.xml file, but only if a the user has not specified an existing one in the environment.
+ if 'GALAXY_INSTALL_TEST_TOOL_SHEDS_CONF' not in os.environ:
+ file( galaxy_tool_sheds_conf_file, 'w' ).write( tool_sheds_conf_xml )
+ # Generate the shed_tool_conf.xml file.
+ tool_conf_template_parser = string.Template( shed_tool_conf_xml_template )
+ shed_tool_conf_xml = tool_conf_template_parser.safe_substitute( shed_tool_path=galaxy_shed_tool_path )
+ file( galaxy_shed_tool_conf_file, 'w' ).write( shed_tool_conf_xml )
+ os.environ[ 'GALAXY_INSTALL_TEST_SHED_TOOL_CONF' ] = galaxy_shed_tool_conf_file
+ # Generate the migrated_tool_conf.xml file.
+ migrated_tool_conf_xml = tool_conf_template_parser.safe_substitute( shed_tool_path=galaxy_migrated_tool_path )
+ file( galaxy_migrated_tool_conf_file, 'w' ).write( migrated_tool_conf_xml )
+
+ # ---- Build Galaxy Application --------------------------------------------------
+ global_conf = { '__file__' : 'universe_wsgi.ini.sample' }
+ if not database_connection.startswith( 'sqlite://' ):
+ kwargs[ 'database_engine_option_max_overflow' ] = '20'
+ app = UniverseApplication( admin_users = 'test(a)bx.psu.edu',
+ allow_user_creation = True,
+ allow_user_deletion = True,
+ allow_library_path_paste = True,
+ database_connection = database_connection,
+ database_engine_option_pool_size = '10',
+ datatype_converters_config_file = "datatype_converters_conf.xml.sample",
+ file_path = galaxy_file_path,
+ global_conf = global_conf,
+ id_secret = galaxy_encode_secret,
+ job_queue_workers = 5,
+ log_destination = "stdout",
+ migrated_tools_config = galaxy_migrated_tool_conf_file,
+ new_file_path = galaxy_tempfiles,
+ running_functional_tests=True,
+ shed_tool_data_table_config = shed_tool_data_table_conf_file,
+ shed_tool_path = galaxy_shed_tool_path,
+ template_path = "templates",
+ tool_config_file = [ galaxy_tool_conf_file, galaxy_shed_tool_conf_file ],
+ tool_data_path = tool_data_path,
+ tool_data_table_config_path = galaxy_tool_data_table_conf_file,
+ tool_dependency_dir = galaxy_tool_dependency_dir,
+ tool_path = tool_path,
+ tool_parse_help = False,
+ tool_sheds_config_file = galaxy_tool_sheds_conf_file,
+ update_integrated_tool_panel = False,
+ use_heartbeat = False,
+ **kwargs )
+
+ log.info( "Embedded Galaxy application started" )
+
+ # ---- Run galaxy webserver ------------------------------------------------------
+ server = None
+ webapp = buildapp.app_factory( dict( database_file=database_connection ),
+ use_translogger=False,
+ static_enabled=False,
+ app=app )
+
+ if galaxy_test_port is not None:
+ server = httpserver.serve( webapp, host=galaxy_test_host, port=galaxy_test_port, start_loop=False )
+ else:
+ random.seed()
+ for i in range( 0, 9 ):
+ try:
+ galaxy_test_port = str( random.randint( default_galaxy_test_port_min, default_galaxy_test_port_max ) )
+ log.debug( "Attempting to serve app on randomly chosen port: %s" % galaxy_test_port )
+ server = httpserver.serve( webapp, host=galaxy_test_host, port=galaxy_test_port, start_loop=False )
+ break
+ except socket.error, e:
+ if e[0] == 98:
+ continue
+ raise
+ else:
+ raise Exception( "Unable to open a port between %s and %s to start Galaxy server" % \
+ ( default_galaxy_test_port_min, default_galaxy_test_port_max ) )
+ if galaxy_test_proxy_port:
+ os.environ[ 'GALAXY_INSTALL_TEST_PORT' ] = galaxy_test_proxy_port
+ else:
+ os.environ[ 'GALAXY_INSTALL_TEST_PORT' ] = galaxy_test_port
+ t = threading.Thread( target=server.serve_forever )
+ t.start()
+ # Test if the server is up
+ for i in range( 10 ):
+ # Directly test the app, not the proxy.
+ conn = httplib.HTTPConnection( galaxy_test_host, galaxy_test_port )
+ conn.request( "GET", "/" )
+ if conn.getresponse().status == 200:
+ break
+ time.sleep( 0.1 )
+ else:
+ raise Exception( "Test HTTP server did not return '200 OK' after 10 tries" )
+ log.info( "Embedded galaxy web server started" )
+ # ---- Load the module to generate installation methods -------------------
+ import install_and_test_tool_shed_repositories.functional.test_install_repositories as test_install_repositories
+ if galaxy_test_proxy_port:
+ log.info( "Tests will be run against %s:%s" % ( galaxy_test_host, galaxy_test_proxy_port ) )
+ else:
+ log.info( "Tests will be run against %s:%s" % ( galaxy_test_host, galaxy_test_port ) )
+ success = False
+ try:
+ for repository_dict in get_repositories_to_install():
+ test_install_repositories.build_tests( repository_dict )
+ os.environ[ 'GALAXY_INSTALL_TEST_HOST' ] = galaxy_test_host
+ test_config = nose.config.Config( env=os.environ, plugins=nose.plugins.manager.DefaultPluginManager() )
+ test_config.configure( sys.argv )
+ # Run the tests.
+ result = run_tests( test_config )
+ success = result.wasSuccessful()
+ except:
+ log.exception( "Failure running tests" )
+
+ log.info( "Shutting down" )
+ # ---- Tear down -----------------------------------------------------------
+ if server:
+ log.info( "Shutting down embedded galaxy web server" )
+ server.server_close()
+ server = None
+ log.info( "Embedded galaxy server stopped" )
+ if app:
+ log.info( "Shutting down galaxy application" )
+ app.shutdown()
+ app = None
+ log.info( "Embedded galaxy application stopped" )
+ if 'GALAXY_INSTALL_TEST_NO_CLEANUP' not in os.environ:
+ try:
+ for dir in [ galaxy_test_tmp_dir ]:
+ if os.path.exists( dir ):
+ log.info( "Cleaning up temporary files in %s" % dir )
+ shutil.rmtree( dir )
+ except:
+ pass
+ else:
+ log.debug( 'GALAXY_INSTALL_TEST_NO_CLEANUP set, not cleaning up.' )
+ if success:
+ return 0
+ else:
+ return 1
+
+if __name__ == "__main__":
+ sys.exit( main() )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Only write out a new shed_data_manager_conf if the file has changed.
by Bitbucket 15 Feb '13
by Bitbucket 15 Feb '13
15 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/8e430a612aee/
changeset: 8e430a612aee
user: dan
date: 2013-02-15 20:04:47
summary: Only write out a new shed_data_manager_conf if the file has changed.
affected #: 1 file
diff -r d07c457ee2692868a5ab99b4d663a220abf8ac73 -r 8e430a612aee6bb14fe373ae9e67d80ba84723d9 lib/galaxy/util/shed_util.py
--- a/lib/galaxy/util/shed_util.py
+++ b/lib/galaxy/util/shed_util.py
@@ -1188,6 +1188,7 @@
if repo_data_manager_conf_filename is None:
log.debug( "No data_manager_conf.xml file has been defined." )
return rval
+ data_manager_config_has_changes = False
relative_repo_data_manager_dir = os.path.join( shed_config_dict.get( 'tool_path', '' ), relative_install_dir )
repo_data_manager_conf_filename = os.path.join( relative_repo_data_manager_dir, repo_data_manager_conf_filename )
tree = util.parse_xml( repo_data_manager_conf_filename )
@@ -1236,8 +1237,10 @@
else:
log.warning( "Encountered unexpected element '%s':\n%s" % ( elem.tag, util.xml_to_string( elem ) ) )
config_elems.append( elem )
- # Persist the altered shed_tool_config file.
- suc.data_manager_config_elems_to_xml_file( app, config_elems, shed_data_manager_conf_filename )
+ data_manager_config_has_changes = True
+ # Persist the altered shed_data_manager_config file.
+ if data_manager_config_has_changes:
+ suc.data_manager_config_elems_to_xml_file( app, config_elems, shed_data_manager_conf_filename )
return rval
def is_in_repo_info_dicts( repo_info_dict, repo_info_dicts ):
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Only write out a new shed_data_manager_conf if the file has changed.
by Bitbucket 15 Feb '13
by Bitbucket 15 Feb '13
15 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/d07c457ee269/
changeset: d07c457ee269
user: dan
date: 2013-02-15 19:57:08
summary: Only write out a new shed_data_manager_conf if the file has changed.
affected #: 1 file
diff -r e882cfa616ec6a51ac75d7d7779d2aa7f2e516f8 -r d07c457ee2692868a5ab99b4d663a220abf8ac73 lib/galaxy/util/shed_util.py
--- a/lib/galaxy/util/shed_util.py
+++ b/lib/galaxy/util/shed_util.py
@@ -1527,14 +1527,18 @@
root = tree.getroot()
assert root.tag == 'data_managers', 'The file provided (%s) for removing data managers from is not a valid data manager xml file.' % ( shed_data_manager_conf_filename )
guids = [ data_manager_dict.get( 'guid' ) for data_manager_dict in metadata_dict.get( 'data_manager', {} ).get( 'data_managers', {} ).itervalues() if 'guid' in data_manager_dict ]
+ data_manager_config_has_changes = False
config_elems = []
for elem in root:
if elem.tag != 'data_manager' or elem.get( 'guid', None ) not in guids:
config_elems.append( elem )
+ else:
+ data_manager_config_has_changes = True
#remove data managers from in memory
app.data_managers.remove_manager( guids )
# Persist the altered shed_data_manager_config file.
- suc.data_manager_config_elems_to_xml_file( app, config_elems, shed_data_manager_conf_filename )
+ if data_manager_config_has_changes:
+ suc.data_manager_config_elems_to_xml_file( app, config_elems, shed_data_manager_conf_filename )
def remove_from_shed_tool_config( trans, shed_tool_conf_dict, guids_to_remove ):
# A tool shed repository is being uninstalled so change the shed_tool_conf file. Parse the config file to generate the entire list
# of config_elems instead of using the in-memory list since it will be a subset of the entire list if one or more repositories have
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Fix for reinstalling a Tool Shed Repository that contains tools, but none of them are added to the tool panel.
by Bitbucket 15 Feb '13
by Bitbucket 15 Feb '13
15 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/e882cfa616ec/
changeset: e882cfa616ec
user: dan
date: 2013-02-15 19:49:47
summary: Fix for reinstalling a Tool Shed Repository that contains tools, but none of them are added to the tool panel.
affected #: 1 file
diff -r 2664d904641abdc1ed6a2f972eb5aeefa8f93703 -r e882cfa616ec6a51ac75d7d7779d2aa7f2e516f8 lib/galaxy/util/shed_util.py
--- a/lib/galaxy/util/shed_util.py
+++ b/lib/galaxy/util/shed_util.py
@@ -1058,30 +1058,32 @@
tool_section = None
tool_panel_section_key = None
if 'tools' in metadata:
- if 'tool_panel_section' in metadata:
- tool_panel_dict = metadata[ 'tool_panel_section' ]
- if not tool_panel_dict:
+ # This forces everything to be loaded into the same section (or no section) in the tool panel.
+ if no_changes_checked:
+ if 'tool_panel_section' in metadata:
+ tool_panel_dict = metadata[ 'tool_panel_section' ]
+ if not tool_panel_dict:
+ tool_panel_dict = generate_tool_panel_dict_for_new_install( metadata[ 'tools' ] )
+ else:
tool_panel_dict = generate_tool_panel_dict_for_new_install( metadata[ 'tools' ] )
- else:
- tool_panel_dict = generate_tool_panel_dict_for_new_install( metadata[ 'tools' ] )
- # This forces everything to be loaded into the same section (or no section) in the tool panel.
- tool_section_dicts = tool_panel_dict[ tool_panel_dict.keys()[ 0 ] ]
- tool_section_dict = tool_section_dicts[ 0 ]
- original_section_id = tool_section_dict[ 'id' ]
- original_section_name = tool_section_dict[ 'name' ]
- if no_changes_checked:
- if original_section_id:
- tool_panel_section_key = 'section_%s' % str( original_section_id )
- if tool_panel_section_key in trans.app.toolbox.tool_panel:
- tool_section = trans.app.toolbox.tool_panel[ tool_panel_section_key ]
- else:
- # The section in which the tool was originally loaded used to be in the tool panel, but no longer is.
- elem = Element( 'section' )
- elem.attrib[ 'name' ] = original_section_name
- elem.attrib[ 'id' ] = original_section_id
- elem.attrib[ 'version' ] = ''
- tool_section = galaxy.tools.ToolSection( elem )
- trans.app.toolbox.tool_panel[ tool_panel_section_key ] = tool_section
+ if tool_panel_dict:
+ #tool_panel_dict is empty when tools exist but are not installed into a tool panel
+ tool_section_dicts = tool_panel_dict[ tool_panel_dict.keys()[ 0 ] ]
+ tool_section_dict = tool_section_dicts[ 0 ]
+ original_section_id = tool_section_dict[ 'id' ]
+ original_section_name = tool_section_dict[ 'name' ]
+ if original_section_id:
+ tool_panel_section_key = 'section_%s' % str( original_section_id )
+ if tool_panel_section_key in trans.app.toolbox.tool_panel:
+ tool_section = trans.app.toolbox.tool_panel[ tool_panel_section_key ]
+ else:
+ # The section in which the tool was originally loaded used to be in the tool panel, but no longer is.
+ elem = Element( 'section' )
+ elem.attrib[ 'name' ] = original_section_name
+ elem.attrib[ 'id' ] = original_section_id
+ elem.attrib[ 'version' ] = ''
+ tool_section = galaxy.tools.ToolSection( elem )
+ trans.app.toolbox.tool_panel[ tool_panel_section_key ] = tool_section
else:
# The user elected to change the tool panel section to contain the tools.
if new_tool_panel_section:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Do not install Data Managers from the Tool Shed into the Tool Panel.
by Bitbucket 15 Feb '13
by Bitbucket 15 Feb '13
15 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/2664d904641a/
changeset: 2664d904641a
user: dan
date: 2013-02-15 19:34:43
summary: Do not install Data Managers from the Tool Shed into the Tool Panel.
affected #: 2 files
diff -r 0c8763c8d52918ee15f83288d6d7cef153267239 -r 2664d904641abdc1ed6a2f972eb5aeefa8f93703 lib/galaxy/util/shed_util.py
--- a/lib/galaxy/util/shed_util.py
+++ b/lib/galaxy/util/shed_util.py
@@ -469,13 +469,14 @@
section_name = ''
section_version = ''
for tool_dict in tool_dicts:
- guid = tool_dict[ 'guid' ]
- tool_config = tool_dict[ 'tool_config' ]
- tool_section_dict = dict( tool_config=tool_config, id=section_id, name=section_name, version=section_version )
- if guid in tool_panel_dict:
- tool_panel_dict[ guid ].append( tool_section_dict )
- else:
- tool_panel_dict[ guid ] = [ tool_section_dict ]
+ if tool_dict.get( 'add_to_tool_panel', True ):
+ guid = tool_dict[ 'guid' ]
+ tool_config = tool_dict[ 'tool_config' ]
+ tool_section_dict = dict( tool_config=tool_config, id=section_id, name=section_name, version=section_version )
+ if guid in tool_panel_dict:
+ tool_panel_dict[ guid ].append( tool_section_dict )
+ else:
+ tool_panel_dict[ guid ] = [ tool_section_dict ]
return tool_panel_dict
def generate_tool_panel_dict_for_tool_config( guid, tool_config, tool_sections=None ):
"""
diff -r 0c8763c8d52918ee15f83288d6d7cef153267239 -r 2664d904641abdc1ed6a2f972eb5aeefa8f93703 lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -1614,7 +1614,8 @@
tool_config=tool_config,
tool_type=tool.tool_type,
requirements=tool_requirements,
- tests=tool_tests )
+ tests=tool_tests,
+ add_to_tool_panel=tool.tool_type not in TOOL_TYPES_NOT_IN_TOOL_PANEL )
if 'tools' in metadata_dict:
metadata_dict[ 'tools' ].append( tool_dict )
else:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
15 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/0c8763c8d529/
changeset: 0c8763c8d529
user: dan
date: 2013-02-15 19:19:30
summary: Minor formating fix for 22f7938bfa33.
affected #: 1 file
diff -r 22f7938bfa3331e1f4e03b67b85b1f9602fd1e85 -r 0c8763c8d52918ee15f83288d6d7cef153267239 lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
--- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
@@ -705,7 +705,7 @@
new_install=True )
if 'data_manager' in metadata_dict:
new_data_managers = shed_util.install_data_managers( trans.app, trans.app.config.shed_data_manager_config_file, metadata_dict, shed_config_dict, relative_install_dir,
- tool_shed_repository, repository_tools_tups )
+ tool_shed_repository, repository_tools_tups )
if 'datatypes' in metadata_dict:
tool_shed_repository.status = trans.model.ToolShedRepository.installation_status.LOADING_PROPRIETARY_DATATYPES
if not tool_shed_repository.includes_datatypes:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Handle Data Managers when reactivating a deactivated Tool Shed Repository.
by Bitbucket 15 Feb '13
by Bitbucket 15 Feb '13
15 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/22f7938bfa33/
changeset: 22f7938bfa33
user: dan
date: 2013-02-15 19:18:00
summary: Handle Data Managers when reactivating a deactivated Tool Shed Repository.
affected #: 2 files
diff -r f53c0039c2c07979b54ce42d680aabbce3be1116 -r 22f7938bfa3331e1f4e03b67b85b1f9602fd1e85 lib/galaxy/util/shed_util.py
--- a/lib/galaxy/util/shed_util.py
+++ b/lib/galaxy/util/shed_util.py
@@ -42,6 +42,11 @@
shed_tool_conf,
tool_panel_dict,
new_install=False )
+ if repository.includes_data_managers:
+ tp, data_manager_relative_install_dir = repository.get_tool_relative_path( trans.app )
+ data_manager_relative_install_dir = os.path.join( data_manager_relative_install_dir, repository.name ) #hack to add repository.name here, which is actually the root of the installed repository
+ new_data_managers = install_data_managers( trans.app, trans.app.config.shed_data_manager_config_file, metadata, repository.get_shed_config_dict( trans.app ), data_manager_relative_install_dir,
+ repository, repository_tools_tups )
trans.sa_session.add( repository )
trans.sa_session.flush()
if repository.includes_datatypes:
diff -r f53c0039c2c07979b54ce42d680aabbce3be1116 -r 22f7938bfa3331e1f4e03b67b85b1f9602fd1e85 lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
--- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
@@ -704,7 +704,7 @@
tool_panel_dict=tool_panel_dict,
new_install=True )
if 'data_manager' in metadata_dict:
- rval = shed_util.install_data_managers( trans.app, trans.app.config.shed_data_manager_config_file, metadata_dict, shed_config_dict, relative_install_dir,
+ new_data_managers = shed_util.install_data_managers( trans.app, trans.app.config.shed_data_manager_config_file, metadata_dict, shed_config_dict, relative_install_dir,
tool_shed_repository, repository_tools_tups )
if 'datatypes' in metadata_dict:
tool_shed_repository.status = trans.model.ToolShedRepository.installation_status.LOADING_PROPRIETARY_DATATYPES
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/f53c0039c2c0/
changeset: f53c0039c2c0
user: jgoecks
date: 2013-02-15 18:44:08
summary: Use strict equality operators.
affected #: 1 file
diff -r 8484a745317e5402e987401c85359e8c7a513445 -r f53c0039c2c07979b54ce42d680aabbce3be1116 static/scripts/viz/visualization.js
--- a/static/scripts/viz/visualization.js
+++ b/static/scripts/viz/visualization.js
@@ -236,8 +236,8 @@
ready_deferred = $.Deferred(),
// If requesting raw data, query dataset state; if requesting (converted) data,
// need to query converted datasets state.
- query_type = (this.get('data_type') == 'raw_data' ? 'state' :
- this.get('data_type') == 'data' ? 'converted_datasets_state' : "error" ),
+ query_type = (this.get('data_type') === 'raw_data' ? 'state' :
+ this.get('data_type') === 'data' ? 'converted_datasets_state' : "error" ),
ss_deferred = new util_mod.ServerStateDeferred({
ajax_settings: {
url: this.get('dataset').url(),
@@ -575,7 +575,7 @@
*/
get_chrom_region: function(chr_name) {
var chrom_info = _.find(this.get_chroms_info(), function(chrom_info) {
- return chrom_info.chrom == chr_name;
+ return chrom_info.chrom === chr_name;
});
return new GenomeRegion({
chrom: chrom_info.chrom,
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: dan: Give Data Managers from Tool Sheds their own guid.
by Bitbucket 15 Feb '13
by Bitbucket 15 Feb '13
15 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/8484a745317e/
changeset: 8484a745317e
user: dan
date: 2013-02-15 18:01:44
summary: Give Data Managers from Tool Sheds their own guid.
affected #: 3 files
diff -r ef0e9bf34c0b22dd355759478aa85fc2d46d49d4 -r 8484a745317e5402e987401c85359e8c7a513445 lib/galaxy/tools/data_manager/manager.py
--- a/lib/galaxy/tools/data_manager/manager.py
+++ b/lib/galaxy/tools/data_manager/manager.py
@@ -64,31 +64,38 @@
self.managed_data_tables[ data_table_name ].append( data_manager )
def get_manager( self, *args, **kwds ):
return self.data_managers.get( *args, **kwds )
- def remove_manager( self, manager_id ):
- data_manager = self.get_manager( manager_id, None )
- if data_manager is not None:
- del self.data_managers[ manager_id ]
- #remove tool from toolbox
- if data_manager.tool:
- self.app.toolbox.remove_tool_by_id( data_manager.tool.id )
- #determine if any data_tables are no longer tracked
- for data_table_name in data_manager.data_tables.keys():
- remove_data_table_tracking = True
- for other_data_manager in self.data_managers.itervalues():
- if data_table_name in other_data_manager.data_tables:
- remove_data_table_tracking = False
- break
- if remove_data_table_tracking and data_table_name in self.managed_data_tables:
- del self.managed_data_tables[ data_table_name ]
+ def remove_manager( self, manager_ids ):
+ if not isinstance( manager_ids, list ):
+ manager_ids = [ manager_ids ]
+ for manager_id in manager_ids:
+ data_manager = self.get_manager( manager_id, None )
+ if data_manager is not None:
+ del self.data_managers[ manager_id ]
+ #remove tool from toolbox
+ if data_manager.tool:
+ self.app.toolbox.remove_tool_by_id( data_manager.tool.id )
+ #determine if any data_tables are no longer tracked
+ for data_table_name in data_manager.data_tables.keys():
+ remove_data_table_tracking = True
+ for other_data_manager in self.data_managers.itervalues():
+ if data_table_name in other_data_manager.data_tables:
+ remove_data_table_tracking = False
+ break
+ if remove_data_table_tracking and data_table_name in self.managed_data_tables:
+ del self.managed_data_tables[ data_table_name ]
class DataManager( object ):
+ GUID_TYPE = 'data_manager'
+ DEFAULT_VERSION = "0.0.1"
+
def __init__( self, data_managers, elem=None, tool_path=None ):
self.data_managers = data_managers
self.declared_id = None
self.name = None
self.description = None
+ self.version = self.DEFAULT_VERSION
+ self.guid = None
self.tool = None
- self.tool_guid = None
self.data_tables = odict()
self.output_ref_by_data_table = {}
self.move_by_data_table_column = {}
@@ -98,12 +105,14 @@
def load_from_element( self, elem, tool_path ):
assert elem.tag == 'data_manager', 'A data manager configuration must have a "data_manager" tag as the root. "%s" is present' % ( root.tag )
self.declared_id = elem.get( 'id', None )
+ self.guid = elem.get( 'guid', None )
path = elem.get( 'tool_file', None )
+ tool_guid = None
if path is None:
tool_elem = elem.find( 'tool' )
assert tool_elem is not None, "Error loading tool for data manager. Make sure that a tool_file attribute or a tool tag set has been defined:\n%s" % ( util.xml_to_string( elem ) )
path = tool_elem.get( "file", None )
- self.tool_guid = tool_elem.get( "guid", None )
+ tool_guid = tool_elem.get( "guid", None )
#use shed_conf_file to determine tool_path
shed_conf_file = elem.get( "shed_conf_file", None )
if shed_conf_file:
@@ -111,7 +120,7 @@
if shed_conf:
tool_path = shed_conf.get( "tool_path", tool_path )
assert path is not None, "A tool file path could not be determined:\n%s" % ( util.xml_to_string( elem ) )
- self.load_tool( os.path.join( tool_path, path ), guid=self.tool_guid, data_manager_id=self.id )
+ self.load_tool( os.path.join( tool_path, path ), guid=tool_guid, data_manager_id=self.id )
self.name = elem.get( 'name', self.tool.name )
self.description = elem.get( 'description', self.tool.description )
@@ -164,7 +173,7 @@
self.move_by_data_table_column[ data_table_name ][ data_table_coumn_name ] = dict( type=move_type, source_base=source_base, source_value=source_value, target_base=target_base, target_value=target_value, relativize_symlinks=relativize_symlinks )
@property
def id( self ):
- return self.tool_guid or self.declared_id #if we have a tool with a guid, we will use that as the tool_manager id
+ return self.guid or self.declared_id #if we have a guid, we will use that as the data_manager id
def load_tool( self, tool_filename, guid=None, data_manager_id=None ):
tool = self.data_managers.app.toolbox.load_tool( tool_filename, guid=guid, data_manager_id=data_manager_id )
self.data_managers.app.toolbox.data_manager_tools[ tool.id ] = tool
diff -r ef0e9bf34c0b22dd355759478aa85fc2d46d49d4 -r 8484a745317e5402e987401c85359e8c7a513445 lib/galaxy/util/shed_util.py
--- a/lib/galaxy/util/shed_util.py
+++ b/lib/galaxy/util/shed_util.py
@@ -1194,7 +1194,11 @@
if data_manager_dict is None:
log.error( "Data manager metadata is not defined properly for '%s'." % ( data_manager_id ) )
continue
-
+ guid = data_manager_dict.get( 'guid', None )
+ if guid is None:
+ log.error( "Data manager guid '%s' is not set in metadata for '%s'." % ( guid, data_manager_id ) )
+ continue
+ elem.set( 'guid', guid )
tool_guid = data_manager_dict.get( 'tool_guid', None )
if tool_guid is None:
log.error( "Data manager tool guid '%s' is not set in metadata for '%s'." % ( tool_guid, data_manager_id ) )
@@ -1510,27 +1514,18 @@
def remove_from_data_manager( app, repository ):
metadata_dict = repository.metadata
if metadata_dict and 'data_manager' in metadata_dict:
- data_manager_tool_guids = [ data_manager_dict.get( 'tool_guid' ) for data_manager_dict in metadata_dict.get( 'data_manager', {} ).get( 'data_managers', {} ).itervalues() if 'tool_guid' in data_manager_dict ]
shed_data_manager_conf_filename = app.config.shed_data_manager_config_file
tree = util.parse_xml( shed_data_manager_conf_filename )
root = tree.getroot()
assert root.tag == 'data_managers', 'The file provided (%s) for removing data managers from is not a valid data manager xml file.' % ( shed_data_manager_conf_filename )
+ guids = [ data_manager_dict.get( 'guid' ) for data_manager_dict in metadata_dict.get( 'data_manager', {} ).get( 'data_managers', {} ).itervalues() if 'guid' in data_manager_dict ]
config_elems = []
for elem in root:
- keep_elem = True
- if elem.tag == 'data_manager':
- tool_elem = elem.find( 'tool' )
- if tool_elem is not None:
- tool_guid = tool_elem.get( 'guid', None )
- if tool_guid in data_manager_tool_guids:
- keep_elem = False
- if keep_elem:
+ if elem.tag != 'data_manager' or elem.get( 'guid', None ) not in guids:
config_elems.append( elem )
- #remove data manager from in memory
- for data_manager_tool_guids in data_manager_tool_guids:
- #for shed-based data managers, the data_manager id is the same as the tool guid
- app.data_managers.remove_manager( data_manager_tool_guids )
- # Persist the altered shed_tool_config file.
+ #remove data managers from in memory
+ app.data_managers.remove_manager( guids )
+ # Persist the altered shed_data_manager_config file.
suc.data_manager_config_elems_to_xml_file( app, config_elems, shed_data_manager_conf_filename )
def remove_from_shed_tool_config( trans, shed_tool_conf_dict, guids_to_remove ):
# A tool shed repository is being uninstalled so change the shed_tool_conf file. Parse the config file to generate the entire list
diff -r ef0e9bf34c0b22dd355759478aa85fc2d46d49d4 -r 8484a745317e5402e987401c85359e8c7a513445 lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -13,6 +13,7 @@
import sqlalchemy.orm.exc
from galaxy.tools.parameters import dynamic_options
from galaxy.tool_shed import encoding_util
+from galaxy.tools.data_manager.manager import DataManager
from galaxy import eggs
import pkg_resources
@@ -1012,7 +1013,7 @@
def generate_clone_url_for_repository_in_tool_shed( trans, repository ):
"""Generate the URL for cloning a repository that is in the tool shed."""
base_url = url_for( '/', qualified=True ).rstrip( '/' )
- if trans.user:
+ if trans and trans.user:
protocol, base = base_url.split( '://' )
username = '%s@' % trans.user.username
return '%s://%s%s/repos/%s/%s' % ( protocol, username, base, repository.user.username, repository.name )
@@ -1038,10 +1039,14 @@
tools[tool_conf_name] = tool
repo_path = repository.repo_path( app )
try:
+ #Galaxy Side
repo_files_directory = repository.repo_files_directory( app )
repo_dir = repo_files_directory
+ repository_clone_url = generate_clone_url_for_installed_repository( app, repository )
except AttributeError:
+ #Tool Shed side
repo_files_directory = repo_path
+ repository_clone_url = generate_clone_url_for_repository_in_tool_shed( None, repository )
relative_data_manager_dir = util.relpath( os.path.split( data_manager_config_filename )[0], repo_dir )
rel_data_manager_config_filename = os.path.join( relative_data_manager_dir, os.path.split( data_manager_config_filename )[1] )
data_managers = {}
@@ -1057,6 +1062,8 @@
if data_manager_id is None:
log.error( 'Data Manager entry is missing id attribute in "%s".' % ( data_manager_config_filename ) )
continue
+ version = data_manager_elem.get( 'version', DataManager.DEFAULT_VERSION )
+ guid = generate_guid_for_object( repository_clone_url, DataManager.GUID_TYPE, data_manager_id, version )
data_tables = []
if tool_file is None:
log.error( 'Data Manager entry is missing tool_file attribute in "%s".' % ( data_manager_config_filename ) )
@@ -1073,7 +1080,7 @@
if tool is None:
log.error( "Unable to determine tools metadata for '%s'." % ( data_manager_metadata_tool_file ) )
continue
- data_managers[ data_manager_id ] = { 'tool_config_file': data_manager_metadata_tool_file, 'data_tables': data_tables, 'tool_guid': tool['guid'] }
+ data_managers[ data_manager_id ] = { 'guid': guid, 'version': version, 'tool_config_file': data_manager_metadata_tool_file, 'data_tables': data_tables, 'tool_guid': tool['guid'] }
log.debug( 'Loaded Data Manager tool_files: %s' % ( tool_file ) )
return metadata_dict
def generate_datatypes_metadata( datatypes_config, metadata_dict ):
@@ -1555,6 +1562,9 @@
version_elem = SubElement( tool_elem, 'version' )
version_elem.text = tool.version
return tool_elem
+def generate_guid_for_object( repository_clone_url, guid_type, obj_id, version ):
+ tmp_url = clean_repository_clone_url( repository_clone_url )
+ return '%s/%s/%s/%s' % ( tmp_url, guid_type, obj_id, version )
def generate_tool_guid( repository_clone_url, tool ):
"""
Generate a guid for the installed tool. It is critical that this guid matches the guid for
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/ef0e9bf34c0b/
changeset: ef0e9bf34c0b
user: dan
date: 2013-02-15 17:58:29
summary: Add missing Data Manager controller.
affected #: 1 file
diff -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 -r ef0e9bf34c0b22dd355759478aa85fc2d46d49d4 lib/galaxy/webapps/galaxy/controllers/data_manager.py
--- /dev/null
+++ b/lib/galaxy/webapps/galaxy/controllers/data_manager.py
@@ -0,0 +1,79 @@
+from galaxy import web
+from galaxy.web.base.controller import BaseUIController
+from galaxy.util.json import from_json_string
+
+import pkg_resources;
+pkg_resources.require( "Paste" )
+import paste.httpexceptions
+
+#set up logger
+import logging
+log = logging.getLogger( __name__ )
+
+class DataManager( BaseUIController ):
+
+ @web.expose
+ def index( self, trans, **kwd ):
+ not_is_admin = not trans.user_is_admin()
+ if not_is_admin and not trans.app.config.enable_data_manager_user_view:
+ raise paste.httpexceptions.HTTPUnauthorized( "This Galaxy instance is not configured to allow non-admins to view the data manager." )
+ message = kwd.get( 'message' )
+ status = kwd.get( 'status', 'info' )
+ return trans.fill_template( "data_manager/index.mako", data_managers=trans.app.data_managers, view_only=not_is_admin, message=message, status=status )
+
+ @web.expose
+ def manage_data_manager( self, trans, **kwd ):
+ not_is_admin = not trans.user_is_admin()
+ if not_is_admin and not trans.app.config.enable_data_manager_user_view:
+ raise paste.httpexceptions.HTTPUnauthorized( "This Galaxy instance is not configured to allow non-admins to view the data manager." )
+ message = kwd.get( 'message' )
+ status = kwd.get( 'status', 'info' )
+ data_manager_id = kwd.get( 'id', None )
+ data_manager = trans.app.data_managers.get_manager( data_manager_id )
+ if data_manager is None:
+ return trans.response.send_redirect( web.url_for( controller="data_manager", action="index", message="Invalid Data Manager (%s) was requested" % data_manager_id, status="error" ) )
+ jobs = reversed( [ assoc.job for assoc in trans.sa_session.query( trans.app.model.DataManagerJobAssociation ).filter_by( data_manager_id=data_manager_id ) ] )
+ return trans.fill_template( "data_manager/manage_data_manager.mako", data_manager=data_manager, jobs=jobs, view_only=not_is_admin, message=message, status=status )
+
+ @web.expose
+ def view_job( self, trans, **kwd ):
+ not_is_admin = not trans.user_is_admin()
+ if not_is_admin and not trans.app.config.enable_data_manager_user_view:
+ raise paste.httpexceptions.HTTPUnauthorized( "This Galaxy instance is not configured to allow non-admins to view the data manager." )
+ message = kwd.get( 'message' )
+ status = kwd.get( 'status', 'info' )
+ job_id = kwd.get( 'id', None )
+ try:
+ job_id = trans.security.decode_id( job_id )
+ job = trans.app.model.Job.get( job_id )
+ except Exception, e:
+ job = None
+ log.error( "Bad job id (%s) passed to view_job: %s" % ( job_id, e ) )
+ if not job:
+ return trans.response.send_redirect( web.url_for( controller="data_manager", action="index",message="Invalid job (%s) was requested" % job_id, status="error" ) )
+ data_manager_id = job.data_manager_association.data_manager_id
+ data_manager = trans.app.data_managers.get_manager( data_manager_id )
+ hdas = [ assoc.dataset for assoc in job.get_output_datasets() ]
+ data_manager_output = []
+ for hda in hdas:
+ data_manager_json = from_json_string( open( hda.get_file_name() ).read() )
+ values = []
+ for key, value in data_manager_json.get( 'data_tables', {} ).iteritems():
+ values.append( ( key, value ) )
+ data_manager_output.append( values )
+ return trans.fill_template( "data_manager/view_job.mako", data_manager=data_manager, job=job, view_only=not_is_admin, hdas=hdas, data_manager_output=data_manager_output, message=message, status=status )
+
+ @web.expose
+ def manage_data_table( self, trans, **kwd ):
+ not_is_admin = not trans.user_is_admin()
+ if not_is_admin and not trans.app.config.enable_data_manager_user_view:
+ raise paste.httpexceptions.HTTPUnauthorized( "This Galaxy instance is not configured to allow non-admins to view the data manager." )
+ message = kwd.get( 'message' )
+ status = kwd.get( 'status', 'info' )
+ data_table_name = kwd.get( 'table_name', None )
+ if not data_table_name:
+ return trans.response.send_redirect( web.url_for( controller="data_manager", action="index" ) )
+ data_table = trans.app.tool_data_tables.get( data_table_name, None )
+ if data_table is None:
+ return trans.response.send_redirect( web.url_for( controller="data_manager", action="index", message="Invalid Data table (%s) was requested" % data_table_name, status="error" ) )
+ return trans.fill_template( "data_manager/manage_data_table.mako", data_table=data_table, view_only=not_is_admin, message=message, status=status )
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: inithello: Enhance tool shed functional tests to be more informative when errors occur.
by Bitbucket 15 Feb '13
by Bitbucket 15 Feb '13
15 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/d04aa3ad6132/
changeset: d04aa3ad6132
user: inithello
date: 2013-02-15 17:42:19
summary: Enhance tool shed functional tests to be more informative when errors occur.
affected #: 23 files
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/base/twilltestcase.py
--- a/test/tool_shed/base/twilltestcase.py
+++ b/test/tool_shed/base/twilltestcase.py
@@ -941,7 +941,10 @@
for data_table in data_tables:
if 'name' in table_elem.attrib and table_elem.attrib[ 'name' ] == data_table:
file_elem = table_elem.find( 'file' )
- assert os.path.exists( file_elem.attrib[ 'path' ] ), 'Tool data table file %s not found.' % file_elem.path
+ file_path = file_elem.get( 'path', None )
+ full_path = os.path.join( self.tool_data_path, file_path )
+ assert file_path is not None, 'No file path configured for this data table.'
+ assert os.path.exists( full_path ), 'Tool data table file %s not found.' % full_path
found = True
break
assert found, 'No entry for %s in %s.' % ( data_table, self.shed_tool_data_table_conf )
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_0000_basic_repository_features.py
--- a/test/tool_shed/functional/test_0000_basic_repository_features.py
+++ b/test/tool_shed/functional/test_0000_basic_repository_features.py
@@ -83,7 +83,9 @@
repository = test_db_util.get_repository_by_name_and_owner( repository_name, common.test_user_1_name )
self.logout()
self.login( email=common.admin_email, username=common.admin_username )
- self.set_repository_malicious( repository, set_malicious=True, strings_displayed=[ 'The repository tip has been defined as malicious.' ] )
+ self.set_repository_malicious( repository,
+ set_malicious=True,
+ strings_displayed=[ 'The repository tip has been defined as malicious.' ] )
self.set_repository_malicious( repository,
set_malicious=False,
strings_displayed=[ 'The repository tip has been defined as <b>not</b> malicious.' ] )
@@ -92,8 +94,8 @@
self.set_repository_deprecated( repository,
strings_displayed=[ 'has been marked as deprecated', 'Mark as not deprecated' ] )
self.display_manage_repository_page( repository,
- strings_displayed=[ 'This repository has been marked as deprecated' ],
- strings_not_displayed=[ 'Upload files', 'Reset all repository metadata' ] )
+ strings_displayed=[ 'This repository has been marked as deprecated' ],
+ strings_not_displayed=[ 'Upload files', 'Reset all repository metadata' ] )
self.browse_repository( repository, strings_not_displayed=[ 'Upload files' ] )
self.set_repository_deprecated( repository,
strings_displayed=[ 'has been marked as not deprecated', 'Mark as deprecated' ],
@@ -197,16 +199,18 @@
def test_0090_verify_reserved_repository_name_handling( self ):
'''Check that reserved repository names are handled correctly.'''
category = test_db_util.get_category_by_name( 'Test 0000 Basic Repository Features 1' )
+ error_message = 'The term <b>repos</b> is a reserved word in the tool shed, so it cannot be used as a repository name.'
self.get_or_create_repository( name='repos',
description=repository_description,
long_description=repository_long_description,
owner=common.test_user_1_name,
category_id=self.security.encode_id( category.id ),
- strings_displayed=[ 'The term <b>repos</b> is a reserved word in the tool shed, so it cannot be used as a repository name.' ] )
+ strings_displayed=[ error_message ] )
def test_0100_verify_reserved_username_handling( self ):
'''Check that reserved usernames are handled correctly.'''
self.logout()
self.login( email='baduser(a)bx.psu.edu', username='repos' )
test_user_1 = test_db_util.get_user( 'baduser(a)bx.psu.edu' )
assert test_user_1 is None, 'Creating user with public name "repos" succeeded.'
- self.check_for_strings( strings_displayed=[ 'The term <b>repos</b> is a reserved word in the tool shed, so it cannot be used as a public user name.' ] )
+ error_message = 'The term <b>repos</b> is a reserved word in the tool shed, so it cannot be used as a public user name.'
+ self.check_for_strings( strings_displayed=[ error_message ] )
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_0020_basic_repository_dependencies.py
--- a/test/tool_shed/functional/test_0020_basic_repository_dependencies.py
+++ b/test/tool_shed/functional/test_0020_basic_repository_dependencies.py
@@ -6,8 +6,8 @@
datatypes_repository_long_description = "Galaxy applicable data formats used by Emboss tools. This repository contains no tools."
emboss_repository_name = 'emboss_0020'
-emboss_repository_description = 'Galaxy wrappers for Emboss version 5.0.0 tools'
-emboss_repository_long_description = 'Galaxy wrappers for Emboss version 5.0.0 tools'
+emboss_repository_description = 'Galaxy wrappers for Emboss version 5.0.0 tools for test 0020'
+emboss_repository_long_description = 'Galaxy wrappers for Emboss version 5.0.0 tools for test 0020'
class TestBasicRepositoryDependencies( ShedTwillTestCase ):
'''Testing emboss 5 with repository dependencies.'''
@@ -93,8 +93,8 @@
'emboss',
'5.0.0',
'package',
- datatypes_repository_name,
- common.test_user_1_name,
+ 'emboss_datatypes_0020',
+ 'user1',
changeset_revision,
'Repository dependencies' ]
self.display_manage_repository_page( repository, strings_displayed=strings_displayed )
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_0030_repository_dependency_revisions.py
--- a/test/tool_shed/functional/test_0030_repository_dependency_revisions.py
+++ b/test/tool_shed/functional/test_0030_repository_dependency_revisions.py
@@ -1,6 +1,7 @@
from tool_shed.base.twilltestcase import ShedTwillTestCase, common, os
import tool_shed.base.test_db_util as test_db_util
-
+import logging
+log = logging.getLogger(__name__)
datatypes_repository_name = 'emboss_datatypes_0030'
datatypes_repository_description = "Galaxy applicable data formats used by Emboss tools."
datatypes_repository_long_description = "Galaxy applicable data formats used by Emboss tools. This repository contains no tools."
@@ -8,8 +9,8 @@
emboss_repository_name = 'emboss_0030'
emboss_5_repository_name = 'emboss_5_0030'
emboss_6_repository_name = 'emboss_6_0030'
-emboss_repository_description = 'Galaxy wrappers for Emboss version 5.0.0 tools'
-emboss_repository_long_description = 'Galaxy wrappers for Emboss version 5.0.0 tools'
+emboss_repository_description = 'Galaxy wrappers for Emboss version 5.0.0 tools for test 0030'
+emboss_repository_long_description = 'Galaxy wrappers for Emboss version 5.0.0 tools for test 0030'
class TestRepositoryDependencyRevisions( ShedTwillTestCase ):
'''Test dependencies on different revisions of a repository.'''
@@ -91,10 +92,10 @@
self.login( email=common.test_user_1_email, username=common.test_user_1_name )
category = test_db_util.get_category_by_name( 'Test 0030 Repository Dependency Revisions' )
repository = self.get_or_create_repository( name=emboss_repository_name,
- description=emboss_repository_description,
- long_description=emboss_repository_long_description,
- owner=common.test_user_1_name,
- category_id=self.security.encode_id( category.id ) )
+ description=emboss_repository_description,
+ long_description=emboss_repository_long_description,
+ owner=common.test_user_1_name,
+ category_id=self.security.encode_id( category.id ) )
self.upload_file( repository,
filename='emboss/emboss.tar',
filepath=None,
@@ -175,14 +176,8 @@
datatypes_tip = self.get_repository_tip( datatypes_repository )
# Iterate through all metadata revisions and check for repository dependencies.
for metadata, changeset_revision in repository_metadata:
- strings_displayed = [ str( metadata_elem ) for metadata_elem in metadata[ 'repository_dependencies' ][ 'repository_dependencies' ][ 0 ] ]
- # Remove the tool shed URL, because that's not displayed on the page (yet?)
- strings_displayed.pop( strings_displayed.index( self.url ) )
# Add the dependency description and datatypes repository details to the strings to check.
- strings_displayed.extend( [ metadata[ 'repository_dependencies' ][ 'description' ],
- datatypes_repository_name,
- datatypes_repository.user.username,
- datatypes_tip ] )
+ strings_displayed.extend( [ 'Emboss requires the Emboss', 'emboss_datatypes_0030', 'user1', datatypes_tip ] )
strings_displayed.extend( [ 'Tool dependencies', 'emboss', '5.0.0', 'package' ] )
self.display_manage_repository_page( repository,
changeset_revision=changeset_revision,
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_0040_repository_circular_dependencies.py
--- a/test/tool_shed/functional/test_0040_repository_circular_dependencies.py
+++ b/test/tool_shed/functional/test_0040_repository_circular_dependencies.py
@@ -2,12 +2,12 @@
import tool_shed.base.test_db_util as test_db_util
freebayes_repository_name = 'freebayes_0040'
-freebayes_repository_description = "Galaxy's freebayes tool"
-freebayes_repository_long_description = "Long description of Galaxy's freebayes tool"
+freebayes_repository_description = "Galaxy's freebayes tool for test 0040"
+freebayes_repository_long_description = "Long description of Galaxy's freebayes tool for test 0040"
filtering_repository_name = 'filtering_0040'
-filtering_repository_description = "Galaxy's filtering tool"
-filtering_repository_long_description = "Long description of Galaxy's filtering tool"
+filtering_repository_description = "Galaxy's filtering tool for test 0040"
+filtering_repository_long_description = "Long description of Galaxy's filtering tool for test 0040"
class TestRepositoryCircularDependencies( ShedTwillTestCase ):
'''Verify that the code correctly displays repositories with circular repository dependencies.'''
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_0400_repository_component_reviews.py
--- a/test/tool_shed/functional/test_0400_repository_component_reviews.py
+++ b/test/tool_shed/functional/test_0400_repository_component_reviews.py
@@ -474,7 +474,7 @@
valid_tools_only=True,
uncompress_file=True,
remove_repo_files_not_in_tar=False,
- commit_message='Uploaded filtering 1.1.0 tarball.',
+ commit_message='Uploaded filtering test data.',
strings_displayed=[],
strings_not_displayed=[] )
def test_0110_review_new_changeset_functional_tests( self ):
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
--- a/test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
+++ b/test/tool_shed/functional/test_1010_install_repository_with_tool_dependencies.py
@@ -111,10 +111,10 @@
install_tool_dependencies=False,
new_tool_panel_section='test_1010' )
installed_repository = test_db_util.get_installed_repository_by_name_owner( repository_name, common.test_user_1_name )
- strings_displayed = [ installed_repository.name,
- installed_repository.description,
- installed_repository.owner,
- installed_repository.tool_shed,
+ strings_displayed = [ 'freebayes_0010',
+ "Galaxy's freebayes tool",
+ 'user1',
+ self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
self.display_installed_repository_manage_page( installed_repository,
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_1020_install_repository_with_repository_dependencies.py
--- a/test/tool_shed/functional/test_1020_install_repository_with_repository_dependencies.py
+++ b/test/tool_shed/functional/test_1020_install_repository_with_repository_dependencies.py
@@ -6,8 +6,8 @@
datatypes_repository_long_description = "Galaxy applicable data formats used by Emboss tools. This repository contains no tools."
emboss_repository_name = 'emboss_0020'
-emboss_repository_description = 'Galaxy wrappers for Emboss version 5.0.0 tools'
-emboss_repository_long_description = 'Galaxy wrappers for Emboss version 5.0.0 tools'
+emboss_repository_description = 'Galaxy wrappers for Emboss version 5.0.0 tools for test 0020'
+emboss_repository_long_description = 'Galaxy wrappers for Emboss version 5.0.0 tools for test 0020'
base_datatypes_count = 0
repository_datatypes_count = 0
@@ -103,10 +103,10 @@
install_tool_dependencies=False,
new_tool_panel_section='test_1020' )
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'emboss_0020', common.test_user_1_name )
- strings_displayed = [ installed_repository.name,
- installed_repository.description,
- installed_repository.owner,
- installed_repository.tool_shed,
+ strings_displayed = [ 'emboss_0020',
+ 'Galaxy wrappers for Emboss version 5.0.0 tools for test 0020',
+ 'user1',
+ self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
self.display_installed_repository_manage_page( installed_repository,
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_1030_install_repository_with_dependency_revisions.py
--- a/test/tool_shed/functional/test_1030_install_repository_with_dependency_revisions.py
+++ b/test/tool_shed/functional/test_1030_install_repository_with_dependency_revisions.py
@@ -8,8 +8,8 @@
emboss_repository_name = 'emboss_0030'
emboss_5_repository_name = 'emboss_5_0030'
emboss_6_repository_name = 'emboss_6_0030'
-emboss_repository_description = 'Galaxy wrappers for Emboss version 5.0.0 tools'
-emboss_repository_long_description = 'Galaxy wrappers for Emboss version 5.0.0 tools'
+emboss_repository_description = 'Galaxy wrappers for Emboss version 5.0.0 tools for test 0030'
+emboss_repository_long_description = 'Galaxy wrappers for Emboss version 5.0.0 tools for test 0030'
base_datatypes_count = 0
repository_datatypes_count = 0
@@ -173,8 +173,8 @@
install_tool_dependencies=False,
new_tool_panel_section='test_1030' )
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'emboss_0030', common.test_user_1_name )
- strings_displayed = [ installed_repository.name,
- installed_repository.description,
+ strings_displayed = [ 'emboss_0030',
+ 'Galaxy wrappers for Emboss version 5.0.0 tools for test 0030',
installed_repository.owner,
installed_repository.tool_shed,
installed_repository.installed_changeset_revision ]
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_1040_install_repository_basic_circular_dependencies.py
--- a/test/tool_shed/functional/test_1040_install_repository_basic_circular_dependencies.py
+++ b/test/tool_shed/functional/test_1040_install_repository_basic_circular_dependencies.py
@@ -2,12 +2,12 @@
import tool_shed.base.test_db_util as test_db_util
freebayes_repository_name = 'freebayes_0040'
-freebayes_repository_description = "Galaxy's freebayes tool"
-freebayes_repository_long_description = "Long description of Galaxy's freebayes tool"
+freebayes_repository_description = "Galaxy's freebayes tool for test 0040"
+freebayes_repository_long_description = "Long description of Galaxy's freebayes tool for test 0040"
filtering_repository_name = 'filtering_0040'
-filtering_repository_description = "Galaxy's filtering tool"
-filtering_repository_long_description = "Long description of Galaxy's filtering tool"
+filtering_repository_description = "Galaxy's filtering tool for test 0040"
+filtering_repository_long_description = "Long description of Galaxy's filtering tool for test 0040"
category_name = 'test_0040_repository_circular_dependencies'
@@ -164,6 +164,6 @@
self.check_galaxy_repository_tool_panel_section( installed_freebayes_repository, 'freebayes' )
strings_displayed = [ 'Missing repository', 'freebayes' ]
self.display_installed_repository_manage_page( installed_filtering_repository, strings_displayed=strings_displayed )
- self.check_galaxy_repository_db_status( freebayes_repository_name,
- common.test_user_1_name,
+ self.check_galaxy_repository_db_status( 'freebayes_0040',
+ 'user1',
'Uninstalled' )
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_1050_circular_dependencies_4_levels.py
--- a/test/tool_shed/functional/test_1050_circular_dependencies_4_levels.py
+++ b/test/tool_shed/functional/test_1050_circular_dependencies_4_levels.py
@@ -343,9 +343,9 @@
assert original_datatypes < self.get_datatypes_count(), 'Installing a repository that depends on emboss_datatypes did not add datatypes.'
emboss_repository = test_db_util.get_installed_repository_by_name_owner( emboss_repository_name, common.test_user_1_name )
datatypes_repository = test_db_util.get_installed_repository_by_name_owner( emboss_datatypes_repository_name, common.test_user_1_name )
- strings_displayed = [ emboss_repository.name,
+ strings_displayed = [ 'emboss_0050',
+ 'emboss_datatypes_0050',
emboss_repository.installed_changeset_revision,
- datatypes_repository.name,
datatypes_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
# Installing freebayes should automatically reinstall emboss and reactivate emboss_datatypes.
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_1060_install_repository_with_workflow.py
--- a/test/tool_shed/functional/test_1060_install_repository_with_workflow.py
+++ b/test/tool_shed/functional/test_1060_install_repository_with_workflow.py
@@ -84,6 +84,6 @@
workflow_name,
strings_displayed=[ '#EBD9B2' ],
strings_not_displayed=[ '#EBBCB2' ] )
- self.display_all_workflows( strings_not_displayed=[ workflow_name ] )
+ self.display_all_workflows( strings_not_displayed=[ 'Workflow for 0060_filter_workflow_repository' ] )
self.import_workflow( installed_repository, workflow_name )
- self.display_all_workflows( strings_displayed=[ workflow_name ] )
+ self.display_all_workflows( strings_displayed=[ 'Workflow for 0060_filter_workflow_repository' ] )
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_1070_invalid_tool.py
--- a/test/tool_shed/functional/test_1070_invalid_tool.py
+++ b/test/tool_shed/functional/test_1070_invalid_tool.py
@@ -73,10 +73,10 @@
install_tool_dependencies=False,
new_tool_panel_section='test_1070' )
installed_repository = test_db_util.get_installed_repository_by_name_owner( repository_name, common.test_user_1_name )
- strings_displayed = [ installed_repository.name,
- installed_repository.description,
- installed_repository.owner,
- installed_repository.tool_shed,
+ strings_displayed = [ 'bismark_0070',
+ "Galaxy's bismark wrapper",
+ 'user1',
+ self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
self.display_installed_repository_manage_page( installed_repository,
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_1080_advanced_circular_dependency_installation.py
--- a/test/tool_shed/functional/test_1080_advanced_circular_dependency_installation.py
+++ b/test/tool_shed/functional/test_1080_advanced_circular_dependency_installation.py
@@ -131,15 +131,15 @@
common.test_user_1_name )
installed_column_repository = test_db_util.get_installed_repository_by_name_owner( column_repository_name,
common.test_user_1_name )
- browse_strings_displayed = [ installed_convert_repository.name,
- installed_convert_repository.description,
- installed_convert_repository.tool_shed,
+ browse_strings_displayed = [ 'convert_chars_0080',
+ 'Convert delimiters',
+ self.url.replace( 'http://', '' ),
installed_convert_repository.installed_changeset_revision ]
- strings_displayed = [ installed_convert_repository.name,
- installed_convert_repository.description,
- installed_convert_repository.tool_shed,
+ strings_displayed = [ 'convert_chars_0080',
+ 'Convert delimiters',
+ self.url.replace( 'http://', '' ),
installed_convert_repository.installed_changeset_revision,
- installed_column_repository.name,
+ 'column_maker_0080',
installed_column_repository.installed_changeset_revision,
'Missing repository dependencies' ]
self.display_galaxy_browse_repositories_page( strings_displayed=browse_strings_displayed )
@@ -157,18 +157,18 @@
common.test_user_1_name )
installed_column_repository = test_db_util.get_installed_repository_by_name_owner( column_repository_name,
common.test_user_1_name )
- browse_strings_displayed = [ installed_convert_repository.name,
- installed_convert_repository.description,
- installed_convert_repository.tool_shed,
+ browse_strings_displayed = [ 'convert_chars_0080',
+ 'Convert delimiters',
+ self.url.replace( 'http://', '' ),
installed_convert_repository.installed_changeset_revision,
- installed_column_repository.name,
- installed_column_repository.description,
+ 'column_maker_0080',
+ 'Add column',
installed_column_repository.installed_changeset_revision ]
- strings_displayed = [ installed_column_repository.name,
- installed_column_repository.description,
- installed_column_repository.tool_shed,
+ strings_displayed = [ 'column_maker_0080',
+ 'Add column',
+ self.url.replace( 'http://', '' ),
installed_column_repository.installed_changeset_revision,
- installed_convert_repository.name,
+ 'convert_chars_0080',
installed_convert_repository.installed_changeset_revision,
'Installed repository dependencies' ]
self.display_galaxy_browse_repositories_page( strings_displayed=browse_strings_displayed )
@@ -181,11 +181,11 @@
installed_column_repository = test_db_util.get_installed_repository_by_name_owner( column_repository_name,
common.test_user_1_name )
self.uninstall_repository( installed_convert_repository, remove_from_disk=False )
- strings_displayed = [ installed_column_repository.name,
- installed_column_repository.description,
- installed_column_repository.tool_shed,
+ strings_displayed = [ 'column_maker_0080',
+ 'Add column',
+ self.url.replace( 'http://', '' ),
installed_column_repository.installed_changeset_revision,
- installed_convert_repository.name,
+ 'convert_chars_0080',
installed_convert_repository.installed_changeset_revision,
'Missing repository dependencies',
'Deactivated' ]
@@ -198,11 +198,11 @@
installed_column_repository = test_db_util.get_installed_repository_by_name_owner( column_repository_name,
common.test_user_1_name )
self.reactivate_repository( installed_convert_repository )
- strings_displayed = [ installed_convert_repository.name,
- installed_convert_repository.description,
- installed_convert_repository.tool_shed,
+ strings_displayed = [ 'convert_chars_0080',
+ 'Convert delimiters',
+ self.url.replace( 'http://', '' ),
installed_convert_repository.installed_changeset_revision,
- installed_column_repository.name,
+ 'column_maker_0080',
installed_column_repository.installed_changeset_revision,
'Installed repository dependencies' ]
def test_0040_deactivate_column_repository( self ):
@@ -212,11 +212,11 @@
installed_column_repository = test_db_util.get_installed_repository_by_name_owner( column_repository_name,
common.test_user_1_name )
self.uninstall_repository( installed_column_repository, remove_from_disk=False )
- strings_displayed = [ installed_convert_repository.name,
- installed_convert_repository.description,
- installed_convert_repository.tool_shed,
+ strings_displayed = [ 'convert_chars_0080',
+ 'Convert delimiters',
+ self.url.replace( 'http://', '' ),
installed_convert_repository.installed_changeset_revision,
- installed_column_repository.name,
+ 'column_maker_0080',
installed_column_repository.installed_changeset_revision,
'Missing repository dependencies',
'Deactivated' ]
@@ -229,9 +229,9 @@
installed_column_repository = test_db_util.get_installed_repository_by_name_owner( column_repository_name,
common.test_user_1_name )
self.uninstall_repository( installed_convert_repository, remove_from_disk=False )
- strings_not_displayed = [ installed_column_repository.name,
+ strings_not_displayed = [ 'column_maker_0080',
installed_column_repository.installed_changeset_revision,
- installed_convert_repository.name,
+ 'convert_chars_0080',
installed_convert_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_not_displayed=strings_not_displayed )
def test_0050_reactivate_column_repository( self ):
@@ -241,11 +241,11 @@
installed_column_repository = test_db_util.get_installed_repository_by_name_owner( column_repository_name,
common.test_user_1_name )
self.reactivate_repository( installed_column_repository )
- strings_displayed = [ installed_column_repository.name,
- installed_column_repository.description,
- installed_column_repository.tool_shed,
+ strings_displayed = [ 'column_maker_0080',
+ 'Add column',
+ self.url.replace( 'http://', '' ),
installed_column_repository.installed_changeset_revision,
- installed_convert_repository.name,
+ 'convert_chars_0080',
installed_convert_repository.installed_changeset_revision,
'Missing repository dependencies',
'Deactivated' ]
@@ -258,20 +258,20 @@
installed_column_repository = test_db_util.get_installed_repository_by_name_owner( column_repository_name,
common.test_user_1_name )
self.reactivate_repository( installed_convert_repository )
- strings_displayed = [ installed_column_repository.name,
- installed_column_repository.description,
- installed_column_repository.tool_shed,
+ strings_displayed = [ 'column_maker_0080',
+ 'Add column',
+ self.url.replace( 'http://', '' ),
installed_column_repository.installed_changeset_revision,
- installed_convert_repository.name,
+ 'convert_chars_0080',
installed_convert_repository.installed_changeset_revision,
'Installed repository dependencies' ]
self.display_installed_repository_manage_page( installed_column_repository,
strings_displayed=strings_displayed )
- strings_displayed = [ installed_convert_repository.name,
- installed_convert_repository.description,
- installed_convert_repository.tool_shed,
+ strings_displayed = [ 'convert_chars_0080',
+ 'Convert delimiters',
+ self.url.replace( 'http://', '' ),
installed_convert_repository.installed_changeset_revision,
- installed_column_repository.name,
+ 'column_maker_0080',
installed_column_repository.installed_changeset_revision,
'Installed repository dependencies' ]
self.display_installed_repository_manage_page( installed_convert_repository,
@@ -283,11 +283,11 @@
installed_column_repository = test_db_util.get_installed_repository_by_name_owner( column_repository_name,
common.test_user_1_name )
self.uninstall_repository( installed_column_repository, remove_from_disk=True )
- strings_displayed = [ installed_convert_repository.name,
- installed_convert_repository.description,
- installed_convert_repository.tool_shed,
+ strings_displayed = [ 'convert_chars_0080',
+ 'Convert delimiters',
+ self.url.replace( 'http://', '' ),
installed_convert_repository.installed_changeset_revision,
- installed_column_repository.name,
+ 'column_maker_0080',
installed_column_repository.installed_changeset_revision,
'Missing repository dependencies',
'Uninstalled' ]
@@ -301,20 +301,20 @@
installed_column_repository = test_db_util.get_installed_repository_by_name_owner( column_repository_name,
common.test_user_1_name )
self.reinstall_repository( installed_column_repository, install_repository_dependencies=False )
- strings_displayed = [ installed_column_repository.name,
- installed_column_repository.description,
- installed_column_repository.tool_shed,
+ strings_displayed = [ 'column_maker_0080',
+ 'Add column',
+ self.url.replace( 'http://', '' ),
installed_column_repository.installed_changeset_revision,
- installed_convert_repository.name,
+ 'convert_chars_0080',
installed_convert_repository.installed_changeset_revision,
'Installed repository dependencies' ]
self.display_installed_repository_manage_page( installed_column_repository,
strings_displayed=strings_displayed )
- strings_displayed = [ installed_convert_repository.name,
- installed_convert_repository.description,
- installed_convert_repository.tool_shed,
+ strings_displayed = [ 'convert_chars_0080',
+ 'Convert delimiters',
+ self.url.replace( 'http://', '' ),
installed_convert_repository.installed_changeset_revision,
- installed_column_repository.name,
+ 'column_maker_0080',
installed_column_repository.installed_changeset_revision,
'Installed repository dependencies' ]
self.display_installed_repository_manage_page( installed_convert_repository,
@@ -326,11 +326,11 @@
installed_column_repository = test_db_util.get_installed_repository_by_name_owner( column_repository_name,
common.test_user_1_name )
self.uninstall_repository( installed_convert_repository, remove_from_disk=True )
- strings_displayed = [ installed_column_repository.name,
- installed_column_repository.description,
- installed_column_repository.tool_shed,
+ strings_displayed = [ 'column_maker_0080',
+ 'Add column',
+ self.url.replace( 'http://', '' ),
installed_column_repository.installed_changeset_revision,
- installed_convert_repository.name,
+ 'convert_chars_0080',
installed_convert_repository.installed_changeset_revision,
'Missing repository dependencies',
'Uninstalled' ]
@@ -344,11 +344,11 @@
installed_column_repository = test_db_util.get_installed_repository_by_name_owner( column_repository_name,
common.test_user_1_name )
self.uninstall_repository( installed_column_repository, remove_from_disk=True )
- strings_displayed = [ installed_convert_repository.name,
- installed_convert_repository.description,
- installed_convert_repository.tool_shed,
+ strings_displayed = [ 'convert_chars_0080',
+ 'Convert delimiters',
+ self.url.replace( 'http://', '' ),
installed_convert_repository.installed_changeset_revision,
- installed_column_repository.name,
+ 'column_maker_0080',
installed_column_repository.installed_changeset_revision,
'Missing repository dependencies',
'Activate or reinstall repository',
@@ -365,20 +365,20 @@
install_repository_dependencies=True,
no_changes=False,
new_tool_panel_section='convert_maker' )
- strings_displayed = [ installed_column_repository.name,
- installed_column_repository.description,
- installed_column_repository.tool_shed,
+ strings_displayed = [ 'column_maker_0080',
+ 'Add column',
+ self.url.replace( 'http://', '' ),
installed_column_repository.installed_changeset_revision,
- installed_convert_repository.name,
+ 'convert_chars_0080',
installed_convert_repository.installed_changeset_revision,
'Installed repository dependencies' ]
self.display_installed_repository_manage_page( installed_column_repository,
strings_displayed=strings_displayed )
- strings_displayed = [ installed_convert_repository.name,
- installed_convert_repository.description,
- installed_convert_repository.tool_shed,
+ strings_displayed = [ 'convert_chars_0080',
+ 'Convert delimiters',
+ self.url.replace( 'http://', '' ),
installed_convert_repository.installed_changeset_revision,
- installed_column_repository.name,
+ 'column_maker_0080',
installed_column_repository.installed_changeset_revision,
'Installed repository dependencies' ]
self.display_installed_repository_manage_page( installed_convert_repository,
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_1085_repository_dependency_handling.py
--- a/test/tool_shed/functional/test_1085_repository_dependency_handling.py
+++ b/test/tool_shed/functional/test_1085_repository_dependency_handling.py
@@ -122,18 +122,18 @@
common.test_user_1_name )
installed_column_repository = test_db_util.get_installed_repository_by_name_owner( column_repository_name,
common.test_user_1_name )
- browse_strings_displayed = [ installed_convert_repository.name,
- installed_convert_repository.description,
- installed_convert_repository.tool_shed,
+ browse_strings_displayed = [ 'convert_chars_1085',
+ 'Convert delimiters',
+ self.url.replace( 'http://', '' ),
installed_convert_repository.installed_changeset_revision,
- installed_column_repository.name,
- installed_column_repository.description,
+ 'column_maker_1085',
+ 'Add column',
installed_column_repository.installed_changeset_revision ]
- strings_displayed = [ installed_convert_repository.name,
- installed_convert_repository.description,
- installed_convert_repository.tool_shed,
+ strings_displayed = [ 'convert_chars_1085',
+ 'Convert delimiters',
+ self.url.replace( 'http://', '' ),
installed_convert_repository.installed_changeset_revision,
- installed_column_repository.name,
+ 'column_maker_1085',
installed_column_repository.installed_changeset_revision,
'Installed repository dependencies' ]
self.display_galaxy_browse_repositories_page( strings_displayed=browse_strings_displayed )
@@ -161,9 +161,9 @@
install_repository_dependencies=False,
new_tool_panel_section='new_column_maker',
no_changes=False )
- strings_displayed = [ installed_column_repository.name,
- installed_column_repository.description,
- installed_column_repository.tool_shed,
+ strings_displayed = [ 'column_maker_1085',
+ 'Add column',
+ self.url.replace( 'http://', '' ),
installed_column_repository.installed_changeset_revision ]
self.display_installed_repository_manage_page( installed_column_repository,
strings_displayed=strings_displayed )
@@ -176,9 +176,9 @@
install_repository_dependencies=False,
new_tool_panel_section='new_convert_chars',
no_changes=False )
- strings_displayed = [ installed_convert_repository.name,
- installed_convert_repository.description,
- installed_convert_repository.tool_shed,
+ strings_displayed = [ 'convert_chars_1085',
+ 'Convert delimiters',
+ self.url.replace( 'http://', '' ),
installed_convert_repository.installed_changeset_revision ]
self.display_installed_repository_manage_page( installed_convert_repository,
strings_displayed=strings_displayed )
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_1087_install_updated_repository_dependencies.py
--- a/test/tool_shed/functional/test_1087_install_updated_repository_dependencies.py
+++ b/test/tool_shed/functional/test_1087_install_updated_repository_dependencies.py
@@ -103,7 +103,7 @@
'''Reinstall column_maker and verify that it now shows repository dependencies.'''
installed_column_repository = test_db_util.get_installed_repository_by_name_owner( column_repository_name, common.test_user_1_name )
convert_repository = test_db_util.get_repository_by_name_and_owner( convert_repository_name, common.test_user_1_name )
- strings_displayed=[ 'Handle repository dependencies', convert_repository.name, self.get_repository_tip( convert_repository ) ]
+ strings_displayed=[ 'Handle repository dependencies', 'convert_chars_1087', self.get_repository_tip( convert_repository ) ]
# Due to twill's limitations, only check for strings on the (redirected) reselect tool panel section page, don't actually reinstall.
url = '/admin_toolshed/browse_repositories?operation=activate+or+reinstall&id=%s' % self.security.encode_id( installed_column_repository.id )
self.visit_galaxy_url( url )
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_1090_install_tool_from_tool_search.py
--- a/test/tool_shed/functional/test_1090_install_tool_from_tool_search.py
+++ b/test/tool_shed/functional/test_1090_install_tool_from_tool_search.py
@@ -270,9 +270,9 @@
bwa_color_revision = self.get_repository_tip( bwa_color_repository )
self.search_for_valid_tools( search_fields={ 'tool_id': 'bwa' },
exact_matches=False, from_galaxy=True,
- strings_displayed=[ bwa_color_repository_name, bwa_base_repository_name, bwa_base_revision, bwa_color_revision ] )
- strings_displayed=[ freebayes_repository_name, emboss_repository_name, filtering_repository_name ]
- strings_displayed.extend( [ bwa_color_repository_name, bwa_base_repository_name, emboss_datatypes_repository_name ] )
+ strings_displayed=[ 'bwa_color_0090', 'bwa_base_0090', bwa_base_revision, bwa_color_revision ] )
+ strings_displayed=[ 'freebayes_0090', 'emboss_0090', 'filtering_0090' ]
+ strings_displayed.extend( [ 'bwa_color_0090', 'bwa_base_0090', 'emboss_datatypes_0090' ] )
strings_displayed.extend( [ 'bwa', 'Handle', 'tool dependencies' ] )
repositories_to_install = [ bwa_color_repository, bwa_base_repository ]
# BWA is a good candidate for testing the installation of tool dependencies, but it is a core requirement of functional
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_1100_install_repository_with_complex_dependencies.py
--- a/test/tool_shed/functional/test_1100_install_repository_with_complex_dependencies.py
+++ b/test/tool_shed/functional/test_1100_install_repository_with_complex_dependencies.py
@@ -243,11 +243,11 @@
strings_displayed.append( self.url.replace( 'http://', '' ) )
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed, strings_not_displayed=[] )
checks = [ ( tool_repository,
- [ tool_repository.name, tool_repository.owner, tool_repository.installed_changeset_revision ],
+ [ 'bwa_tool_repository_0100', 'user1', tool_repository.installed_changeset_revision ],
[ 'Missing tool dependencies' ] ),
( base_repository,
- [ base_repository.name, base_repository.owner, base_repository.installed_changeset_revision, tool_repository.name,
- tool_repository.owner, tool_repository.installed_changeset_revision ],
+ [ 'bwa_base_repository_0100', 'user1', base_repository.installed_changeset_revision, 'bwa_tool_repository_0100',
+ tool_repository.installed_changeset_revision ],
[ 'Missing tool dependencies' ] ) ]
for repository, strings_displayed, strings_not_displayed in checks:
self.display_installed_repository_manage_page( repository, strings_displayed=strings_displayed, strings_not_displayed=strings_not_displayed )
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_1110_install_repository_with_invalid_repository_dependency.py
--- a/test/tool_shed/functional/test_1110_install_repository_with_invalid_repository_dependency.py
+++ b/test/tool_shed/functional/test_1110_install_repository_with_invalid_repository_dependency.py
@@ -174,7 +174,7 @@
self.galaxy_logout()
self.galaxy_login( email=common.admin_email, username=common.admin_username )
repository = test_db_util.get_repository_by_name_and_owner( emboss_repository_name, common.test_user_1_name )
- preview_strings_displayed = [ repository.name, self.get_repository_tip( repository ), 'will be ignored' ]
+ preview_strings_displayed = [ 'emboss_0110', self.get_repository_tip( repository ), 'will be ignored' ]
self.install_repository( emboss_repository_name,
common.test_user_1_name,
category_name,
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_1200_uninstall_and_reinstall_basic_repository.py
--- a/test/tool_shed/functional/test_1200_uninstall_and_reinstall_basic_repository.py
+++ b/test/tool_shed/functional/test_1200_uninstall_and_reinstall_basic_repository.py
@@ -77,28 +77,28 @@
'Test 0000 Basic Repository Features 1',
new_tool_panel_section='test_1000' )
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'filtering_0000', common.test_user_1_name )
- strings_displayed = [ installed_repository.name,
- installed_repository.description,
- installed_repository.owner,
- installed_repository.tool_shed,
+ strings_displayed = [ 'filtering_0000',
+ "Galaxy's filtering tool for test 0000",
+ 'user1',
+ self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
def test_0015_uninstall_filtering_repository( self ):
'''Uninstall the filtering repository.'''
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'filtering_0000', common.test_user_1_name )
self.uninstall_repository( installed_repository, remove_from_disk=True )
- strings_not_displayed = [ installed_repository.name,
- installed_repository.description,
+ strings_not_displayed = [ 'filtering_0000',
+ "Galaxy's filtering tool for test 0000",
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_not_displayed=strings_not_displayed )
def test_0020_reinstall_filtering_repository( self ):
'''Reinstall the filtering repository.'''
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'filtering_0000', common.test_user_1_name )
self.reinstall_repository( installed_repository )
- strings_displayed = [ installed_repository.name,
- installed_repository.description,
- installed_repository.owner,
- installed_repository.tool_shed,
+ strings_displayed = [ 'filtering_0000',
+ "Galaxy's filtering tool for test 0000",
+ 'user1',
+ self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
self.display_installed_repository_manage_page( installed_repository,
@@ -108,18 +108,18 @@
'''Deactivate the filtering repository without removing it from disk.'''
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'filtering_0000', common.test_user_1_name )
self.uninstall_repository( installed_repository, remove_from_disk=False )
- strings_not_displayed = [ installed_repository.name,
- installed_repository.description,
+ strings_not_displayed = [ 'filtering_0000',
+ "Galaxy's filtering tool for test 0000",
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_not_displayed=strings_not_displayed )
def test_0030_reactivate_filtering_repository( self ):
'''Reactivate the filtering repository and verify that it now shows up in the list of installed repositories.'''
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'filtering_0000', common.test_user_1_name )
self.reactivate_repository( installed_repository )
- strings_displayed = [ installed_repository.name,
- installed_repository.description,
- installed_repository.owner,
- installed_repository.tool_shed,
+ strings_displayed = [ 'filtering_0000',
+ "Galaxy's filtering tool for test 0000",
+ 'user1',
+ self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
self.display_installed_repository_manage_page( installed_repository,
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_1210_uninstall_reinstall_repository_with_tool_dependencies.py
--- a/test/tool_shed/functional/test_1210_uninstall_reinstall_repository_with_tool_dependencies.py
+++ b/test/tool_shed/functional/test_1210_uninstall_reinstall_repository_with_tool_dependencies.py
@@ -96,10 +96,10 @@
strings_displayed=strings_displayed,
new_tool_panel_section='test_1210' )
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'freebayes_0010', common.test_user_1_name )
- strings_displayed = [ installed_repository.name,
- installed_repository.description,
- installed_repository.owner,
- installed_repository.tool_shed,
+ strings_displayed = [ 'freebayes_0010',
+ "Galaxy's freebayes tool",
+ 'user1',
+ self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
def test_0015_uninstall_freebayes_repository( self ):
@@ -112,10 +112,10 @@
'''Reinstall the freebayes repository.'''
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'freebayes_0010', common.test_user_1_name )
self.reinstall_repository( installed_repository )
- strings_displayed = [ installed_repository.name,
- installed_repository.description,
- installed_repository.owner,
- installed_repository.tool_shed,
+ strings_displayed = [ 'freebayes_0010',
+ "Galaxy's freebayes tool",
+ 'user1',
+ self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
self.display_installed_repository_manage_page( installed_repository,
@@ -131,10 +131,10 @@
'''Reactivate the freebayes repository and verify that it now shows up in the list of installed repositories.'''
installed_repository = test_db_util.get_installed_repository_by_name_owner( 'freebayes_0010', common.test_user_1_name )
self.reactivate_repository( installed_repository )
- strings_displayed = [ installed_repository.name,
- installed_repository.description,
- installed_repository.owner,
- installed_repository.tool_shed,
+ strings_displayed = [ 'freebayes_0010',
+ "Galaxy's freebayes tool",
+ 'user1',
+ self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
self.display_installed_repository_manage_page( installed_repository,
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_1220_uninstall_reinstall_repository_with_repository_dependencies.py
--- a/test/tool_shed/functional/test_1220_uninstall_reinstall_repository_with_repository_dependencies.py
+++ b/test/tool_shed/functional/test_1220_uninstall_reinstall_repository_with_repository_dependencies.py
@@ -98,10 +98,10 @@
strings_displayed=strings_displayed,
new_tool_panel_section='test_1210' )
installed_repository = test_db_util.get_installed_repository_by_name_owner( emboss_repository_name, common.test_user_1_name )
- strings_displayed = [ installed_repository.name,
- installed_repository.description,
- installed_repository.owner,
- installed_repository.tool_shed,
+ strings_displayed = [ 'emboss_0020',
+ 'Galaxy wrappers for Emboss version 5.0.0 tools',
+ 'user1',
+ self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
current_datatypes = int( self.get_datatypes_count() )
@@ -122,10 +122,10 @@
'''Reinstall the emboss repository.'''
installed_repository = test_db_util.get_installed_repository_by_name_owner( emboss_repository_name, common.test_user_1_name )
self.reinstall_repository( installed_repository )
- strings_displayed = [ installed_repository.name,
- installed_repository.description,
- installed_repository.owner,
- installed_repository.tool_shed,
+ strings_displayed = [ 'emboss_0020',
+ 'Galaxy wrappers for Emboss version 5.0.0 tools',
+ 'user1',
+ self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
self.display_installed_repository_manage_page( installed_repository,
@@ -135,17 +135,17 @@
'''Deactivate the emboss repository without removing it from disk.'''
installed_repository = test_db_util.get_installed_repository_by_name_owner( emboss_repository_name, common.test_user_1_name )
self.uninstall_repository( installed_repository, remove_from_disk=False )
- strings_not_displayed = [ installed_repository.name,
+ strings_not_displayed = [ 'emboss_0020',
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_not_displayed=strings_not_displayed )
def test_0030_reactivate_emboss_repository( self ):
'''Reactivate the emboss repository and verify that it now shows up in the list of installed repositories.'''
installed_repository = test_db_util.get_installed_repository_by_name_owner( emboss_repository_name, common.test_user_1_name )
self.reactivate_repository( installed_repository )
- strings_displayed = [ installed_repository.name,
- installed_repository.description,
- installed_repository.owner,
- installed_repository.tool_shed,
+ strings_displayed = [ 'emboss_0020',
+ 'Galaxy wrappers for Emboss version 5.0.0 tools',
+ 'user1',
+ self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
self.display_installed_repository_manage_page( installed_repository,
diff -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 -r d04aa3ad613211d3c88f1daa7e5a9df4d1233597 test/tool_shed/functional/test_1230_uninstall_reinstall_repository_with_dependency_revisions.py
--- a/test/tool_shed/functional/test_1230_uninstall_reinstall_repository_with_dependency_revisions.py
+++ b/test/tool_shed/functional/test_1230_uninstall_reinstall_repository_with_dependency_revisions.py
@@ -158,10 +158,10 @@
strings_displayed=strings_displayed,
new_tool_panel_section='test_1210' )
installed_repository = test_db_util.get_installed_repository_by_name_owner( emboss_repository_name, common.test_user_1_name )
- strings_displayed = [ installed_repository.name,
- installed_repository.description,
- installed_repository.owner,
- installed_repository.tool_shed,
+ strings_displayed = [ 'emboss_0030',
+ 'Galaxy wrappers for Emboss version 5.0.0 tools',
+ 'user1',
+ self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
current_datatypes = int( self.get_datatypes_count() )
@@ -182,10 +182,10 @@
'''Reinstall the emboss repository.'''
installed_repository = test_db_util.get_installed_repository_by_name_owner( emboss_repository_name, common.test_user_1_name )
self.reinstall_repository( installed_repository )
- strings_displayed = [ installed_repository.name,
- installed_repository.description,
- installed_repository.owner,
- installed_repository.tool_shed,
+ strings_displayed = [ 'emboss_0030',
+ 'Galaxy wrappers for Emboss version 5.0.0 tools',
+ 'user1',
+ self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
self.display_installed_repository_manage_page( installed_repository,
@@ -201,10 +201,10 @@
'''Reactivate the emboss repository and verify that it now shows up in the list of installed repositories.'''
installed_repository = test_db_util.get_installed_repository_by_name_owner( emboss_repository_name, common.test_user_1_name )
self.reactivate_repository( installed_repository )
- strings_displayed = [ installed_repository.name,
- installed_repository.description,
- installed_repository.owner,
- installed_repository.tool_shed,
+ strings_displayed = [ 'emboss_0030',
+ 'Galaxy wrappers for Emboss version 5.0.0 tools',
+ 'user1',
+ self.url.replace( 'http://', '' ),
installed_repository.installed_changeset_revision ]
self.display_galaxy_browse_repositories_page( strings_displayed=strings_displayed )
self.display_installed_repository_manage_page( installed_repository,
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: natefoo: Fix exception handling in migration script 111.
by Bitbucket 15 Feb '13
by Bitbucket 15 Feb '13
15 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/359f6fbcde82/
changeset: 359f6fbcde82
user: natefoo
date: 2013-02-15 17:21:11
summary: Fix exception handling in migration script 111.
affected #: 1 file
diff -r 865c74ff03755f21eaaf4a557b1c2aeb1518e593 -r 359f6fbcde82bbf8aa1d4b932a54882f86121d71 lib/galaxy/model/migrate/versions/0111_add_job_destinations.py
--- a/lib/galaxy/model/migrate/versions/0111_add_job_destinations.py
+++ b/lib/galaxy/model/migrate/versions/0111_add_job_destinations.py
@@ -26,14 +26,14 @@
try:
c.create( Job_table )
assert c is Job_table.c.destination_id
- except:
+ except Exception, e:
log.error( "Adding column 'destination_id' to job table failed: %s" % str( e ) )
c = Column( "destination_params", JSONType, nullable=True )
try:
c.create( Job_table )
assert c is Job_table.c.destination_params
- except:
+ except Exception, e:
log.error( "Adding column 'destination_params' to job table failed: %s" % str( e ) )
def downgrade():
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
commit/galaxy-central: natefoo: Handle the Torque 'E' job state in the CLI runner.
by Bitbucket 15 Feb '13
by Bitbucket 15 Feb '13
15 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/8cd0793b0fc6/
changeset: 8cd0793b0fc6
branch: stable
user: natefoo
date: 2013-02-15 16:53:20
summary: Handle the Torque 'E' job state in the CLI runner.
affected #: 1 file
diff -r 1f1072317efd5cf82cb791d75ba968c4bacffaf4 -r 8cd0793b0fc65b57f8fd93cfffc19ba105d190cf lib/galaxy/jobs/runners/cli_job/torque.py
--- a/lib/galaxy/jobs/runners/cli_job/torque.py
+++ b/lib/galaxy/jobs/runners/cli_job/torque.py
@@ -128,5 +128,6 @@
return job_states.OK
def __get_job_state(self, state):
- return { 'R' : job_states.RUNNING,
+ return { 'E' : job_states.RUNNING,
+ 'R' : job_states.RUNNING,
'Q' : job_states.QUEUED }.get(state, state)
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
4 new commits in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/c3d93fe36b28/
changeset: c3d93fe36b28
user: jgoecks
date: 2013-02-15 00:14:18
summary: Add new config files to hgignore.
affected #: 1 file
diff -r c58f82badc26168885507312b71ac2351046bee8 -r c3d93fe36b28898f741c06e316d7184a993dfb9a .hgignore
--- a/.hgignore
+++ b/.hgignore
@@ -46,6 +46,8 @@
openid_conf.xml
shed_tool_data_table_conf.xml
job_conf.xml
+data_manager_conf.xml
+shed_data_manager_conf.xml
static/welcome.html.*
static/welcome.html
https://bitbucket.org/galaxy/galaxy-central/commits/4150920c8075/
changeset: 4150920c8075
user: jgoecks
date: 2013-02-15 00:15:34
summary: Standardize on BED format for genome data providers and fix off-by-one issues.
affected #: 2 files
diff -r c3d93fe36b28898f741c06e316d7184a993dfb9a -r 4150920c807513bc321619c0d59784a30020b07a lib/galaxy/visualization/data_providers/genome.py
--- a/lib/galaxy/visualization/data_providers/genome.py
+++ b/lib/galaxy/visualization/data_providers/genome.py
@@ -111,7 +111,10 @@
return result
class GenomeDataProvider( BaseDataProvider ):
- """ Base class for genome data providers. """
+ """
+ Base class for genome data providers. All genome providers should
+ produce data with BED interval format: 0-based, half-open coordinates.
+ """
dataset_type = None
@@ -819,8 +822,8 @@
class BamDataProvider( GenomeDataProvider, FilterableMixin ):
"""
- Provides access to intervals from a sorted indexed BAM file. Position data
- is reported in 1-based, closed format, i.e. SAM/BAM format.
+ Provides access to intervals from a sorted indexed BAM file. Coordinate
+ data is reported in BED format: 0-based, half-open.
"""
dataset_type = 'bai'
diff -r c3d93fe36b28898f741c06e316d7184a993dfb9a -r 4150920c807513bc321619c0d59784a30020b07a static/scripts/viz/trackster/painters.js
--- a/static/scripts/viz/trackster/painters.js
+++ b/static/scripts/viz/trackster/painters.js
@@ -493,8 +493,7 @@
var
feature_uid = feature[0],
feature_start = feature[1],
- // -1 because end is not included in feature; see FeaturePainter documentation for details.
- feature_end = feature[2] - 1,
+ feature_end = feature[2],
feature_name = feature[3],
feature_strand = feature[4],
f_start = Math.floor( Math.max(0, (feature_start - tile_low) * w_scale) ),
@@ -613,8 +612,7 @@
for (var k = 0, k_len = feature_blocks.length; k < k_len; k++) {
var block = feature_blocks[k],
block_start = Math.floor( Math.max(0, (block[0] - tile_low) * w_scale) ),
- // -1 because end is not included in feature; see FeaturePainter documentation for details.
- block_end = Math.ceil( Math.min(width, Math.max((block[1] - 1 - tile_low) * w_scale)) ),
+ block_end = Math.ceil( Math.min(width, Math.max((block[1] - tile_low) * w_scale)) ),
last_block_start, last_block_end;
// Skip drawing if block not on tile.
@@ -759,8 +757,7 @@
// Go left if it clips
base_offset -= cig_len;
}
- // -1 for feature start because data is using 1-based offset but display is 0-based.
- var seq_start = (feature_start - 1) + base_offset,
+ var seq_start = feature_start + base_offset,
s_start = Math.floor( Math.max(0, (seq_start - tile_low) * w_scale) ),
s_end = Math.floor( Math.max(0, (seq_start + cig_len - tile_low) * w_scale) );
https://bitbucket.org/galaxy/galaxy-central/commits/04aaf661f80a/
changeset: 04aaf661f80a
user: jgoecks
date: 2013-02-15 00:31:21
summary: More Trackster fixes to standardize on 0-based coordinate system.
affected #: 1 file
diff -r 4150920c807513bc321619c0d59784a30020b07a -r 04aaf661f80a92cfd8c804baccac348e3cc98355 static/scripts/viz/trackster/painters.js
--- a/static/scripts/viz/trackster/painters.js
+++ b/static/scripts/viz/trackster/painters.js
@@ -779,8 +779,7 @@
case "=": // Equals.
if (is_overlap([seq_start, seq_start + cig_len], tile_region)) {
// Draw.
- // -1 b/c sequence data is 1-based but painter is 0-based.
- var seq = ref_seq.slice(seq_offset - 1, seq_offset + cig_len);
+ var seq = ref_seq.slice(seq_offset, seq_offset + cig_len);
if (gap > 0) {
ctx.fillStyle = block_color;
ctx.fillRect(s_start - gap, y_center + 1, s_end - s_start, 9);
@@ -836,8 +835,7 @@
var insert_x_coord = s_start - gap;
if (is_overlap([seq_start, seq_start + cig_len], tile_region)) {
- // -1 b/c sequence data is 1-based but painter is 0-based.
- var seq = ref_seq.slice(seq_offset - 1, seq_offset + cig_len);
+ var seq = ref_seq.slice(seq_offset, seq_offset + cig_len);
// Insertion point is between the sequence start and the previous base: (-gap) moves
// back from sequence start to insertion point.
if (this.prefs.show_insertions) {
https://bitbucket.org/galaxy/galaxy-central/commits/865c74ff0375/
changeset: 865c74ff0375
user: jgoecks
date: 2013-02-15 00:56:27
summary: Use 0-based coordinates for BBI data and display.
affected #: 3 files
diff -r 04aaf661f80a92cfd8c804baccac348e3cc98355 -r 865c74ff03755f21eaaf4a557b1c2aeb1518e593 lib/galaxy/visualization/data_providers/genome.py
--- a/lib/galaxy/visualization/data_providers/genome.py
+++ b/lib/galaxy/visualization/data_providers/genome.py
@@ -112,8 +112,8 @@
class GenomeDataProvider( BaseDataProvider ):
"""
- Base class for genome data providers. All genome providers should
- produce data with BED interval format: 0-based, half-open coordinates.
+ Base class for genome data providers. All genome providers use BED coordinate
+ format (0-based, half-open coordinates) for both queries and returned data.
"""
dataset_type = None
@@ -1044,7 +1044,9 @@
return all_dat is not None
def get_data( self, chrom, start, end, start_val=0, max_vals=None, num_samples=1000, **kwargs ):
- start = int( start )
+ # Subtract 1 because start/end are in 0-based coordinate system but BBI
+ # provider uses 1-based coordinate system.
+ start = int( start ) - 1
end = int( end )
# Helper function for getting summary data regardless of chromosome
diff -r 04aaf661f80a92cfd8c804baccac348e3cc98355 -r 865c74ff03755f21eaaf4a557b1c2aeb1518e593 static/scripts/packed/viz/trackster/painters.js
--- a/static/scripts/packed/viz/trackster/painters.js
+++ b/static/scripts/packed/viz/trackster/painters.js
@@ -1,1 +1,1 @@
-define(["libs/underscore"],function(_){var extend=_.extend;var BEFORE=1001,CONTAINS=1002,OVERLAP_START=1003,OVERLAP_END=1004,CONTAINED_BY=1005,AFTER=1006;var compute_overlap=function(first_region,second_region){var first_start=first_region[0],first_end=first_region[1],second_start=second_region[0],second_end=second_region[1],overlap;if(first_start<second_start){if(first_end<second_start){overlap=BEFORE}else{if(first_end<=second_end){overlap=OVERLAP_START}else{overlap=CONTAINS}}}else{if(first_start>second_end){overlap=AFTER}else{if(first_end<=second_end){overlap=CONTAINED_BY}else{overlap=OVERLAP_END}}}return overlap};var is_overlap=function(first_region,second_region){var overlap=compute_overlap(first_region,second_region);return(overlap!==BEFORE&&overlap!==AFTER)};var dashedLine=function(ctx,x1,y1,x2,y2,dashLen){if(dashLen===undefined){dashLen=4}var dX=x2-x1;var dY=y2-y1;var dashes=Math.floor(Math.sqrt(dX*dX+dY*dY)/dashLen);var dashX=dX/dashes;var dashY=dY/dashes;var q;for(q=0;q<dashes;q++,x1+=dashX,y1+=dashY){if(q%2!==0){continue}ctx.fillRect(x1,y1,dashLen,1)}};var drawDownwardEquilateralTriangle=function(ctx,down_vertex_x,down_vertex_y,side_len){var x1=down_vertex_x-side_len/2,x2=down_vertex_x+side_len/2,y=down_vertex_y-Math.sqrt(side_len*3/2);ctx.beginPath();ctx.moveTo(x1,y);ctx.lineTo(x2,y);ctx.lineTo(down_vertex_x,down_vertex_y);ctx.lineTo(x1,y);ctx.strokeStyle=this.fillStyle;ctx.fill();ctx.stroke();ctx.closePath()};var Scaler=function(default_val){this.default_val=(default_val?default_val:1)};Scaler.prototype.gen_val=function(input){return this.default_val};var Painter=function(data,view_start,view_end,prefs,mode){this.data=data;this.view_start=view_start;this.view_end=view_end;this.prefs=extend({},this.default_prefs,prefs);this.mode=mode};Painter.prototype.default_prefs={};Painter.prototype.draw=function(ctx,width,height,w_scale){};var SummaryTreePainter=function(data,view_start,view_end,prefs,mode){Painter.call(this,data,view_start,view_end,prefs,mode)};SummaryTreePainter.prototype.default_prefs={show_counts:false};SummaryTreePainter.prototype.draw=function(ctx,width,height,w_scale){var view_start=this.view_start,points=this.data.data,max=(this.prefs.histogram_max?this.prefs.histogram_max:this.data.max),base_y=height;delta_x_px=Math.ceil(this.data.delta*w_scale);ctx.save();for(var i=0,len=points.length;i<len;i++){var x=Math.floor((points[i][0]-view_start)*w_scale);var y=points[i][1];if(!y){continue}var y_px=y/max*height;if(y!==0&&y_px<1){y_px=1}ctx.fillStyle=this.prefs.block_color;ctx.fillRect(x,base_y-y_px,delta_x_px,y_px);var text_padding_req_x=4;if(this.prefs.show_counts&&(ctx.measureText(y).width+text_padding_req_x)<delta_x_px){ctx.fillStyle=this.prefs.label_color;ctx.textAlign="center";ctx.fillText(y,x+(delta_x_px/2),10)}}ctx.restore()};var LinePainter=function(data,view_start,view_end,prefs,mode){Painter.call(this,data,view_start,view_end,prefs,mode);var i,len;if(this.prefs.min_value===undefined){var min_value=Infinity;for(i=0,len=this.data.length;i<len;i++){min_value=Math.min(min_value,this.data[i][1])}this.prefs.min_value=min_value}if(this.prefs.max_value===undefined){var max_value=-Infinity;for(i=0,len=this.data.length;i<len;i++){max_value=Math.max(max_value,this.data[i][1])}this.prefs.max_value=max_value}};LinePainter.prototype.default_prefs={min_value:undefined,max_value:undefined,mode:"Histogram",color:"#000",overflow_color:"#F66"};LinePainter.prototype.draw=function(ctx,width,height,w_scale){var in_path=false,min_value=this.prefs.min_value,max_value=this.prefs.max_value,vertical_range=max_value-min_value,height_px=height,view_start=this.view_start,mode=this.mode,data=this.data;ctx.save();var y_zero=Math.round(height+min_value/vertical_range*height);if(mode!=="Intensity"){ctx.fillStyle="#aaa";ctx.fillRect(0,y_zero,width,1)}ctx.beginPath();var x_scaled,y,delta_x_px;if(data.length>1){delta_x_px=Math.ceil((data[1][0]-data[0][0])*w_scale)}else{delta_x_px=10}var pref_color=parseInt(this.prefs.color.slice(1),16),pref_r=(pref_color&16711680)>>16,pref_g=(pref_color&65280)>>8,pref_b=pref_color&255;for(var i=0,len=data.length;i<len;i++){ctx.fillStyle=ctx.strokeStyle=this.prefs.color;x_scaled=Math.round((data[i][0]-view_start-1)*w_scale);y=data[i][1];var top_overflow=false,bot_overflow=false;if(y===null){if(in_path&&mode==="Filled"){ctx.lineTo(x_scaled,height_px)}in_path=false;continue}if(y<min_value){bot_overflow=true;y=min_value}else{if(y>max_value){top_overflow=true;y=max_value}}if(mode==="Histogram"){y=Math.round(y/vertical_range*height_px);ctx.fillRect(x_scaled,y_zero,delta_x_px,-y)}else{if(mode==="Intensity"){var saturation=(y-min_value)/vertical_range,new_r=Math.round(pref_r+(255-pref_r)*(1-saturation)),new_g=Math.round(pref_g+(255-pref_g)*(1-saturation)),new_b=Math.round(pref_b+(255-pref_b)*(1-saturation));ctx.fillStyle="rgb("+new_r+","+new_g+","+new_b+")";ctx.fillRect(x_scaled,0,delta_x_px,height_px)}else{y=Math.round(height_px-(y-min_value)/vertical_range*height_px);if(in_path){ctx.lineTo(x_scaled,y)}else{in_path=true;if(mode==="Filled"){ctx.moveTo(x_scaled,height_px);ctx.lineTo(x_scaled,y)}else{ctx.moveTo(x_scaled,y)}}}}ctx.fillStyle=this.prefs.overflow_color;if(top_overflow||bot_overflow){var overflow_x;if(mode==="Histogram"||mode==="Intensity"){overflow_x=delta_x_px}else{x_scaled-=2;overflow_x=4}if(top_overflow){ctx.fillRect(x_scaled,0,overflow_x,3)}if(bot_overflow){ctx.fillRect(x_scaled,height_px-3,overflow_x,3)}}ctx.fillStyle=this.prefs.color}if(mode==="Filled"){if(in_path){ctx.lineTo(x_scaled,y_zero);ctx.lineTo(0,y_zero)}ctx.fill()}else{ctx.stroke()}ctx.restore()};var FeaturePositionMapper=function(slot_height){this.feature_positions={};this.slot_height=slot_height;this.translation=0;this.y_translation=0};FeaturePositionMapper.prototype.map_feature_data=function(feature_data,slot,x_start,x_end){if(!this.feature_positions[slot]){this.feature_positions[slot]=[]}this.feature_positions[slot].push({data:feature_data,x_start:x_start,x_end:x_end})};FeaturePositionMapper.prototype.get_feature_data=function(x,y){var slot=Math.floor((y-this.y_translation)/this.slot_height),feature_dict;if(!this.feature_positions[slot]){return null}x+=this.translation;for(var i=0;i<this.feature_positions[slot].length;i++){feature_dict=this.feature_positions[slot][i];if(x>=feature_dict.x_start&&x<=feature_dict.x_end){return feature_dict.data}}};var FeaturePainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler){Painter.call(this,data,view_start,view_end,prefs,mode);this.alpha_scaler=(alpha_scaler?alpha_scaler:new Scaler());this.height_scaler=(height_scaler?height_scaler:new Scaler())};FeaturePainter.prototype.default_prefs={block_color:"#FFF",connector_color:"#FFF"};extend(FeaturePainter.prototype,{get_required_height:function(rows_required,width){var required_height=this.get_row_height(),y_scale=required_height,mode=this.mode;if(mode==="no_detail"||mode==="Squish"||mode==="Pack"){required_height=rows_required*y_scale}return required_height+this.get_top_padding(width)+this.get_bottom_padding(width)},get_top_padding:function(width){return 0},get_bottom_padding:function(width){return Math.max(Math.round(this.get_row_height()/2),5)},draw:function(ctx,width,height,w_scale,slots){var data=this.data,view_start=this.view_start,view_end=this.view_end;ctx.save();ctx.fillStyle=this.prefs.block_color;ctx.textAlign="right";var y_scale=this.get_row_height(),feature_mapper=new FeaturePositionMapper(y_scale),x_draw_coords;for(var i=0,len=data.length;i<len;i++){var feature=data[i],feature_uid=feature[0],feature_start=feature[1],feature_end=feature[2],slot=(slots&&slots[feature_uid]!==undefined?slots[feature_uid]:null);if((feature_start<view_end&&feature_end>view_start)&&(this.mode==="Dense"||slot!==null)){x_draw_coords=this.draw_element(ctx,this.mode,feature,slot,view_start,view_end,w_scale,y_scale,width);feature_mapper.map_feature_data(feature,slot,x_draw_coords[0],x_draw_coords[1])}}ctx.restore();feature_mapper.y_translation=this.get_top_padding(width);return feature_mapper},draw_element:function(ctx,mode,feature,slot,tile_low,tile_high,w_scale,y_scale,width){console.log("WARNING: Unimplemented function.");return[0,0]}});var DENSE_TRACK_HEIGHT=10,NO_DETAIL_TRACK_HEIGHT=3,SQUISH_TRACK_HEIGHT=5,PACK_TRACK_HEIGHT=10,NO_DETAIL_FEATURE_HEIGHT=1,DENSE_FEATURE_HEIGHT=9,SQUISH_FEATURE_HEIGHT=3,PACK_FEATURE_HEIGHT=9,LABEL_SPACING=2,CONNECTOR_COLOR="#ccc";var LinkedFeaturePainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler){FeaturePainter.call(this,data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler);this.draw_background_connector=true;this.draw_individual_connectors=false};extend(LinkedFeaturePainter.prototype,FeaturePainter.prototype,{get_row_height:function(){var mode=this.mode,height;if(mode==="Dense"){height=DENSE_TRACK_HEIGHT}else{if(mode==="no_detail"){height=NO_DETAIL_TRACK_HEIGHT}else{if(mode==="Squish"){height=SQUISH_TRACK_HEIGHT}else{height=PACK_TRACK_HEIGHT}}}return height},draw_element:function(ctx,mode,feature,slot,tile_low,tile_high,w_scale,y_scale,width){var feature_uid=feature[0],feature_start=feature[1],feature_end=feature[2]-1,feature_name=feature[3],feature_strand=feature[4],f_start=Math.floor(Math.max(0,(feature_start-tile_low)*w_scale)),f_end=Math.ceil(Math.min(width,Math.max(0,(feature_end-tile_low)*w_scale))),draw_start=f_start,draw_end=f_end,y_center=(mode==="Dense"?0:(0+slot))*y_scale+this.get_top_padding(width),thickness,y_start,thick_start=null,thick_end=null,block_color=(!feature_strand||feature_strand==="+"||feature_strand==="."?this.prefs.block_color:this.prefs.reverse_strand_color);label_color=this.prefs.label_color;ctx.globalAlpha=this.alpha_scaler.gen_val(feature);if(mode==="Dense"){slot=1}if(mode==="no_detail"){ctx.fillStyle=block_color;ctx.fillRect(f_start,y_center+5,f_end-f_start,NO_DETAIL_FEATURE_HEIGHT)}else{var feature_ts=feature[5],feature_te=feature[6],feature_blocks=feature[7],full_height=true;if(feature_ts&&feature_te){thick_start=Math.floor(Math.max(0,(feature_ts-tile_low)*w_scale));thick_end=Math.ceil(Math.min(width,Math.max(0,(feature_te-tile_low)*w_scale)))}var thin_height,thick_height;if(mode==="Squish"){thin_height=1;thick_height=SQUISH_FEATURE_HEIGHT;full_height=false}else{if(mode==="Dense"){thin_height=5;thick_height=DENSE_FEATURE_HEIGHT}else{thin_height=5;thick_height=PACK_FEATURE_HEIGHT}}if(!feature_blocks){ctx.fillStyle=block_color;ctx.fillRect(f_start,y_center+1,f_end-f_start,thick_height);if(feature_strand&&full_height){if(feature_strand==="+"){ctx.fillStyle=ctx.canvas.manager.get_pattern("right_strand_inv")}else{if(feature_strand==="-"){ctx.fillStyle=ctx.canvas.manager.get_pattern("left_strand_inv")}}ctx.fillRect(f_start,y_center+1,f_end-f_start,thick_height)}}else{var cur_y_center,cur_height;if(mode==="Squish"||mode==="Dense"){cur_y_center=y_center+Math.floor(SQUISH_FEATURE_HEIGHT/2)+1;cur_height=1}else{if(feature_strand){cur_y_center=y_center;cur_height=thick_height}else{cur_y_center+=(SQUISH_FEATURE_HEIGHT/2)+1;cur_height=1}}if(this.draw_background_connector){if(mode==="Squish"||mode==="Dense"){ctx.fillStyle=CONNECTOR_COLOR}else{if(feature_strand){if(feature_strand==="+"){ctx.fillStyle=ctx.canvas.manager.get_pattern("right_strand")}else{if(feature_strand==="-"){ctx.fillStyle=ctx.canvas.manager.get_pattern("left_strand")}}}else{ctx.fillStyle=CONNECTOR_COLOR}}ctx.fillRect(f_start,cur_y_center,f_end-f_start,cur_height)}var start_and_height;for(var k=0,k_len=feature_blocks.length;k<k_len;k++){var block=feature_blocks[k],block_start=Math.floor(Math.max(0,(block[0]-tile_low)*w_scale)),block_end=Math.ceil(Math.min(width,Math.max((block[1]-1-tile_low)*w_scale))),last_block_start,last_block_end;if(block_start>block_end){continue}ctx.fillStyle=block_color;ctx.fillRect(block_start,y_center+(thick_height-thin_height)/2+1,block_end-block_start,thin_height);if(thick_start!==undefined&&feature_te>feature_ts&&!(block_start>thick_end||block_end<thick_start)){var block_thick_start=Math.max(block_start,thick_start),block_thick_end=Math.min(block_end,thick_end);ctx.fillRect(block_thick_start,y_center+1,block_thick_end-block_thick_start,thick_height);if(feature_blocks.length===1&&mode==="Pack"){if(feature_strand==="+"){ctx.fillStyle=ctx.canvas.manager.get_pattern("right_strand_inv")}else{if(feature_strand==="-"){ctx.fillStyle=ctx.canvas.manager.get_pattern("left_strand_inv")}}if(block_thick_start+14<block_thick_end){block_thick_start+=2;block_thick_end-=2}ctx.fillRect(block_thick_start,y_center+1,block_thick_end-block_thick_start,thick_height)}}if(this.draw_individual_connectors&&last_block_start){this.draw_connector(ctx,last_block_start,last_block_end,block_start,block_end,y_center)}last_block_start=block_start;last_block_end=block_end}if(mode==="Pack"){ctx.globalAlpha=1;ctx.fillStyle="white";var hscale_factor=this.height_scaler.gen_val(feature),new_height=Math.ceil(thick_height*hscale_factor),ws_height=Math.round((thick_height-new_height)/2);if(hscale_factor!==1){ctx.fillRect(f_start,cur_y_center+1,f_end-f_start,ws_height);ctx.fillRect(f_start,cur_y_center+thick_height-ws_height+1,f_end-f_start,ws_height)}}}ctx.globalAlpha=1;if(feature_name&&mode==="Pack"&&feature_start>tile_low){ctx.fillStyle=label_color;if(tile_low===0&&f_start-ctx.measureText(feature_name).width<0){ctx.textAlign="left";ctx.fillText(feature_name,f_end+LABEL_SPACING,y_center+8);draw_end+=ctx.measureText(feature_name).width+LABEL_SPACING}else{ctx.textAlign="right";ctx.fillText(feature_name,f_start-LABEL_SPACING,y_center+8);draw_start-=ctx.measureText(feature_name).width+LABEL_SPACING}}}ctx.globalAlpha=1;return[draw_start,draw_end]}});var ReadPainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler,ref_seq){FeaturePainter.call(this,data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler);this.ref_seq=(ref_seq?ref_seq.data:null)};extend(ReadPainter.prototype,FeaturePainter.prototype,{get_row_height:function(){var height,mode=this.mode;if(mode==="Dense"){height=DENSE_TRACK_HEIGHT}else{if(mode==="Squish"){height=SQUISH_TRACK_HEIGHT}else{height=PACK_TRACK_HEIGHT;if(this.prefs.show_insertions){height*=2}}}return height},draw_read:function(ctx,mode,w_scale,y_center,tile_low,tile_high,feature_start,cigar,strand,ref_seq){ctx.textAlign="center";var tile_region=[tile_low,tile_high],base_offset=0,seq_offset=0,gap=0,char_width_px=ctx.canvas.manager.char_width_px,block_color=(strand==="+"?this.prefs.block_color:this.prefs.reverse_strand_color);var draw_last=[];if((mode==="Pack"||this.mode==="Auto")&&ref_seq!==undefined&&w_scale>char_width_px){gap=Math.round(w_scale/2)}if(!cigar){cigar=[[0,ref_seq.length]]}for(var cig_id=0,len=cigar.length;cig_id<len;cig_id++){var cig=cigar[cig_id],cig_op="MIDNSHP=X"[cig[0]],cig_len=cig[1];if(cig_op==="H"||cig_op==="S"){base_offset-=cig_len}var seq_start=(feature_start-1)+base_offset,s_start=Math.floor(Math.max(0,(seq_start-tile_low)*w_scale)),s_end=Math.floor(Math.max(0,(seq_start+cig_len-tile_low)*w_scale));if(s_start===s_end){s_end+=1}switch(cig_op){case"H":break;case"S":case"M":case"=":if(is_overlap([seq_start,seq_start+cig_len],tile_region)){var seq=ref_seq.slice(seq_offset-1,seq_offset+cig_len);if(gap>0){ctx.fillStyle=block_color;ctx.fillRect(s_start-gap,y_center+1,s_end-s_start,9);ctx.fillStyle=CONNECTOR_COLOR;for(var c=0,str_len=seq.length;c<str_len;c++){if(this.prefs.show_differences){if(this.ref_seq){var ref_char=this.ref_seq[seq_start-tile_low+c];if(!ref_char||ref_char.toLowerCase()===seq[c].toLowerCase()){continue}}else{continue}}if(seq_start+c>=tile_low&&seq_start+c<=tile_high){var c_start=Math.floor(Math.max(0,(seq_start+c-tile_low)*w_scale));ctx.fillText(seq[c],c_start,y_center+9)}}}else{ctx.fillStyle=block_color;ctx.fillRect(s_start,y_center+4,s_end-s_start,SQUISH_FEATURE_HEIGHT)}}seq_offset+=cig_len;base_offset+=cig_len;break;case"N":ctx.fillStyle=CONNECTOR_COLOR;ctx.fillRect(s_start-gap,y_center+5,s_end-s_start,1);base_offset+=cig_len;break;case"D":ctx.fillStyle="red";ctx.fillRect(s_start-gap,y_center+4,s_end-s_start,3);base_offset+=cig_len;break;case"P":break;case"I":var insert_x_coord=s_start-gap;if(is_overlap([seq_start,seq_start+cig_len],tile_region)){var seq=ref_seq.slice(seq_offset-1,seq_offset+cig_len);if(this.prefs.show_insertions){var x_center=s_start-(s_end-s_start)/2;if((mode==="Pack"||this.mode==="Auto")&&ref_seq!==undefined&&w_scale>char_width_px){ctx.fillStyle="yellow";ctx.fillRect(x_center-gap,y_center-9,s_end-s_start,9);draw_last[draw_last.length]={type:"triangle",data:[insert_x_coord,y_center+4,5]};ctx.fillStyle=CONNECTOR_COLOR;switch(compute_overlap([seq_start,seq_start+cig_len],tile_region)){case (OVERLAP_START):seq=seq.slice(tile_low-seq_start);break;case (OVERLAP_END):seq=seq.slice(0,seq_start-tile_high);break;case (CONTAINED_BY):break;case (CONTAINS):seq=seq.slice(tile_low-seq_start,seq_start-tile_high);break}for(var c=0,str_len=seq.length;c<str_len;c++){var c_start=Math.floor(Math.max(0,(seq_start+c-tile_low)*w_scale));ctx.fillText(seq[c],c_start-(s_end-s_start)/2,y_center)}}else{ctx.fillStyle="yellow";ctx.fillRect(x_center,y_center+(this.mode!=="Dense"?2:5),s_end-s_start,(mode!=="Dense"?SQUISH_FEATURE_HEIGHT:DENSE_FEATURE_HEIGHT))}}else{if((mode==="Pack"||this.mode==="Auto")&&ref_seq!==undefined&&w_scale>char_width_px){draw_last.push({type:"text",data:[seq.length,insert_x_coord,y_center+9]})}else{}}}seq_offset+=cig_len;break;case"X":seq_offset+=cig_len;break}}ctx.fillStyle="yellow";var item,type,data;for(var i=0;i<draw_last.length;i++){item=draw_last[i];type=item.type;data=item.data;if(type==="text"){ctx.save();ctx.font="bold "+ctx.font;ctx.fillText(data[0],data[1],data[2]);ctx.restore()}else{if(type==="triangle"){drawDownwardEquilateralTriangle(ctx,data[0],data[1],data[2])}}}},draw_element:function(ctx,mode,feature,slot,tile_low,tile_high,w_scale,y_scale,width){var feature_uid=feature[0],feature_start=feature[1],feature_end=feature[2],feature_name=feature[3],f_start=Math.floor(Math.max(0,(feature_start-tile_low)*w_scale)),f_end=Math.ceil(Math.min(width,Math.max(0,(feature_end-tile_low)*w_scale))),y_center=(mode==="Dense"?0:(0+slot))*y_scale,label_color=this.prefs.label_color,gap=0;if((mode==="Pack"||this.mode==="Auto")&&w_scale>ctx.canvas.manager.char_width_px){var gap=Math.round(w_scale/2)}if(feature[5] instanceof Array){var b1_start=Math.floor(Math.max(0,(feature[4][0]-tile_low)*w_scale)),b1_end=Math.ceil(Math.min(width,Math.max(0,(feature[4][1]-tile_low)*w_scale))),b2_start=Math.floor(Math.max(0,(feature[5][0]-tile_low)*w_scale)),b2_end=Math.ceil(Math.min(width,Math.max(0,(feature[5][1]-tile_low)*w_scale))),connector=true;if(feature[4][1]>=tile_low&&feature[4][0]<=tile_high&&feature[4][2]){this.draw_read(ctx,mode,w_scale,y_center,tile_low,tile_high,feature[4][0],feature[4][2],feature[4][3],feature[4][4])}else{connector=false}if(feature[5][1]>=tile_low&&feature[5][0]<=tile_high&&feature[5][2]){this.draw_read(ctx,mode,w_scale,y_center,tile_low,tile_high,feature[5][0],feature[5][2],feature[5][3],feature[5][4])}else{connector=false}if(connector&&b2_start>b1_end){ctx.fillStyle=CONNECTOR_COLOR;dashedLine(ctx,b1_end-gap,y_center+5,b2_start-gap,y_center+5)}}else{this.draw_read(ctx,mode,w_scale,y_center,tile_low,tile_high,feature_start,feature[4],feature[5],feature[6])}if(mode==="Pack"&&feature_start>tile_low&&feature_name!=="."){ctx.fillStyle=this.prefs.label_color;var tile_index=1;if(tile_index===0&&f_start-ctx.measureText(feature_name).width<0){ctx.textAlign="left";ctx.fillText(feature_name,f_end+LABEL_SPACING-gap,y_center+8)}else{ctx.textAlign="right";ctx.fillText(feature_name,f_start-LABEL_SPACING-gap,y_center+8)}}return[0,0]}});var ArcLinkedFeaturePainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler){LinkedFeaturePainter.call(this,data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler);this.longest_feature_length=this.calculate_longest_feature_length();this.draw_background_connector=false;this.draw_individual_connectors=true};extend(ArcLinkedFeaturePainter.prototype,FeaturePainter.prototype,LinkedFeaturePainter.prototype,{calculate_longest_feature_length:function(){var longest_feature_length=0;for(var i=0,len=this.data.length;i<len;i++){var feature=this.data[i],feature_start=feature[1],feature_end=feature[2];longest_feature_length=Math.max(longest_feature_length,feature_end-feature_start)}return longest_feature_length},get_top_padding:function(width){var view_range=this.view_end-this.view_start,w_scale=width/view_range;return Math.min(128,Math.ceil((this.longest_feature_length/2)*w_scale))},draw_connector:function(ctx,block1_start,block1_end,block2_start,block2_end,y_center){var x_center=(block1_end+block2_start)/2,radius=block2_start-x_center;var angle1=Math.PI,angle2=0;if(radius>0){ctx.beginPath();ctx.arc(x_center,y_center,block2_start-x_center,Math.PI,0);ctx.stroke()}}});var Color=function(rgb,a){if(Array.isArray(rgb)){this.rgb=rgb}else{if(rgb.length==6){this.rgb=rgb.match(/.{2}/g).map(function(c){return parseInt(c,16)})}else{if(rgb.length==7){this.rgb=rgb.substring(1,7).match(/.{2}/g).map(function(c){return parseInt(c,16)})}else{this.rgb=rgb.split("").map(function(c){return parseInt(c+c,16)})}}}this.alpha=typeof(a)==="number"?a:1};Color.prototype={eval:function(){return this},toCSS:function(){if(this.alpha<1){return"rgba("+this.rgb.map(function(c){return Math.round(c)}).concat(this.alpha).join(", ")+")"}else{return"#"+this.rgb.map(function(i){i=Math.round(i);i=(i>255?255:(i<0?0:i)).toString(16);return i.length===1?"0"+i:i}).join("")}},toHSL:function(){var r=this.rgb[0]/255,g=this.rgb[1]/255,b=this.rgb[2]/255,a=this.alpha;var max=Math.max(r,g,b),min=Math.min(r,g,b);var h,s,l=(max+min)/2,d=max-min;if(max===min){h=s=0}else{s=l>0.5?d/(2-max-min):d/(max+min);switch(max){case r:h=(g-b)/d+(g<b?6:0);break;case g:h=(b-r)/d+2;break;case b:h=(r-g)/d+4;break}h/=6}return{h:h*360,s:s,l:l,a:a}},toARGB:function(){var argb=[Math.round(this.alpha*255)].concat(this.rgb);return"#"+argb.map(function(i){i=Math.round(i);i=(i>255?255:(i<0?0:i)).toString(16);return i.length===1?"0"+i:i}).join("")},mix:function(color2,weight){color1=this;var p=weight;var w=p*2-1;var a=color1.toHSL().a-color2.toHSL().a;var w1=(((w*a==-1)?w:(w+a)/(1+w*a))+1)/2;var w2=1-w1;var rgb=[color1.rgb[0]*w1+color2.rgb[0]*w2,color1.rgb[1]*w1+color2.rgb[1]*w2,color1.rgb[2]*w1+color2.rgb[2]*w2];var alpha=color1.alpha*p+color2.alpha*(1-p);return new Color(rgb,alpha)}};var LinearRamp=function(start_color,end_color,start_value,end_value){this.start_color=new Color(start_color);this.end_color=new Color(end_color);this.start_value=start_value;this.end_value=end_value;this.value_range=end_value-start_value};LinearRamp.prototype.map_value=function(value){value=Math.max(value,this.start_value);value=Math.min(value,this.end_value);value=(value-this.start_value)/this.value_range;return this.start_color.mix(this.end_color,1-value).toCSS()};var SplitRamp=function(start_color,middle_color,end_color,start_value,end_value){this.positive_ramp=new LinearRamp(middle_color,end_color,0,end_value);this.negative_ramp=new LinearRamp(middle_color,start_color,0,-start_value);this.start_value=start_value;this.end_value=end_value};SplitRamp.prototype.map_value=function(value){value=Math.max(value,this.start_value);value=Math.min(value,this.end_value);if(value>=0){return this.positive_ramp.map_value(value)}else{return this.negative_ramp.map_value(-value)}};var DiagonalHeatmapPainter=function(data,view_start,view_end,prefs,mode){Painter.call(this,data,view_start,view_end,prefs,mode);var i,len;if(this.prefs.min_value===undefined){var min_value=Infinity;for(i=0,len=this.data.length;i<len;i++){min_value=Math.min(min_value,this.data[i][5])}this.prefs.min_value=min_value}if(this.prefs.max_value===undefined){var max_value=-Infinity;for(i=0,len=this.data.length;i<len;i++){max_value=Math.max(max_value,this.data[i][5])}this.prefs.max_value=max_value}};DiagonalHeatmapPainter.prototype.default_prefs={min_value:undefined,max_value:undefined,mode:"Heatmap",pos_color:"#FF8C00",neg_color:"#4169E1"};DiagonalHeatmapPainter.prototype.draw=function(ctx,width,height,w_scale){var min_value=this.prefs.min_value,max_value=this.prefs.max_value,value_range=max_value-min_value,height_px=height,view_start=this.view_start,mode=this.mode,data=this.data,invsqrt2=1/Math.sqrt(2);var ramp=(new SplitRamp(this.prefs.neg_color,"#FFFFFF",this.prefs.pos_color,min_value,max_value));var d,s1,e1,s2,e2,value;var scale=function(p){return(p-view_start)*w_scale};ctx.save();ctx.rotate(-45*Math.PI/180);ctx.scale(invsqrt2,invsqrt2);for(var i=0,len=data.length;i<len;i++){d=data[i];s1=scale(d[1]);e1=scale(d[2]);s2=scale(d[4]);e2=scale(d[5]);value=d[6];ctx.fillStyle=(ramp.map_value(value));ctx.fillRect(s1,s2,(e1-s1),(e2-s2))}ctx.restore()};return{Scaler:Scaler,SummaryTreePainter:SummaryTreePainter,LinePainter:LinePainter,LinkedFeaturePainter:LinkedFeaturePainter,ReadPainter:ReadPainter,ArcLinkedFeaturePainter:ArcLinkedFeaturePainter,DiagonalHeatmapPainter:DiagonalHeatmapPainter}});
\ No newline at end of file
+define(["libs/underscore"],function(_){var extend=_.extend;var BEFORE=1001,CONTAINS=1002,OVERLAP_START=1003,OVERLAP_END=1004,CONTAINED_BY=1005,AFTER=1006;var compute_overlap=function(first_region,second_region){var first_start=first_region[0],first_end=first_region[1],second_start=second_region[0],second_end=second_region[1],overlap;if(first_start<second_start){if(first_end<second_start){overlap=BEFORE}else{if(first_end<=second_end){overlap=OVERLAP_START}else{overlap=CONTAINS}}}else{if(first_start>second_end){overlap=AFTER}else{if(first_end<=second_end){overlap=CONTAINED_BY}else{overlap=OVERLAP_END}}}return overlap};var is_overlap=function(first_region,second_region){var overlap=compute_overlap(first_region,second_region);return(overlap!==BEFORE&&overlap!==AFTER)};var dashedLine=function(ctx,x1,y1,x2,y2,dashLen){if(dashLen===undefined){dashLen=4}var dX=x2-x1;var dY=y2-y1;var dashes=Math.floor(Math.sqrt(dX*dX+dY*dY)/dashLen);var dashX=dX/dashes;var dashY=dY/dashes;var q;for(q=0;q<dashes;q++,x1+=dashX,y1+=dashY){if(q%2!==0){continue}ctx.fillRect(x1,y1,dashLen,1)}};var drawDownwardEquilateralTriangle=function(ctx,down_vertex_x,down_vertex_y,side_len){var x1=down_vertex_x-side_len/2,x2=down_vertex_x+side_len/2,y=down_vertex_y-Math.sqrt(side_len*3/2);ctx.beginPath();ctx.moveTo(x1,y);ctx.lineTo(x2,y);ctx.lineTo(down_vertex_x,down_vertex_y);ctx.lineTo(x1,y);ctx.strokeStyle=this.fillStyle;ctx.fill();ctx.stroke();ctx.closePath()};var Scaler=function(default_val){this.default_val=(default_val?default_val:1)};Scaler.prototype.gen_val=function(input){return this.default_val};var Painter=function(data,view_start,view_end,prefs,mode){this.data=data;this.view_start=view_start;this.view_end=view_end;this.prefs=extend({},this.default_prefs,prefs);this.mode=mode};Painter.prototype.default_prefs={};Painter.prototype.draw=function(ctx,width,height,w_scale){};var SummaryTreePainter=function(data,view_start,view_end,prefs,mode){Painter.call(this,data,view_start,view_end,prefs,mode)};SummaryTreePainter.prototype.default_prefs={show_counts:false};SummaryTreePainter.prototype.draw=function(ctx,width,height,w_scale){var view_start=this.view_start,points=this.data.data,max=(this.prefs.histogram_max?this.prefs.histogram_max:this.data.max),base_y=height;delta_x_px=Math.ceil(this.data.delta*w_scale);ctx.save();for(var i=0,len=points.length;i<len;i++){var x=Math.floor((points[i][0]-view_start)*w_scale);var y=points[i][1];if(!y){continue}var y_px=y/max*height;if(y!==0&&y_px<1){y_px=1}ctx.fillStyle=this.prefs.block_color;ctx.fillRect(x,base_y-y_px,delta_x_px,y_px);var text_padding_req_x=4;if(this.prefs.show_counts&&(ctx.measureText(y).width+text_padding_req_x)<delta_x_px){ctx.fillStyle=this.prefs.label_color;ctx.textAlign="center";ctx.fillText(y,x+(delta_x_px/2),10)}}ctx.restore()};var LinePainter=function(data,view_start,view_end,prefs,mode){Painter.call(this,data,view_start,view_end,prefs,mode);var i,len;if(this.prefs.min_value===undefined){var min_value=Infinity;for(i=0,len=this.data.length;i<len;i++){min_value=Math.min(min_value,this.data[i][1])}this.prefs.min_value=min_value}if(this.prefs.max_value===undefined){var max_value=-Infinity;for(i=0,len=this.data.length;i<len;i++){max_value=Math.max(max_value,this.data[i][1])}this.prefs.max_value=max_value}};LinePainter.prototype.default_prefs={min_value:undefined,max_value:undefined,mode:"Histogram",color:"#000",overflow_color:"#F66"};LinePainter.prototype.draw=function(ctx,width,height,w_scale){var in_path=false,min_value=this.prefs.min_value,max_value=this.prefs.max_value,vertical_range=max_value-min_value,height_px=height,view_start=this.view_start,mode=this.mode,data=this.data;ctx.save();var y_zero=Math.round(height+min_value/vertical_range*height);if(mode!=="Intensity"){ctx.fillStyle="#aaa";ctx.fillRect(0,y_zero,width,1)}ctx.beginPath();var x_scaled,y,delta_x_px;if(data.length>1){delta_x_px=Math.ceil((data[1][0]-data[0][0])*w_scale)}else{delta_x_px=10}var pref_color=parseInt(this.prefs.color.slice(1),16),pref_r=(pref_color&16711680)>>16,pref_g=(pref_color&65280)>>8,pref_b=pref_color&255;for(var i=0,len=data.length;i<len;i++){ctx.fillStyle=ctx.strokeStyle=this.prefs.color;x_scaled=Math.round((data[i][0]-view_start)*w_scale);y=data[i][1];var top_overflow=false,bot_overflow=false;if(y===null){if(in_path&&mode==="Filled"){ctx.lineTo(x_scaled,height_px)}in_path=false;continue}if(y<min_value){bot_overflow=true;y=min_value}else{if(y>max_value){top_overflow=true;y=max_value}}if(mode==="Histogram"){y=Math.round(y/vertical_range*height_px);ctx.fillRect(x_scaled,y_zero,delta_x_px,-y)}else{if(mode==="Intensity"){var saturation=(y-min_value)/vertical_range,new_r=Math.round(pref_r+(255-pref_r)*(1-saturation)),new_g=Math.round(pref_g+(255-pref_g)*(1-saturation)),new_b=Math.round(pref_b+(255-pref_b)*(1-saturation));ctx.fillStyle="rgb("+new_r+","+new_g+","+new_b+")";ctx.fillRect(x_scaled,0,delta_x_px,height_px)}else{y=Math.round(height_px-(y-min_value)/vertical_range*height_px);if(in_path){ctx.lineTo(x_scaled,y)}else{in_path=true;if(mode==="Filled"){ctx.moveTo(x_scaled,height_px);ctx.lineTo(x_scaled,y)}else{ctx.moveTo(x_scaled,y)}}}}ctx.fillStyle=this.prefs.overflow_color;if(top_overflow||bot_overflow){var overflow_x;if(mode==="Histogram"||mode==="Intensity"){overflow_x=delta_x_px}else{x_scaled-=2;overflow_x=4}if(top_overflow){ctx.fillRect(x_scaled,0,overflow_x,3)}if(bot_overflow){ctx.fillRect(x_scaled,height_px-3,overflow_x,3)}}ctx.fillStyle=this.prefs.color}if(mode==="Filled"){if(in_path){ctx.lineTo(x_scaled,y_zero);ctx.lineTo(0,y_zero)}ctx.fill()}else{ctx.stroke()}ctx.restore()};var FeaturePositionMapper=function(slot_height){this.feature_positions={};this.slot_height=slot_height;this.translation=0;this.y_translation=0};FeaturePositionMapper.prototype.map_feature_data=function(feature_data,slot,x_start,x_end){if(!this.feature_positions[slot]){this.feature_positions[slot]=[]}this.feature_positions[slot].push({data:feature_data,x_start:x_start,x_end:x_end})};FeaturePositionMapper.prototype.get_feature_data=function(x,y){var slot=Math.floor((y-this.y_translation)/this.slot_height),feature_dict;if(!this.feature_positions[slot]){return null}x+=this.translation;for(var i=0;i<this.feature_positions[slot].length;i++){feature_dict=this.feature_positions[slot][i];if(x>=feature_dict.x_start&&x<=feature_dict.x_end){return feature_dict.data}}};var FeaturePainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler){Painter.call(this,data,view_start,view_end,prefs,mode);this.alpha_scaler=(alpha_scaler?alpha_scaler:new Scaler());this.height_scaler=(height_scaler?height_scaler:new Scaler())};FeaturePainter.prototype.default_prefs={block_color:"#FFF",connector_color:"#FFF"};extend(FeaturePainter.prototype,{get_required_height:function(rows_required,width){var required_height=this.get_row_height(),y_scale=required_height,mode=this.mode;if(mode==="no_detail"||mode==="Squish"||mode==="Pack"){required_height=rows_required*y_scale}return required_height+this.get_top_padding(width)+this.get_bottom_padding(width)},get_top_padding:function(width){return 0},get_bottom_padding:function(width){return Math.max(Math.round(this.get_row_height()/2),5)},draw:function(ctx,width,height,w_scale,slots){var data=this.data,view_start=this.view_start,view_end=this.view_end;ctx.save();ctx.fillStyle=this.prefs.block_color;ctx.textAlign="right";var y_scale=this.get_row_height(),feature_mapper=new FeaturePositionMapper(y_scale),x_draw_coords;for(var i=0,len=data.length;i<len;i++){var feature=data[i],feature_uid=feature[0],feature_start=feature[1],feature_end=feature[2],slot=(slots&&slots[feature_uid]!==undefined?slots[feature_uid]:null);if((feature_start<view_end&&feature_end>view_start)&&(this.mode==="Dense"||slot!==null)){x_draw_coords=this.draw_element(ctx,this.mode,feature,slot,view_start,view_end,w_scale,y_scale,width);feature_mapper.map_feature_data(feature,slot,x_draw_coords[0],x_draw_coords[1])}}ctx.restore();feature_mapper.y_translation=this.get_top_padding(width);return feature_mapper},draw_element:function(ctx,mode,feature,slot,tile_low,tile_high,w_scale,y_scale,width){console.log("WARNING: Unimplemented function.");return[0,0]}});var DENSE_TRACK_HEIGHT=10,NO_DETAIL_TRACK_HEIGHT=3,SQUISH_TRACK_HEIGHT=5,PACK_TRACK_HEIGHT=10,NO_DETAIL_FEATURE_HEIGHT=1,DENSE_FEATURE_HEIGHT=9,SQUISH_FEATURE_HEIGHT=3,PACK_FEATURE_HEIGHT=9,LABEL_SPACING=2,CONNECTOR_COLOR="#ccc";var LinkedFeaturePainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler){FeaturePainter.call(this,data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler);this.draw_background_connector=true;this.draw_individual_connectors=false};extend(LinkedFeaturePainter.prototype,FeaturePainter.prototype,{get_row_height:function(){var mode=this.mode,height;if(mode==="Dense"){height=DENSE_TRACK_HEIGHT}else{if(mode==="no_detail"){height=NO_DETAIL_TRACK_HEIGHT}else{if(mode==="Squish"){height=SQUISH_TRACK_HEIGHT}else{height=PACK_TRACK_HEIGHT}}}return height},draw_element:function(ctx,mode,feature,slot,tile_low,tile_high,w_scale,y_scale,width){var feature_uid=feature[0],feature_start=feature[1],feature_end=feature[2],feature_name=feature[3],feature_strand=feature[4],f_start=Math.floor(Math.max(0,(feature_start-tile_low)*w_scale)),f_end=Math.ceil(Math.min(width,Math.max(0,(feature_end-tile_low)*w_scale))),draw_start=f_start,draw_end=f_end,y_center=(mode==="Dense"?0:(0+slot))*y_scale+this.get_top_padding(width),thickness,y_start,thick_start=null,thick_end=null,block_color=(!feature_strand||feature_strand==="+"||feature_strand==="."?this.prefs.block_color:this.prefs.reverse_strand_color);label_color=this.prefs.label_color;ctx.globalAlpha=this.alpha_scaler.gen_val(feature);if(mode==="Dense"){slot=1}if(mode==="no_detail"){ctx.fillStyle=block_color;ctx.fillRect(f_start,y_center+5,f_end-f_start,NO_DETAIL_FEATURE_HEIGHT)}else{var feature_ts=feature[5],feature_te=feature[6],feature_blocks=feature[7],full_height=true;if(feature_ts&&feature_te){thick_start=Math.floor(Math.max(0,(feature_ts-tile_low)*w_scale));thick_end=Math.ceil(Math.min(width,Math.max(0,(feature_te-tile_low)*w_scale)))}var thin_height,thick_height;if(mode==="Squish"){thin_height=1;thick_height=SQUISH_FEATURE_HEIGHT;full_height=false}else{if(mode==="Dense"){thin_height=5;thick_height=DENSE_FEATURE_HEIGHT}else{thin_height=5;thick_height=PACK_FEATURE_HEIGHT}}if(!feature_blocks){ctx.fillStyle=block_color;ctx.fillRect(f_start,y_center+1,f_end-f_start,thick_height);if(feature_strand&&full_height){if(feature_strand==="+"){ctx.fillStyle=ctx.canvas.manager.get_pattern("right_strand_inv")}else{if(feature_strand==="-"){ctx.fillStyle=ctx.canvas.manager.get_pattern("left_strand_inv")}}ctx.fillRect(f_start,y_center+1,f_end-f_start,thick_height)}}else{var cur_y_center,cur_height;if(mode==="Squish"||mode==="Dense"){cur_y_center=y_center+Math.floor(SQUISH_FEATURE_HEIGHT/2)+1;cur_height=1}else{if(feature_strand){cur_y_center=y_center;cur_height=thick_height}else{cur_y_center+=(SQUISH_FEATURE_HEIGHT/2)+1;cur_height=1}}if(this.draw_background_connector){if(mode==="Squish"||mode==="Dense"){ctx.fillStyle=CONNECTOR_COLOR}else{if(feature_strand){if(feature_strand==="+"){ctx.fillStyle=ctx.canvas.manager.get_pattern("right_strand")}else{if(feature_strand==="-"){ctx.fillStyle=ctx.canvas.manager.get_pattern("left_strand")}}}else{ctx.fillStyle=CONNECTOR_COLOR}}ctx.fillRect(f_start,cur_y_center,f_end-f_start,cur_height)}var start_and_height;for(var k=0,k_len=feature_blocks.length;k<k_len;k++){var block=feature_blocks[k],block_start=Math.floor(Math.max(0,(block[0]-tile_low)*w_scale)),block_end=Math.ceil(Math.min(width,Math.max((block[1]-tile_low)*w_scale))),last_block_start,last_block_end;if(block_start>block_end){continue}ctx.fillStyle=block_color;ctx.fillRect(block_start,y_center+(thick_height-thin_height)/2+1,block_end-block_start,thin_height);if(thick_start!==undefined&&feature_te>feature_ts&&!(block_start>thick_end||block_end<thick_start)){var block_thick_start=Math.max(block_start,thick_start),block_thick_end=Math.min(block_end,thick_end);ctx.fillRect(block_thick_start,y_center+1,block_thick_end-block_thick_start,thick_height);if(feature_blocks.length===1&&mode==="Pack"){if(feature_strand==="+"){ctx.fillStyle=ctx.canvas.manager.get_pattern("right_strand_inv")}else{if(feature_strand==="-"){ctx.fillStyle=ctx.canvas.manager.get_pattern("left_strand_inv")}}if(block_thick_start+14<block_thick_end){block_thick_start+=2;block_thick_end-=2}ctx.fillRect(block_thick_start,y_center+1,block_thick_end-block_thick_start,thick_height)}}if(this.draw_individual_connectors&&last_block_start){this.draw_connector(ctx,last_block_start,last_block_end,block_start,block_end,y_center)}last_block_start=block_start;last_block_end=block_end}if(mode==="Pack"){ctx.globalAlpha=1;ctx.fillStyle="white";var hscale_factor=this.height_scaler.gen_val(feature),new_height=Math.ceil(thick_height*hscale_factor),ws_height=Math.round((thick_height-new_height)/2);if(hscale_factor!==1){ctx.fillRect(f_start,cur_y_center+1,f_end-f_start,ws_height);ctx.fillRect(f_start,cur_y_center+thick_height-ws_height+1,f_end-f_start,ws_height)}}}ctx.globalAlpha=1;if(feature_name&&mode==="Pack"&&feature_start>tile_low){ctx.fillStyle=label_color;if(tile_low===0&&f_start-ctx.measureText(feature_name).width<0){ctx.textAlign="left";ctx.fillText(feature_name,f_end+LABEL_SPACING,y_center+8);draw_end+=ctx.measureText(feature_name).width+LABEL_SPACING}else{ctx.textAlign="right";ctx.fillText(feature_name,f_start-LABEL_SPACING,y_center+8);draw_start-=ctx.measureText(feature_name).width+LABEL_SPACING}}}ctx.globalAlpha=1;return[draw_start,draw_end]}});var ReadPainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler,ref_seq){FeaturePainter.call(this,data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler);this.ref_seq=(ref_seq?ref_seq.data:null)};extend(ReadPainter.prototype,FeaturePainter.prototype,{get_row_height:function(){var height,mode=this.mode;if(mode==="Dense"){height=DENSE_TRACK_HEIGHT}else{if(mode==="Squish"){height=SQUISH_TRACK_HEIGHT}else{height=PACK_TRACK_HEIGHT;if(this.prefs.show_insertions){height*=2}}}return height},draw_read:function(ctx,mode,w_scale,y_center,tile_low,tile_high,feature_start,cigar,strand,ref_seq){ctx.textAlign="center";var tile_region=[tile_low,tile_high],base_offset=0,seq_offset=0,gap=0,char_width_px=ctx.canvas.manager.char_width_px,block_color=(strand==="+"?this.prefs.block_color:this.prefs.reverse_strand_color);var draw_last=[];if((mode==="Pack"||this.mode==="Auto")&&ref_seq!==undefined&&w_scale>char_width_px){gap=Math.round(w_scale/2)}if(!cigar){cigar=[[0,ref_seq.length]]}for(var cig_id=0,len=cigar.length;cig_id<len;cig_id++){var cig=cigar[cig_id],cig_op="MIDNSHP=X"[cig[0]],cig_len=cig[1];if(cig_op==="H"||cig_op==="S"){base_offset-=cig_len}var seq_start=feature_start+base_offset,s_start=Math.floor(Math.max(0,(seq_start-tile_low)*w_scale)),s_end=Math.floor(Math.max(0,(seq_start+cig_len-tile_low)*w_scale));if(s_start===s_end){s_end+=1}switch(cig_op){case"H":break;case"S":case"M":case"=":if(is_overlap([seq_start,seq_start+cig_len],tile_region)){var seq=ref_seq.slice(seq_offset,seq_offset+cig_len);if(gap>0){ctx.fillStyle=block_color;ctx.fillRect(s_start-gap,y_center+1,s_end-s_start,9);ctx.fillStyle=CONNECTOR_COLOR;for(var c=0,str_len=seq.length;c<str_len;c++){if(this.prefs.show_differences){if(this.ref_seq){var ref_char=this.ref_seq[seq_start-tile_low+c];if(!ref_char||ref_char.toLowerCase()===seq[c].toLowerCase()){continue}}else{continue}}if(seq_start+c>=tile_low&&seq_start+c<=tile_high){var c_start=Math.floor(Math.max(0,(seq_start+c-tile_low)*w_scale));ctx.fillText(seq[c],c_start,y_center+9)}}}else{ctx.fillStyle=block_color;ctx.fillRect(s_start,y_center+4,s_end-s_start,SQUISH_FEATURE_HEIGHT)}}seq_offset+=cig_len;base_offset+=cig_len;break;case"N":ctx.fillStyle=CONNECTOR_COLOR;ctx.fillRect(s_start-gap,y_center+5,s_end-s_start,1);base_offset+=cig_len;break;case"D":ctx.fillStyle="red";ctx.fillRect(s_start-gap,y_center+4,s_end-s_start,3);base_offset+=cig_len;break;case"P":break;case"I":var insert_x_coord=s_start-gap;if(is_overlap([seq_start,seq_start+cig_len],tile_region)){var seq=ref_seq.slice(seq_offset,seq_offset+cig_len);if(this.prefs.show_insertions){var x_center=s_start-(s_end-s_start)/2;if((mode==="Pack"||this.mode==="Auto")&&ref_seq!==undefined&&w_scale>char_width_px){ctx.fillStyle="yellow";ctx.fillRect(x_center-gap,y_center-9,s_end-s_start,9);draw_last[draw_last.length]={type:"triangle",data:[insert_x_coord,y_center+4,5]};ctx.fillStyle=CONNECTOR_COLOR;switch(compute_overlap([seq_start,seq_start+cig_len],tile_region)){case (OVERLAP_START):seq=seq.slice(tile_low-seq_start);break;case (OVERLAP_END):seq=seq.slice(0,seq_start-tile_high);break;case (CONTAINED_BY):break;case (CONTAINS):seq=seq.slice(tile_low-seq_start,seq_start-tile_high);break}for(var c=0,str_len=seq.length;c<str_len;c++){var c_start=Math.floor(Math.max(0,(seq_start+c-tile_low)*w_scale));ctx.fillText(seq[c],c_start-(s_end-s_start)/2,y_center)}}else{ctx.fillStyle="yellow";ctx.fillRect(x_center,y_center+(this.mode!=="Dense"?2:5),s_end-s_start,(mode!=="Dense"?SQUISH_FEATURE_HEIGHT:DENSE_FEATURE_HEIGHT))}}else{if((mode==="Pack"||this.mode==="Auto")&&ref_seq!==undefined&&w_scale>char_width_px){draw_last.push({type:"text",data:[seq.length,insert_x_coord,y_center+9]})}else{}}}seq_offset+=cig_len;break;case"X":seq_offset+=cig_len;break}}ctx.fillStyle="yellow";var item,type,data;for(var i=0;i<draw_last.length;i++){item=draw_last[i];type=item.type;data=item.data;if(type==="text"){ctx.save();ctx.font="bold "+ctx.font;ctx.fillText(data[0],data[1],data[2]);ctx.restore()}else{if(type==="triangle"){drawDownwardEquilateralTriangle(ctx,data[0],data[1],data[2])}}}},draw_element:function(ctx,mode,feature,slot,tile_low,tile_high,w_scale,y_scale,width){var feature_uid=feature[0],feature_start=feature[1],feature_end=feature[2],feature_name=feature[3],f_start=Math.floor(Math.max(0,(feature_start-tile_low)*w_scale)),f_end=Math.ceil(Math.min(width,Math.max(0,(feature_end-tile_low)*w_scale))),y_center=(mode==="Dense"?0:(0+slot))*y_scale,label_color=this.prefs.label_color,gap=0;if((mode==="Pack"||this.mode==="Auto")&&w_scale>ctx.canvas.manager.char_width_px){var gap=Math.round(w_scale/2)}if(feature[5] instanceof Array){var b1_start=Math.floor(Math.max(0,(feature[4][0]-tile_low)*w_scale)),b1_end=Math.ceil(Math.min(width,Math.max(0,(feature[4][1]-tile_low)*w_scale))),b2_start=Math.floor(Math.max(0,(feature[5][0]-tile_low)*w_scale)),b2_end=Math.ceil(Math.min(width,Math.max(0,(feature[5][1]-tile_low)*w_scale))),connector=true;if(feature[4][1]>=tile_low&&feature[4][0]<=tile_high&&feature[4][2]){this.draw_read(ctx,mode,w_scale,y_center,tile_low,tile_high,feature[4][0],feature[4][2],feature[4][3],feature[4][4])}else{connector=false}if(feature[5][1]>=tile_low&&feature[5][0]<=tile_high&&feature[5][2]){this.draw_read(ctx,mode,w_scale,y_center,tile_low,tile_high,feature[5][0],feature[5][2],feature[5][3],feature[5][4])}else{connector=false}if(connector&&b2_start>b1_end){ctx.fillStyle=CONNECTOR_COLOR;dashedLine(ctx,b1_end-gap,y_center+5,b2_start-gap,y_center+5)}}else{this.draw_read(ctx,mode,w_scale,y_center,tile_low,tile_high,feature_start,feature[4],feature[5],feature[6])}if(mode==="Pack"&&feature_start>tile_low&&feature_name!=="."){ctx.fillStyle=this.prefs.label_color;var tile_index=1;if(tile_index===0&&f_start-ctx.measureText(feature_name).width<0){ctx.textAlign="left";ctx.fillText(feature_name,f_end+LABEL_SPACING-gap,y_center+8)}else{ctx.textAlign="right";ctx.fillText(feature_name,f_start-LABEL_SPACING-gap,y_center+8)}}return[0,0]}});var ArcLinkedFeaturePainter=function(data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler){LinkedFeaturePainter.call(this,data,view_start,view_end,prefs,mode,alpha_scaler,height_scaler);this.longest_feature_length=this.calculate_longest_feature_length();this.draw_background_connector=false;this.draw_individual_connectors=true};extend(ArcLinkedFeaturePainter.prototype,FeaturePainter.prototype,LinkedFeaturePainter.prototype,{calculate_longest_feature_length:function(){var longest_feature_length=0;for(var i=0,len=this.data.length;i<len;i++){var feature=this.data[i],feature_start=feature[1],feature_end=feature[2];longest_feature_length=Math.max(longest_feature_length,feature_end-feature_start)}return longest_feature_length},get_top_padding:function(width){var view_range=this.view_end-this.view_start,w_scale=width/view_range;return Math.min(128,Math.ceil((this.longest_feature_length/2)*w_scale))},draw_connector:function(ctx,block1_start,block1_end,block2_start,block2_end,y_center){var x_center=(block1_end+block2_start)/2,radius=block2_start-x_center;var angle1=Math.PI,angle2=0;if(radius>0){ctx.beginPath();ctx.arc(x_center,y_center,block2_start-x_center,Math.PI,0);ctx.stroke()}}});var Color=function(rgb,a){if(Array.isArray(rgb)){this.rgb=rgb}else{if(rgb.length==6){this.rgb=rgb.match(/.{2}/g).map(function(c){return parseInt(c,16)})}else{if(rgb.length==7){this.rgb=rgb.substring(1,7).match(/.{2}/g).map(function(c){return parseInt(c,16)})}else{this.rgb=rgb.split("").map(function(c){return parseInt(c+c,16)})}}}this.alpha=typeof(a)==="number"?a:1};Color.prototype={eval:function(){return this},toCSS:function(){if(this.alpha<1){return"rgba("+this.rgb.map(function(c){return Math.round(c)}).concat(this.alpha).join(", ")+")"}else{return"#"+this.rgb.map(function(i){i=Math.round(i);i=(i>255?255:(i<0?0:i)).toString(16);return i.length===1?"0"+i:i}).join("")}},toHSL:function(){var r=this.rgb[0]/255,g=this.rgb[1]/255,b=this.rgb[2]/255,a=this.alpha;var max=Math.max(r,g,b),min=Math.min(r,g,b);var h,s,l=(max+min)/2,d=max-min;if(max===min){h=s=0}else{s=l>0.5?d/(2-max-min):d/(max+min);switch(max){case r:h=(g-b)/d+(g<b?6:0);break;case g:h=(b-r)/d+2;break;case b:h=(r-g)/d+4;break}h/=6}return{h:h*360,s:s,l:l,a:a}},toARGB:function(){var argb=[Math.round(this.alpha*255)].concat(this.rgb);return"#"+argb.map(function(i){i=Math.round(i);i=(i>255?255:(i<0?0:i)).toString(16);return i.length===1?"0"+i:i}).join("")},mix:function(color2,weight){color1=this;var p=weight;var w=p*2-1;var a=color1.toHSL().a-color2.toHSL().a;var w1=(((w*a==-1)?w:(w+a)/(1+w*a))+1)/2;var w2=1-w1;var rgb=[color1.rgb[0]*w1+color2.rgb[0]*w2,color1.rgb[1]*w1+color2.rgb[1]*w2,color1.rgb[2]*w1+color2.rgb[2]*w2];var alpha=color1.alpha*p+color2.alpha*(1-p);return new Color(rgb,alpha)}};var LinearRamp=function(start_color,end_color,start_value,end_value){this.start_color=new Color(start_color);this.end_color=new Color(end_color);this.start_value=start_value;this.end_value=end_value;this.value_range=end_value-start_value};LinearRamp.prototype.map_value=function(value){value=Math.max(value,this.start_value);value=Math.min(value,this.end_value);value=(value-this.start_value)/this.value_range;return this.start_color.mix(this.end_color,1-value).toCSS()};var SplitRamp=function(start_color,middle_color,end_color,start_value,end_value){this.positive_ramp=new LinearRamp(middle_color,end_color,0,end_value);this.negative_ramp=new LinearRamp(middle_color,start_color,0,-start_value);this.start_value=start_value;this.end_value=end_value};SplitRamp.prototype.map_value=function(value){value=Math.max(value,this.start_value);value=Math.min(value,this.end_value);if(value>=0){return this.positive_ramp.map_value(value)}else{return this.negative_ramp.map_value(-value)}};var DiagonalHeatmapPainter=function(data,view_start,view_end,prefs,mode){Painter.call(this,data,view_start,view_end,prefs,mode);var i,len;if(this.prefs.min_value===undefined){var min_value=Infinity;for(i=0,len=this.data.length;i<len;i++){min_value=Math.min(min_value,this.data[i][5])}this.prefs.min_value=min_value}if(this.prefs.max_value===undefined){var max_value=-Infinity;for(i=0,len=this.data.length;i<len;i++){max_value=Math.max(max_value,this.data[i][5])}this.prefs.max_value=max_value}};DiagonalHeatmapPainter.prototype.default_prefs={min_value:undefined,max_value:undefined,mode:"Heatmap",pos_color:"#FF8C00",neg_color:"#4169E1"};DiagonalHeatmapPainter.prototype.draw=function(ctx,width,height,w_scale){var min_value=this.prefs.min_value,max_value=this.prefs.max_value,value_range=max_value-min_value,height_px=height,view_start=this.view_start,mode=this.mode,data=this.data,invsqrt2=1/Math.sqrt(2);var ramp=(new SplitRamp(this.prefs.neg_color,"#FFFFFF",this.prefs.pos_color,min_value,max_value));var d,s1,e1,s2,e2,value;var scale=function(p){return(p-view_start)*w_scale};ctx.save();ctx.rotate(-45*Math.PI/180);ctx.scale(invsqrt2,invsqrt2);for(var i=0,len=data.length;i<len;i++){d=data[i];s1=scale(d[1]);e1=scale(d[2]);s2=scale(d[4]);e2=scale(d[5]);value=d[6];ctx.fillStyle=(ramp.map_value(value));ctx.fillRect(s1,s2,(e1-s1),(e2-s2))}ctx.restore()};return{Scaler:Scaler,SummaryTreePainter:SummaryTreePainter,LinePainter:LinePainter,LinkedFeaturePainter:LinkedFeaturePainter,ReadPainter:ReadPainter,ArcLinkedFeaturePainter:ArcLinkedFeaturePainter,DiagonalHeatmapPainter:DiagonalHeatmapPainter}});
\ No newline at end of file
diff -r 04aaf661f80a92cfd8c804baccac348e3cc98355 -r 865c74ff03755f21eaaf4a557b1c2aeb1518e593 static/scripts/viz/trackster/painters.js
--- a/static/scripts/viz/trackster/painters.js
+++ b/static/scripts/viz/trackster/painters.js
@@ -236,9 +236,7 @@
// Paint track.
for (var i = 0, len = data.length; i < len; i++) {
ctx.fillStyle = ctx.strokeStyle = this.prefs.color;
- // -1 because LineTrack data uses 1-based coordinate system but painter
- // uses 0-based system.
- x_scaled = Math.round((data[i][0] - view_start - 1) * w_scale);
+ x_scaled = Math.round((data[i][0] - view_start) * w_scale);
y = data[i][1];
var top_overflow = false, bot_overflow = false;
if (y === null) {
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
14 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/c58f82badc26/
changeset: c58f82badc26
user: dan
date: 2013-02-14 21:20:38
summary: Enhance TabularToolDataTable.get_entry()
affected #: 1 file
diff -r caaf60ca4511b532b58ec5e1de85e39a0067ae0d -r c58f82badc26168885507312b71ac2351046bee8 lib/galaxy/tools/data/__init__.py
--- a/lib/galaxy/tools/data/__init__.py
+++ b/lib/galaxy/tools/data/__init__.py
@@ -280,23 +280,22 @@
rval.append( None )
return rval
- def get_entry( self, query_attr, query_val, return_attr ):
+ def get_entry( self, query_attr, query_val, return_attr, default=None ):
"""
Returns table entry associated with a col/val pair.
"""
query_col = self.columns.get( query_attr, None )
- if not query_col:
- return None
+ if query_col is None:
+ return default
return_col = self.columns.get( return_attr, None )
- if not return_col:
- return None
- rval = None
+ if return_col is None:
+ return default
+ rval = default
# Look for table entry.
for fields in self.data:
if fields[ query_col ] == query_val:
rval = fields[ return_col ]
break
-
return rval
# Registry of tool data types by type_key
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
14 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/caaf60ca4511/
changeset: caaf60ca4511
user: dan
date: 2013-02-14 21:16:44
summary: Fix broken TabularToolDataTable.get_entry()
affected #: 1 file
diff -r 138642a8dc55689a3cab1d070aac72b293265bc9 -r caaf60ca4511b532b58ec5e1de85e39a0067ae0d lib/galaxy/tools/data/__init__.py
--- a/lib/galaxy/tools/data/__init__.py
+++ b/lib/galaxy/tools/data/__init__.py
@@ -290,7 +290,7 @@
return_col = self.columns.get( return_attr, None )
if not return_col:
return None
-
+ rval = None
# Look for table entry.
for fields in self.data:
if fields[ query_col ] == query_val:
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0
14 Feb '13
1 new commit in galaxy-central:
https://bitbucket.org/galaxy/galaxy-central/commits/138642a8dc55/
changeset: 138642a8dc55
user: dan
date: 2013-02-14 21:13:06
summary: First pass at a plugable Data Manager. Data Managers can be defined locally or installed from a Tool Shed. TODO: Display Data Manager information in the Tool Shed. Do not install Data Managers into Tool Panel. Add tests. Write Docs.
affected #: 28 files
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 buildbot_setup.sh
--- a/buildbot_setup.sh
+++ b/buildbot_setup.sh
@@ -70,6 +70,8 @@
tool_data_table_conf.xml.sample
shed_tool_data_table_conf.xml.sample
migrated_tools_conf.xml.sample
+data_manager_conf.xml.sample
+shed_data_manager_conf.xml.sample
tool-data/shared/ensembl/builds.txt.sample
tool-data/shared/igv/igv_build_sites.txt.sample
tool-data/shared/ncbi/builds.txt.sample
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 data_manager_conf.xml.sample
--- /dev/null
+++ b/data_manager_conf.xml.sample
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<data_managers>
+</data_managers>
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 datatypes_conf.xml.sample
--- a/datatypes_conf.xml.sample
+++ b/datatypes_conf.xml.sample
@@ -59,6 +59,7 @@
<datatype extension="bowtie_base_index" type="galaxy.datatypes.ngsindex:BowtieBaseIndex" mimetype="text/html" display_in_upload="False"/><datatype extension="csfasta" type="galaxy.datatypes.sequence:csFasta" display_in_upload="true"/><datatype extension="data" type="galaxy.datatypes.data:Data" mimetype="application/octet-stream" max_optional_metadata_filesize="1048576" />
+ <datatype extension="data_manager_json" type="galaxy.datatypes.data:Text" mimetype="application/json" subclass="True" display_in_upload="False"/><datatype extension="fasta" type="galaxy.datatypes.sequence:Fasta" display_in_upload="true"><converter file="fasta_to_tabular_converter.xml" target_datatype="tabular"/><converter file="fasta_to_bowtie_base_index_converter.xml" target_datatype="bowtie_base_index"/>
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 lib/galaxy/app.py
--- a/lib/galaxy/app.py
+++ b/lib/galaxy/app.py
@@ -18,6 +18,7 @@
from galaxy.tools.genome_index import load_genome_index_tools
from galaxy.sample_tracking import external_service_types
from galaxy.openid.providers import OpenIDProviders
+from galaxy.tools.data_manager.manager import DataManagers
class UniverseApplication( object ):
"""Encapsulates the state of a Universe application"""
@@ -95,6 +96,8 @@
self.toolbox = tools.ToolBox( tool_configs, self.config.tool_path, self )
# Search support for tools
self.toolbox_search = galaxy.tools.search.ToolBoxSearch( self.toolbox )
+ # Load Data Manager
+ self.data_managers = DataManagers( self )
# If enabled, poll respective tool sheds to see if updates are available for any installed tool shed repositories.
if self.config.get_bool( 'enable_tool_shed_check', False ):
from tool_shed import update_manager
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 lib/galaxy/config.py
--- a/lib/galaxy/config.py
+++ b/lib/galaxy/config.py
@@ -75,6 +75,10 @@
except:
self.hours_between_check = 12
self.update_integrated_tool_panel = kwargs.get( "update_integrated_tool_panel", True )
+ self.enable_data_manager_user_view = string_as_bool( kwargs.get( "enable_data_manager_user_view", "False" ) )
+ self.data_manager_config_file = resolve_path( kwargs.get('data_manager_config_file', 'data_manager_conf.xml' ), self.root )
+ self.shed_data_manager_config_file = resolve_path( kwargs.get('shed_data_manager_config_file', 'shed_data_manager_conf.xml' ), self.root )
+ self.galaxy_data_manager_data_path = kwargs.get( 'galaxy_data_manager_data_path', self.tool_data_path )
self.tool_secret = kwargs.get( "tool_secret", "" )
self.id_secret = kwargs.get( "id_secret", "USING THE DEFAULT IS NOT SECURE!" )
self.set_metadata_externally = string_as_bool( kwargs.get( "set_metadata_externally", "False" ) )
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 lib/galaxy/model/__init__.py
--- a/lib/galaxy/model/__init__.py
+++ b/lib/galaxy/model/__init__.py
@@ -2998,6 +2998,20 @@
def set_item( self, visualization ):
self.visualization = visualization
+#Data Manager Classes
+class DataManagerHistoryAssociation( object ):
+ def __init__( self, id=None, history=None, user=None ):
+ self.id = id
+ self.history = history
+ self.user = user
+
+class DataManagerJobAssociation( object ):
+ def __init__( self, id=None, job=None, data_manager_id=None ):
+ self.id = id
+ self.job = job
+ self.data_manager_id = data_manager_id
+#end of Data Manager Classes
+
class UserPreference ( object ):
def __init__( self, name=None, value=None ):
self.name = name
@@ -3165,6 +3179,11 @@
return 'repository_dependencies' in self.metadata
return False
@property
+ def includes_data_managers( self ):
+ if self.metadata:
+ return bool( len( self.metadata.get( 'data_manager', {} ).get( 'data_managers', {} ) ) )
+ return False
+ @property
def includes_tools( self ):
if self.metadata:
return 'tools' in self.metadata
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 lib/galaxy/model/mapping.py
--- a/lib/galaxy/model/mapping.py
+++ b/lib/galaxy/model/mapping.py
@@ -932,6 +932,23 @@
Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True )
)
+#Data Manager tables
+DataManagerHistoryAssociation.table = Table( "data_manager_history_association", metadata,
+ Column( "id", Integer, primary_key=True),
+ Column( "create_time", DateTime, default=now ),
+ Column( "update_time", DateTime, index=True, default=now, onupdate=now ),
+ Column( "history_id", Integer, ForeignKey( "history.id" ), index=True ),
+ Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True )
+ )
+
+DataManagerJobAssociation.table = Table( "data_manager_job_association", metadata,
+ Column( "id", Integer, primary_key=True),
+ Column( "create_time", DateTime, default=now ),
+ Column( "update_time", DateTime, index=True, default=now, onupdate=now ),
+ Column( "job_id", Integer, ForeignKey( "job.id" ), index=True ),
+ Column( "data_manager_id", TEXT, index=True )
+ )
+
# Tagging tables.
Tag.table = Table( "tag", metadata,
@@ -1901,6 +1918,17 @@
properties=dict( visualization=relation( Visualization ), user=relation( User ) )
)
+#Data Manager tables
+assign_mapper( context, DataManagerHistoryAssociation, DataManagerHistoryAssociation.table,
+ properties=dict( history=relation( History ),
+ user=relation( User, backref='data_manager_histories' )
+ )
+ )
+
+assign_mapper( context, DataManagerJobAssociation, DataManagerJobAssociation.table,
+ properties=dict( job=relation( Job, backref=backref('data_manager_association', uselist=False ), uselist=False ) )
+ )
+
# User tables.
assign_mapper( context, UserPreference, UserPreference.table,
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 lib/galaxy/model/migrate/versions/0112_add_data_manager_history_association_and_data_manager_job_association_tables.py
--- /dev/null
+++ b/lib/galaxy/model/migrate/versions/0112_add_data_manager_history_association_and_data_manager_job_association_tables.py
@@ -0,0 +1,66 @@
+"""
+Migration script to add the data_manager_history_association table and data_manager_job_association.
+"""
+from sqlalchemy import *
+from sqlalchemy.orm import *
+from migrate import *
+from migrate.changeset import *
+import sys, logging
+from galaxy.model.custom_types import *
+from sqlalchemy.exc import *
+import datetime
+now = datetime.datetime.utcnow
+
+log = logging.getLogger( __name__ )
+log.setLevel( logging.DEBUG )
+handler = logging.StreamHandler( sys.stdout )
+format = "%(name)s %(levelname)s %(asctime)s %(message)s"
+formatter = logging.Formatter( format )
+handler.setFormatter( formatter )
+log.addHandler( handler )
+
+metadata = MetaData( migrate_engine )
+
+DataManagerHistoryAssociation_table = Table( "data_manager_history_association", metadata,
+ Column( "id", Integer, primary_key=True),
+ Column( "create_time", DateTime, default=now ),
+ Column( "update_time", DateTime, index=True, default=now, onupdate=now ),
+ Column( "history_id", Integer, ForeignKey( "history.id" ), index=True ),
+ Column( "user_id", Integer, ForeignKey( "galaxy_user.id" ), index=True )
+ )
+
+DataManagerJobAssociation_table = Table( "data_manager_job_association", metadata,
+ Column( "id", Integer, primary_key=True),
+ Column( "create_time", DateTime, default=now ),
+ Column( "update_time", DateTime, index=True, default=now, onupdate=now ),
+ Column( "job_id", Integer, ForeignKey( "job.id" ), index=True ),
+ Column( "data_manager_id", TEXT, index=True )
+ )
+
+def upgrade():
+ print __doc__
+ metadata.reflect()
+ try:
+ DataManagerHistoryAssociation_table.create()
+ log.debug( "Created data_manager_history_association table" )
+ except Exception, e:
+ log.debug( "Creating data_manager_history_association table failed: %s" % str( e ) )
+ try:
+ DataManagerJobAssociation_table.create()
+ log.debug( "Created data_manager_job_association table" )
+ except Exception, e:
+ log.debug( "Creating data_manager_job_association table failed: %s" % str( e ) )
+
+
+def downgrade():
+ metadata.reflect()
+ try:
+ DataManagerHistoryAssociation_table.drop()
+ log.debug( "Dropped data_manager_history_association table" )
+ except Exception, e:
+ log.debug( "Dropping data_manager_history_association table failed: %s" % str( e ) )
+ try:
+ DataManagerJobAssociation_table.drop()
+ log.debug( "Dropped data_manager_job_association table" )
+ except Exception, e:
+ log.debug( "Dropping data_manager_job_association table failed: %s" % str( e ) )
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 lib/galaxy/tools/__init__.py
--- a/lib/galaxy/tools/__init__.py
+++ b/lib/galaxy/tools/__init__.py
@@ -7,7 +7,7 @@
pkg_resources.require( "MarkupSafe" ) #MarkupSafe must load before mako
pkg_resources.require( "Mako" )
-import logging, os, string, sys, tempfile, glob, shutil, types, urllib, subprocess, random, math, traceback, re
+import logging, os, string, sys, tempfile, glob, shutil, types, urllib, subprocess, random, math, traceback, re, pipes
import simplejson
import binascii
from mako.template import Template
@@ -26,6 +26,7 @@
from galaxy.util.expressions import ExpressionContext
from galaxy.tools.test import ToolTestBuilder
from galaxy.tools.actions import DefaultToolAction
+from galaxy.tools.actions.data_manager import DataManagerToolAction
from galaxy.tools.deps import DependencyManager
from galaxy.model import directory_hash_id
from galaxy.model.orm import *
@@ -86,6 +87,7 @@
# In-memory dictionary that defines the layout of the tool panel.
self.tool_panel = odict()
self.index = 0
+ self.data_manager_tools = odict()
# File that contains the XML section and tool tags from all tool panel config files integrated into a
# single file that defines the tool panel layout. This file can be changed by the Galaxy administrator
# (in a way similar to the single tool_conf.xml file in the past) to alter the layout of the tool panel.
@@ -515,7 +517,7 @@
self.integrated_tool_panel[ key ] = integrated_section
else:
self.integrated_tool_panel.insert( index, key, integrated_section )
- def load_tool( self, config_file, guid=None ):
+ def load_tool( self, config_file, guid=None, **kwds ):
"""Load a single tool from the file named by `config_file` and return an instance of `Tool`."""
# Parse XML configuration file and get the root element
tree = util.parse_xml( config_file )
@@ -531,7 +533,7 @@
ToolClass = tool_types.get( root.get( 'tool_type' ) )
else:
ToolClass = Tool
- return ToolClass( config_file, root, self.app, guid=guid )
+ return ToolClass( config_file, root, self.app, guid=guid, **kwds )
def reload_tool_by_id( self, tool_id ):
"""
Attempt to reload the tool identified by 'tool_id', if successful
@@ -569,6 +571,34 @@
message += "<b>version:</b> %s" % old_tool.version
status = 'done'
return message, status
+ def remove_tool_by_id( self, tool_id ):
+ """
+ Attempt to remove the tool identified by 'tool_id'.
+ """
+ if tool_id not in self.tools_by_id:
+ message = "No tool with id %s" % tool_id
+ status = 'error'
+ else:
+ tool = self.tools_by_id[ tool_id ]
+ del self.tools_by_id[ tool_id ]
+ tool_key = 'tool_' + tool_id
+ for key, val in self.tool_panel.items():
+ if key == tool_key:
+ del self.tool_panel[ key ]
+ break
+ elif key.startswith( 'section' ):
+ if tool_key in val.elems:
+ del self.tool_panel[ key ].elems[ tool_key ]
+ break
+ if tool_id in self.data_manager_tools:
+ del self.data_manager_tools[ tool_id ]
+ #TODO: do we need to manually remove from the integrated panel here?
+ message = "Removed the tool:<br/>"
+ message += "<b>name:</b> %s<br/>" % tool.name
+ message += "<b>id:</b> %s<br/>" % tool.id
+ message += "<b>version:</b> %s" % tool.version
+ status = 'done'
+ return message, status
def load_workflow( self, workflow_id ):
"""
Return an instance of 'Workflow' identified by `id`,
@@ -818,6 +848,7 @@
"""
tool_type = 'default'
+ default_tool_action = DefaultToolAction
def __init__( self, config_file, root, app, guid=None ):
"""Load a tool from the config named by `config_file`"""
@@ -1070,7 +1101,7 @@
# Action
action_elem = root.find( "action" )
if action_elem is None:
- self.tool_action = DefaultToolAction()
+ self.tool_action = self.default_tool_action()
else:
module = action_elem.get( 'module' )
cls = action_elem.get( 'class' )
@@ -2612,12 +2643,14 @@
extra_dir="dataset_%d_files" % hda.dataset.id,
alt_name = f,
file_name = os.path.join(temp_file_path, f),
- create = True)
+ 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?
shutil.rmtree(temp_file_path)
- except:
+ except Exception, e:
+ log.debug( "Error in collect_associated_files: %s" % ( e ) )
continue
def collect_child_datasets( self, output, job_working_directory ):
"""
@@ -2843,7 +2876,64 @@
return tool_dict
-class DataSourceTool( Tool ):
+ def get_default_history_by_trans( self, trans, create=False ):
+ return trans.get_history( create=create )
+
+
+class OutputParameterJSONTool( Tool ):
+ """
+ Alternate implementation of Tool that provides parameters and other values
+ JSONified within the contents of an output dataset
+ """
+ tool_type = 'output_parameter_json'
+ def _prepare_json_list( self, param_list ):
+ rval = []
+ for value in param_list:
+ if isinstance( value, dict ):
+ rval.append( self._prepare_json_param_dict( value ) )
+ elif isinstance( value, list ):
+ rval.append( self._prepare_json_list( value ) )
+ else:
+ rval.append( str( value ) )
+ return rval
+ def _prepare_json_param_dict( self, param_dict ):
+ rval = {}
+ for key, value in param_dict.iteritems():
+ if isinstance( value, dict ):
+ rval[ key ] = self._prepare_json_param_dict( value )
+ elif isinstance( value, list ):
+ rval[ key ] = self._prepare_json_list( value )
+ else:
+ rval[ key ] = str( value )
+ return rval
+ def exec_before_job( self, app, inp_data, out_data, param_dict=None ):
+ if param_dict is None:
+ param_dict = {}
+ json_params = {}
+ json_params[ 'param_dict' ] = self._prepare_json_param_dict( param_dict ) #it would probably be better to store the original incoming parameters here, instead of the Galaxy modified ones?
+ json_params[ 'output_data' ] = []
+ json_params[ 'job_config' ] = dict( GALAXY_DATATYPES_CONF_FILE=param_dict.get( 'GALAXY_DATATYPES_CONF_FILE' ), GALAXY_ROOT_DIR=param_dict.get( 'GALAXY_ROOT_DIR' ), TOOL_PROVIDED_JOB_METADATA_FILE=jobs.TOOL_PROVIDED_JOB_METADATA_FILE )
+ json_filename = None
+ for i, ( out_name, data ) in enumerate( out_data.iteritems() ):
+ #use wrapped dataset to access certain values
+ wrapped_data = param_dict.get( out_name )
+ #allow multiple files to be created
+ file_name = str( wrapped_data )
+ extra_files_path = str( wrapped_data.files_path )
+ data_dict = dict( out_data_name = out_name,
+ ext = data.ext,
+ dataset_id = data.dataset.id,
+ hda_id = data.id,
+ file_name = file_name,
+ extra_files_path = extra_files_path )
+ json_params[ 'output_data' ].append( data_dict )
+ if json_filename is None:
+ json_filename = file_name
+ out = open( json_filename, 'w' )
+ out.write( simplejson.dumps( json_params ) )
+ out.close()
+
+class DataSourceTool( OutputParameterJSONTool ):
"""
Alternate implementation of Tool for data_source tools -- those that
allow the user to query and extract data from another web site.
@@ -2853,29 +2943,10 @@
def _build_GALAXY_URL_parameter( self ):
return ToolParameter.build( self, ElementTree.XML( '<param name="GALAXY_URL" type="baseurl" value="/tool_runner?tool_id=%s" />' % self.id ) )
def parse_inputs( self, root ):
- Tool.parse_inputs( self, root )
+ super( DataSourceTool, self ).parse_inputs( root )
if 'GALAXY_URL' not in self.inputs:
self.inputs[ 'GALAXY_URL' ] = self._build_GALAXY_URL_parameter()
- def _prepare_datasource_json_list( self, param_list ):
- rval = []
- for value in param_list:
- if isinstance( value, dict ):
- rval.append( self._prepare_datasource_json_param_dict( value ) )
- elif isinstance( value, list ):
- rval.append( self._prepare_datasource_json_list( value ) )
- else:
- rval.append( str( value ) )
- return rval
- def _prepare_datasource_json_param_dict( self, param_dict ):
- rval = {}
- for key, value in param_dict.iteritems():
- if isinstance( value, dict ):
- rval[ key ] = self._prepare_datasource_json_param_dict( value )
- elif isinstance( value, list ):
- rval[ key ] = self._prepare_datasource_json_list( value )
- else:
- rval[ key ] = str( value )
- return rval
+ self.inputs_by_page[0][ 'GALAXY_URL' ] = self.inputs[ 'GALAXY_URL' ]
def exec_before_job( self, app, inp_data, out_data, param_dict=None ):
if param_dict is None:
param_dict = {}
@@ -2885,7 +2956,7 @@
name = param_dict.get( 'name' )
json_params = {}
- json_params[ 'param_dict' ] = self._prepare_datasource_json_param_dict( param_dict ) #it would probably be better to store the original incoming parameters here, instead of the Galaxy modified ones?
+ json_params[ 'param_dict' ] = self._prepare_json_param_dict( param_dict ) #it would probably be better to store the original incoming parameters here, instead of the Galaxy modified ones?
json_params[ 'output_data' ] = []
json_params[ 'job_config' ] = dict( GALAXY_DATATYPES_CONF_FILE=param_dict.get( 'GALAXY_DATATYPES_CONF_FILE' ), GALAXY_ROOT_DIR=param_dict.get( 'GALAXY_ROOT_DIR' ), TOOL_PROVIDED_JOB_METADATA_FILE=jobs.TOOL_PROVIDED_JOB_METADATA_FILE )
json_filename = None
@@ -2976,9 +3047,59 @@
class GenomeIndexTool( Tool ):
tool_type = 'index_genome'
+class DataManagerTool( OutputParameterJSONTool ):
+ tool_type = 'manage_data'
+ default_tool_action = DataManagerToolAction
+
+ def __init__( self, config_file, root, app, guid=None, data_manager_id=None, **kwds ):
+ self.data_manager_id = data_manager_id
+ super( DataManagerTool, self ).__init__( config_file, root, app, guid=guid, **kwds )
+ if self.data_manager_id is None:
+ self.data_manager_id = self.id
+
+ def exec_after_process( self, app, inp_data, out_data, param_dict, job = None, **kwds ):
+ #run original exec_after_process
+ super( DataManagerTool, self ).exec_after_process( app, inp_data, out_data, param_dict, job = job, **kwds )
+ #process results of tool
+ if job and job.state == job.states.ERROR:
+ return
+ data_manager_id = job.data_manager_association.data_manager_id
+ data_manager = self.app.data_managers.get_manager( data_manager_id, None )
+ assert data_manager is not None, "Invalid data manager (%s) requested. It may have been removed before the job completed." % ( data_manager_id )
+ data_manager.process_result( out_data )
+
+ def get_default_history_by_trans( self, trans, create=False ):
+ def _create_data_manager_history( user ):
+ history = trans.app.model.History( name='Data Manager History (automatically created)', user=user )
+ data_manager_association = trans.app.model.DataManagerHistoryAssociation( user=user, history=history )
+ trans.sa_session.add_all( ( history, data_manager_association ) )
+ trans.sa_session.flush()
+ return history
+ user = trans.user
+ assert user, 'You must be logged in to use this tool.'
+ history = user.data_manager_histories
+ if not history:
+ #create
+ if create:
+ history = _create_data_manager_history( user )
+ else:
+ history = None
+ else:
+ for history in reversed( history ):
+ history = history.history
+ if not history.deleted:
+ break
+ if history.deleted:
+ if create:
+ history = _create_data_manager_history( user )
+ else:
+ history = None
+ return history
+
+
# Populate tool_type to ToolClass mappings
tool_types = {}
-for tool_class in [ Tool, DataDestinationTool, SetMetadataTool, DataSourceTool, AsyncDataSourceTool ]:
+for tool_class in [ Tool, DataDestinationTool, SetMetadataTool, DataSourceTool, AsyncDataSourceTool, DataManagerTool ]:
tool_types[ tool_class.tool_type ] = tool_class
# ---- Utility classes to be factored out -----------------------------------
@@ -3020,6 +3141,8 @@
"""
def __nonzero__( self ):
return bool( self.value )
+ def get_display_text( self, quote=True ):
+ return pipes.quote( self.input.value_to_display_text( self.value, self.input.tool.app ) )
class RawObjectWrapper( ToolParameterValueWrapper ):
"""
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 lib/galaxy/tools/actions/__init__.py
--- a/lib/galaxy/tools/actions/__init__.py
+++ b/lib/galaxy/tools/actions/__init__.py
@@ -168,7 +168,7 @@
# Set history.
if not history:
- history = trans.history
+ history = tool.get_default_history_by_trans( trans, create=True )
out_data = odict()
# Collect any input datasets from the incoming parameters
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 lib/galaxy/tools/actions/data_manager.py
--- /dev/null
+++ b/lib/galaxy/tools/actions/data_manager.py
@@ -0,0 +1,17 @@
+from __init__ import DefaultToolAction
+
+import logging
+log = logging.getLogger( __name__ )
+
+class DataManagerToolAction( DefaultToolAction ):
+ """Tool action used for Data Manager Tools"""
+
+ def execute( self, tool, trans, **kwds ):
+ rval = super( DataManagerToolAction, self ).execute( tool, trans, **kwds )
+ if isinstance( rval, tuple ) and len( rval ) == 2 and isinstance( rval[0], trans.app.model.Job ):
+ assoc = trans.app.model.DataManagerJobAssociation( job=rval[0], data_manager_id=tool.data_manager_id )
+ trans.sa_session.add( assoc )
+ trans.sa_session.flush()
+ else:
+ log.error( "Got bad return value from DefaultToolAction.execute(): %s" % ( rval ) )
+ return rval
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 lib/galaxy/tools/data/__init__.py
--- a/lib/galaxy/tools/data/__init__.py
+++ b/lib/galaxy/tools/data/__init__.py
@@ -130,6 +130,8 @@
def __init__( self, config_element, tool_data_path ):
self.name = config_element.get( 'name' )
self.comment_char = config_element.get( 'comment_char' )
+ self.empty_field_value = config_element.get( 'empty_field_value', '' )
+ self.empty_field_values = {}
for file_elem in config_element.findall( 'file' ):
# There should only be one file_elem.
if 'path' in file_elem.attrib:
@@ -139,6 +141,8 @@
self.tool_data_file = None
self.tool_data_path = tool_data_path
self.missing_index_file = None
+ def get_empty_field_by_name( self, name ):
+ return self.empty_field_values.get( name, self.empty_field_value )
class TabularToolDataTable( ToolDataTable ):
"""
@@ -182,6 +186,7 @@
if os.path.exists( filename ):
found = True
all_rows.extend( self.parse_file_fields( open( filename ) ) )
+ self.filename = filename
else:
# Since the path attribute can include a hard-coded path to a specific directory
# (e.g., <file path="tool-data/cg_crr_files.loc" />) which may not be the same value
@@ -193,6 +198,7 @@
if os.path.exists( corrected_filename ):
found = True
all_rows.extend( self.parse_file_fields( open( corrected_filename ) ) )
+ self.filename = corrected_filename
if not found:
self.missing_index_file = filename
log.warn( "Cannot find index file '%s' for tool data table '%s'" % ( filename, self.name ) )
@@ -231,6 +237,9 @@
self.columns[name] = index
if index > self.largest_index:
self.largest_index = index
+ empty_field_value = column_elem.get( 'empty_field_value', None )
+ if empty_field_value is not None:
+ self.empty_field_values[ name ] = empty_field_value
assert 'value' in self.columns, "Required 'value' column missing from column def"
if 'name' not in self.columns:
self.columns['name'] = self.columns['value']
@@ -257,7 +266,20 @@
"'%s' characters must be used to separate fields):\n%s"
% ( ( i + 1 ), self.name, separator_char, line ) )
return rval
-
+
+ def get_column_name_list( self ):
+ rval = []
+ for i in range( self.largest_index + 1 ):
+ found_column = False
+ for name, index in self.columns.iteritems():
+ if index == i:
+ rval.append( name )
+ found_column = True
+ break
+ if not found_column:
+ rval.append( None )
+ return rval
+
def get_entry( self, query_attr, query_val, return_attr ):
"""
Returns table entry associated with a col/val pair.
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 lib/galaxy/tools/data_manager/__init__.py
--- /dev/null
+++ b/lib/galaxy/tools/data_manager/__init__.py
@@ -0,0 +1,3 @@
+"""
+Data Manager
+"""
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 lib/galaxy/tools/data_manager/manager.py
--- /dev/null
+++ b/lib/galaxy/tools/data_manager/manager.py
@@ -0,0 +1,305 @@
+import pkg_resources
+
+pkg_resources.require( "simplejson" )
+
+import os, shutil, errno
+import simplejson
+
+from galaxy import util
+from galaxy.util.odict import odict
+from galaxy.util.template import fill_template
+from galaxy.tools.data import TabularToolDataTable
+
+#set up logger
+import logging
+log = logging.getLogger( __name__ )
+
+SUPPORTED_DATA_TABLE_TYPES = ( TabularToolDataTable )
+
+class DataManagers( object ):
+ def __init__( self, app, xml_filename=None ):
+ self.app = app
+ self.data_managers = odict()
+ self.managed_data_tables = odict()
+ self.tool_path = None
+ self.filename = xml_filename or self.app.config.data_manager_config_file
+ self.load_from_xml( self.filename )
+ if self.app.config.shed_data_manager_config_file:
+ self.load_from_xml( self.app.config.shed_data_manager_config_file, store_tool_path=False )
+ def load_from_xml( self, xml_filename, store_tool_path=True ):
+ try:
+ tree = util.parse_xml( xml_filename )
+ except Exception, e:
+ log.error( 'There was an error parsing your Data Manager config file "%s": %s' % ( xml_filename, e ) )
+ return #we are not able to load any data managers
+ root = tree.getroot()
+ if root.tag != 'data_managers':
+ log.error( 'A data managers configuration must have a "data_managers" tag as the root. "%s" is present' % ( root.tag ) )
+ return
+ if store_tool_path:
+ tool_path = root.get( 'tool_path', None )
+ if tool_path is None:
+ tool_path = self.app.config.tool_path
+ if not tool_path:
+ tool_path = '.'
+ self.tool_path = tool_path
+ for data_manager_elem in root.findall( 'data_manager' ):
+ self.load_manager_from_elem( data_manager_elem )
+ def load_manager_from_elem( self, data_manager_elem, tool_path=None, add_manager=True ):
+ try:
+ data_manager = DataManager( self, data_manager_elem, tool_path=tool_path )
+ except Exception, e:
+ log.error( "Error loading data_manager '%s':\n%s" % ( e, util.xml_to_string( data_manager_elem ) ) )
+ return None
+ if add_manager:
+ self.add_manager( data_manager )
+ log.debug( 'Loaded Data Manager: %s' % ( data_manager.id ) )
+ return data_manager
+ def add_manager( self, data_manager ):
+ assert data_manager.id not in self.data_managers, "A data manager has been defined twice: %s" % ( data_manager.id )
+ self.data_managers[ data_manager.id ] = data_manager
+ for data_table_name in data_manager.data_tables.keys():
+ if data_table_name not in self.managed_data_tables:
+ self.managed_data_tables[ data_table_name ] = []
+ self.managed_data_tables[ data_table_name ].append( data_manager )
+ def get_manager( self, *args, **kwds ):
+ return self.data_managers.get( *args, **kwds )
+ def remove_manager( self, manager_id ):
+ data_manager = self.get_manager( manager_id, None )
+ if data_manager is not None:
+ del self.data_managers[ manager_id ]
+ #remove tool from toolbox
+ if data_manager.tool:
+ self.app.toolbox.remove_tool_by_id( data_manager.tool.id )
+ #determine if any data_tables are no longer tracked
+ for data_table_name in data_manager.data_tables.keys():
+ remove_data_table_tracking = True
+ for other_data_manager in self.data_managers.itervalues():
+ if data_table_name in other_data_manager.data_tables:
+ remove_data_table_tracking = False
+ break
+ if remove_data_table_tracking and data_table_name in self.managed_data_tables:
+ del self.managed_data_tables[ data_table_name ]
+
+class DataManager( object ):
+ def __init__( self, data_managers, elem=None, tool_path=None ):
+ self.data_managers = data_managers
+ self.declared_id = None
+ self.name = None
+ self.description = None
+ self.tool = None
+ self.tool_guid = None
+ self.data_tables = odict()
+ self.output_ref_by_data_table = {}
+ self.move_by_data_table_column = {}
+ self.value_translation_by_data_table_column = {}
+ if elem is not None:
+ self.load_from_element( elem, tool_path or self.data_managers.tool_path )
+ def load_from_element( self, elem, tool_path ):
+ assert elem.tag == 'data_manager', 'A data manager configuration must have a "data_manager" tag as the root. "%s" is present' % ( root.tag )
+ self.declared_id = elem.get( 'id', None )
+ path = elem.get( 'tool_file', None )
+ if path is None:
+ tool_elem = elem.find( 'tool' )
+ assert tool_elem is not None, "Error loading tool for data manager. Make sure that a tool_file attribute or a tool tag set has been defined:\n%s" % ( util.xml_to_string( elem ) )
+ path = tool_elem.get( "file", None )
+ self.tool_guid = tool_elem.get( "guid", None )
+ #use shed_conf_file to determine tool_path
+ shed_conf_file = elem.get( "shed_conf_file", None )
+ if shed_conf_file:
+ shed_conf = self.data_managers.app.toolbox.get_shed_config_dict_by_filename( shed_conf_file, None )
+ if shed_conf:
+ tool_path = shed_conf.get( "tool_path", tool_path )
+ assert path is not None, "A tool file path could not be determined:\n%s" % ( util.xml_to_string( elem ) )
+ self.load_tool( os.path.join( tool_path, path ), guid=self.tool_guid, data_manager_id=self.id )
+ self.name = elem.get( 'name', self.tool.name )
+ self.description = elem.get( 'description', self.tool.description )
+
+ for data_table_elem in elem.findall( 'data_table' ):
+ data_table_name = data_table_elem.get( "name" )
+ assert data_table_name is not None, "A name is required for a data table entry"
+ if data_table_name not in self.data_tables:
+ self.data_tables[ data_table_name ] = odict()#{}
+ output_elem = data_table_elem.find( 'output' )
+ if output_elem is not None:
+ for column_elem in output_elem.findall( 'column' ):
+ column_name = column_elem.get( 'name', None )
+ assert column_name is not None, "Name is required for column entry"
+ data_table_coumn_name = column_elem.get( 'data_table_name', column_name )
+ self.data_tables[ data_table_name ][ data_table_coumn_name ] = column_name
+ output_ref = column_elem.get( 'output_ref', None )
+ if output_ref is not None:
+ if data_table_name not in self.output_ref_by_data_table:
+ self.output_ref_by_data_table[ data_table_name ] = {}
+ self.output_ref_by_data_table[ data_table_name ][ data_table_coumn_name ] = output_ref
+ value_translation_elem = column_elem.find( 'value_translation' )
+ if value_translation_elem is not None:
+ value_translation = value_translation_elem.text
+ else:
+ value_translation = None
+ if value_translation is not None:
+ if data_table_name not in self.value_translation_by_data_table_column:
+ self.value_translation_by_data_table_column[ data_table_name ] = {}
+ self.value_translation_by_data_table_column[ data_table_name ][ data_table_coumn_name ] = value_translation
+
+ for move_elem in column_elem.findall( 'move' ):
+ move_type = move_elem.get( 'type', 'directory' )
+ relativize_symlinks = move_elem.get( 'relativize_symlinks', False ) #TODO: should we instead always relativize links?
+ source_elem = move_elem.find( 'source' )
+ if source_elem is None:
+ source_base = None
+ source_value = ''
+ else:
+ source_base = source_elem.get( 'base', None )
+ source_value = source_elem.text
+ target_elem = move_elem.find( 'target' )
+ if target_elem is None:
+ target_base = None
+ target_value = ''
+ else:
+ target_base = target_elem.get( 'base', None )
+ target_value = target_elem.text
+ if data_table_name not in self.move_by_data_table_column:
+ self.move_by_data_table_column[ data_table_name ] = {}
+ self.move_by_data_table_column[ data_table_name ][ data_table_coumn_name ] = dict( type=move_type, source_base=source_base, source_value=source_value, target_base=target_base, target_value=target_value, relativize_symlinks=relativize_symlinks )
+ @property
+ def id( self ):
+ return self.tool_guid or self.declared_id #if we have a tool with a guid, we will use that as the tool_manager id
+ def load_tool( self, tool_filename, guid=None, data_manager_id=None ):
+ tool = self.data_managers.app.toolbox.load_tool( tool_filename, guid=guid, data_manager_id=data_manager_id )
+ self.data_managers.app.toolbox.data_manager_tools[ tool.id ] = tool
+ self.data_managers.app.toolbox.tools_by_id[ tool.id ] = tool
+ self.tool = tool
+ return tool
+
+ def process_result( self, out_data ):
+ data_manager_dicts = {}
+ data_manager_dict = {}
+ #TODO: fix this merging below
+ for output_name, output_dataset in out_data.iteritems():
+ try:
+ output_dict = simplejson.loads( open( output_dataset.file_name ).read() )
+ except Exception, e:
+ log.warning( 'Error reading DataManagerTool json for "%s": %s' % ( output_name, e ) )
+ continue
+ data_manager_dicts[ output_name ] = output_dict
+ for key, value in output_dict.iteritems():
+ if key not in data_manager_dict:
+ data_manager_dict[ key ] = {}
+ data_manager_dict[ key ].update( value )
+ data_manager_dict.update( output_dict )
+
+ data_tables_dict = data_manager_dict.get( 'data_tables', {} )
+ for data_table_name, data_table_columns in self.data_tables.iteritems():
+ data_table_values = data_tables_dict.pop( data_table_name, None )
+ if not data_table_values:
+ log.warning( 'No values for data table "%s" were returned by the data manager "%s".' % ( data_table_name, self.id ) )
+ continue #next data table
+ data_table = self.data_managers.app.tool_data_tables.get( data_table_name, None )
+ if data_table is None:
+ log.error( 'The data manager "%s" returned an unknown data table "%s" with new entries "%s". These entries will not be created. Please confirm that an entry for "%s" exists in your "%s" file.' % ( self.id, data_table_name, data_table_values, data_table_name, 'tool_data_table_conf.xml' ) )
+ continue #next table name
+ if not isinstance( data_table, SUPPORTED_DATA_TABLE_TYPES ):
+ log.error( 'The data manager "%s" returned an unsupported data table "%s" with type "%s" with new entries "%s". These entries will not be created. Please confirm that the data table is of a supported type (%s).' % ( self.id, data_table_name, type( data_table ), data_table_values, SUPPORTED_DATA_TABLE_TYPES ) )
+ continue #next table name
+ output_ref_values = {}
+ if data_table_name in self.output_ref_by_data_table:
+ for data_table_column, output_ref in self.output_ref_by_data_table[ data_table_name ].iteritems():
+ output_ref_dataset = out_data.get( output_ref, None )
+ assert output_ref_dataset is not None, "Referenced output was not found."
+ output_ref_values[ data_table_column ] = output_ref_dataset
+
+ final_data_table_values = []
+ if not isinstance( data_table_values, list ):
+ data_table_values = [ data_table_values ]
+ columns = data_table.get_column_name_list()
+ #FIXME: Need to lock these files for editing
+ try:
+ data_table_fh = open( data_table.filename, 'r+b' )
+ except IOError, e:
+ log.warning( 'Error opening data table file (%s) with r+b, assuming file does not exist and will open as wb: %s' % ( data_table.filename, e ) )
+ data_table_fh = open( data_table.filename, 'wb' )
+ if os.stat( data_table.filename )[6] != 0:
+ # ensure last existing line ends with new line
+ data_table_fh.seek( -1, 2 ) #last char in file
+ last_char = data_table_fh.read()
+ if last_char not in [ '\n', '\r' ]:
+ data_table_fh.write( '\n' )
+ for data_table_row in data_table_values:
+ data_table_value = dict( **data_table_row ) #keep original values here
+ for name, value in data_table_row.iteritems(): #FIXME: need to loop through here based upon order listed in data_manager config
+ if name in output_ref_values:
+ moved = self.process_move( data_table_name, name, output_ref_values[ name ].extra_files_path, **data_table_value )
+ data_table_value[ name ] = self.process_value_translation( data_table_name, name, **data_table_value )
+ final_data_table_values.append( data_table_value )
+ fields = []
+ for column_name in columns:
+ if column_name is None or column_name not in data_table_value:
+ fields.append( data_table.get_empty_field_by_name( column_name ) )
+ else:
+ fields.append( data_table_value[ column_name ] )
+ #should we add a comment to file about automatically generated value here?
+ data_table_fh.write( "%s\n" % ( data_table.separator.join( self._replace_field_separators( fields, separator=data_table.separator ) ) ) ) #write out fields to disk
+ data_table.data.append( fields ) #add fields to loaded data table
+ data_table_fh.close()
+ for data_table_name, data_table_values in data_tables_dict.iteritems():
+ #tool returned extra data table entries, but data table was not declared in data manager
+ #do not add these values, but do provide messages
+ log.warning( 'The data manager "%s" returned an undeclared data table "%s" with new entries "%s". These entries will not be created. Please confirm that an entry for "%s" exists in your "%s" file.' % ( self.id, data_table_name, data_table_values, data_table_name, self.data_managers.filename ) )
+ def _replace_field_separators( self, fields, separator="\t", replace=None, comment_char=None ):
+ #make sure none of the fields contain separator
+ #make sure separator replace is different from comment_char,
+ #due to possible leading replace
+ if replace is None:
+ if separator == " ":
+ if comment_char == "\t":
+ replace = "_"
+ else:
+ replace = "\t"
+ else:
+ if comment_char == " ":
+ replace = "_"
+ else:
+ replace = " "
+ return map( lambda x: x.replace( separator, replace ), fields )
+ def process_move( self, data_table_name, column_name, source_base_path, relative_symlinks=False, **kwd ):
+ if data_table_name in self.move_by_data_table_column and column_name in self.move_by_data_table_column[ data_table_name ]:
+ move_dict = self.move_by_data_table_column[ data_table_name ][ column_name ]
+ source = move_dict[ 'source_base' ]
+ if source is None:
+ source = source_base_path
+ else:
+ source = fill_template( source, GALAXY_DATA_MANAGER_DATA_PATH=self.data_managers.app.config.galaxy_data_manager_data_path, **kwd )
+ if move_dict[ 'source_value' ]:
+ source = os.path.join( source, fill_template( move_dict[ 'source_value' ], GALAXY_DATA_MANAGER_DATA_PATH=self.data_managers.app.config.galaxy_data_manager_data_path, **kwd ) )
+ target = move_dict[ 'target_base' ]
+ if target is None:
+ target = self.data_managers.app.config.galaxy_data_manager_data_path
+ else:
+ target = fill_template( target, GALAXY_DATA_MANAGER_DATA_PATH=self.data_managers.app.config.galaxy_data_manager_data_path, **kwd )
+ if move_dict[ 'target_value' ]:
+ target = os.path.join( target, fill_template( move_dict[ 'target_value' ], GALAXY_DATA_MANAGER_DATA_PATH=self.data_managers.app.config.galaxy_data_manager_data_path, **kwd ) )
+
+ if move_dict[ 'type' ] == 'file':
+ dirs, filename = os.path.split( target )
+ try:
+ os.makedirs( dirs )
+ except OSError, e:
+ if e.errno != errno.EEXIST:
+ raise e
+ #log.debug( 'Error creating directory "%s": %s' % ( dirs, e ) )
+ #moving a directory and the target already exists, we move the contents instead
+ util.move_merge( source, target )
+
+ if move_dict.get( 'relativize_symlinks', False ):
+ util.relativize_symlinks( target )
+
+ return True
+ return False
+
+ def process_value_translation( self, data_table_name, column_name, **kwd ):
+ value = kwd.get( column_name )
+ if data_table_name in self.value_translation_by_data_table_column and column_name in self.value_translation_by_data_table_column[ data_table_name ]:
+ value_translation = self.value_translation_by_data_table_column[ data_table_name ][ column_name ]
+ value = fill_template( value_translation, GALAXY_DATA_MANAGER_DATA_PATH=self.data_managers.app.config.galaxy_data_manager_data_path, **kwd )
+ return value
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 lib/galaxy/tools/parameters/basic.py
--- a/lib/galaxy/tools/parameters/basic.py
+++ b/lib/galaxy/tools/parameters/basic.py
@@ -880,6 +880,9 @@
>>> print p.filter_value( "hg17" )
hg17
"""
+ def __init__( self, *args, **kwds ):
+ super( GenomeBuildParameter, self ).__init__( *args, **kwds )
+ self.static_options = [ ( value, key, False ) for key, value in util.dbnames ]
def get_options( self, trans, other_values ):
if not trans.history:
yield 'unspecified', '?', False
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 lib/galaxy/util/__init__.py
--- a/lib/galaxy/util/__init__.py
+++ b/lib/galaxy/util/__init__.py
@@ -578,6 +578,22 @@
return curdir
return join( *rel_list )
+def relativize_symlinks( path, start=None, followlinks=False):
+ for root, dirs, files in os.walk( path, followlinks=followlinks ):
+ rel_start = None
+ for file_name in files:
+ symlink_file_name = os.path.join( root, file_name )
+ if os.path.islink( symlink_file_name ):
+ symlink_target = os.readlink( symlink_file_name )
+ if rel_start is None:
+ if start is None:
+ rel_start = root
+ else:
+ rel_start = start
+ rel_path = relpath( symlink_target, rel_start )
+ os.remove( symlink_file_name )
+ os.symlink( rel_path, symlink_file_name )
+
def stringify_dictionary_keys( in_dict ):
#returns a new dictionary
#changes unicode keys into strings, only works on top level (does not recurse)
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 lib/galaxy/util/shed_util.py
--- a/lib/galaxy/util/shed_util.py
+++ b/lib/galaxy/util/shed_util.py
@@ -451,7 +451,7 @@
return elem_list
def generate_tool_panel_dict_for_new_install( tool_dicts, tool_section=None ):
"""
- When installing a repository that contains tools, all tools must curently be defined within the same tool section in the tool
+ When installing a repository that contains tools, all tools must currently be defined within the same tool section in the tool
panel or outside of any sections.
"""
tool_panel_dict = {}
@@ -1168,6 +1168,66 @@
return False
# Default to copying the file if none of the above are true.
return True
+def install_data_managers( app, shed_data_manager_conf_filename, metadata_dict, shed_config_dict, relative_install_dir, repository, repository_tools_tups ):
+ rval = []
+ if 'data_manager' in metadata_dict:
+ repository_tools_by_guid = {}
+ for tool_tup in repository_tools_tups:
+ repository_tools_by_guid[ tool_tup[1] ] = dict( tool_config_filename=tool_tup[0], tool=tool_tup[2] )
+ config_elems = [ elem for elem in util.parse_xml( shed_data_manager_conf_filename ).getroot() ] #load existing data managers
+
+ repo_data_manager_conf_filename = metadata_dict['data_manager'].get( 'config_filename', None )
+ if repo_data_manager_conf_filename is None:
+ log.debug( "No data_manager_conf.xml file has been defined." )
+ return rval
+ relative_repo_data_manager_dir = os.path.join( shed_config_dict.get( 'tool_path', '' ), relative_install_dir )
+ repo_data_manager_conf_filename = os.path.join( relative_repo_data_manager_dir, repo_data_manager_conf_filename )
+ tree = util.parse_xml( repo_data_manager_conf_filename )
+ root = tree.getroot()
+ for elem in root:
+ if elem.tag == 'data_manager':
+ data_manager_id = elem.get( 'id', None )
+ if data_manager_id is None:
+ log.error( "A data manager was defined that does not have an id and will not be installed:\n%s" % ( util.xml_to_string( elem ) ) )
+ continue
+ data_manager_dict = metadata_dict['data_manager'].get( 'data_managers', {} ).get( data_manager_id, None )
+ if data_manager_dict is None:
+ log.error( "Data manager metadata is not defined properly for '%s'." % ( data_manager_id ) )
+ continue
+
+ tool_guid = data_manager_dict.get( 'tool_guid', None )
+ if tool_guid is None:
+ log.error( "Data manager tool guid '%s' is not set in metadata for '%s'." % ( tool_guid, data_manager_id ) )
+ continue
+ tool_dict = repository_tools_by_guid.get( tool_guid, None )
+ if tool_dict is None:
+ log.error( "Data manager tool guid '%s' could not be found for '%s'. Perhaps the tool is invalid?" % ( tool_guid, data_manager_id ) )
+ continue
+ tool = tool_dict.get( 'tool', None )
+ if tool is None:
+ log.error( "Data manager tool with guid '%s' could not be found for '%s'. Perhaps the tool is invalid?" % ( tool_guid, data_manager_id ) )
+ continue
+ tool_config_filename = tool_dict.get( 'tool_config_filename', None )
+ if tool_config_filename is None:
+ log.error( "Data manager metadata is missing 'tool_config_file' for '%s'." % ( data_manager_id ) )
+ continue
+
+ elem.set( 'shed_conf_file', shed_config_dict['config_filename'] )
+ if elem.get( 'tool_file', None ) is not None:
+ del elem.attrib[ 'tool_file' ] #remove old tool_file info
+ tool_elem = suc.generate_tool_elem( repository.tool_shed, repository.name, repository.installed_changeset_revision,
+ repository.owner, tool_config_filename, tool, None )
+ elem.insert( 0, tool_elem )
+ data_manager = app.data_managers.load_manager_from_elem( elem, tool_path=shed_config_dict.get( 'tool_path', '' ) )
+ if data_manager:
+ rval.append( data_manager )
+ else:
+ log.warning( "Encountered unexpected element '%s':\n%s" % ( elem.tag, util.xml_to_string( elem ) ) )
+ config_elems.append( elem )
+ # Persist the altered shed_tool_config file.
+ suc.data_manager_config_elems_to_xml_file( app, config_elems, shed_data_manager_conf_filename )
+ return rval
+
def is_in_repo_info_dicts( repo_info_dict, repo_info_dicts ):
"""Return True if the received repo_info_dict is contained in the list of received repo_info_dicts."""
for name, repo_info_tuple in repo_info_dict.items():
@@ -1447,6 +1507,31 @@
def pull_repository( repo, repository_clone_url, ctx_rev ):
"""Pull changes from a remote repository to a local one."""
commands.pull( suc.get_configured_ui(), repo, source=repository_clone_url, rev=[ ctx_rev ] )
+def remove_from_data_manager( app, repository ):
+ metadata_dict = repository.metadata
+ if metadata_dict and 'data_manager' in metadata_dict:
+ data_manager_tool_guids = [ data_manager_dict.get( 'tool_guid' ) for data_manager_dict in metadata_dict.get( 'data_manager', {} ).get( 'data_managers', {} ).itervalues() if 'tool_guid' in data_manager_dict ]
+ shed_data_manager_conf_filename = app.config.shed_data_manager_config_file
+ tree = util.parse_xml( shed_data_manager_conf_filename )
+ root = tree.getroot()
+ assert root.tag == 'data_managers', 'The file provided (%s) for removing data managers from is not a valid data manager xml file.' % ( shed_data_manager_conf_filename )
+ config_elems = []
+ for elem in root:
+ keep_elem = True
+ if elem.tag == 'data_manager':
+ tool_elem = elem.find( 'tool' )
+ if tool_elem is not None:
+ tool_guid = tool_elem.get( 'guid', None )
+ if tool_guid in data_manager_tool_guids:
+ keep_elem = False
+ if keep_elem:
+ config_elems.append( elem )
+ #remove data manager from in memory
+ for data_manager_tool_guids in data_manager_tool_guids:
+ #for shed-based data managers, the data_manager id is the same as the tool guid
+ app.data_managers.remove_manager( data_manager_tool_guids )
+ # Persist the altered shed_tool_config file.
+ suc.data_manager_config_elems_to_xml_file( app, config_elems, shed_data_manager_conf_filename )
def remove_from_shed_tool_config( trans, shed_tool_conf_dict, guids_to_remove ):
# A tool shed repository is being uninstalled so change the shed_tool_conf file. Parse the config file to generate the entire list
# of config_elems instead of using the in-memory list since it will be a subset of the entire list if one or more repositories have
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 lib/galaxy/util/shed_util_common.py
--- a/lib/galaxy/util/shed_util_common.py
+++ b/lib/galaxy/util/shed_util_common.py
@@ -30,6 +30,7 @@
log = logging.getLogger( __name__ )
INITIAL_CHANGELOG_HASH = '000000000000'
+REPOSITORY_DATA_MANAGER_CONFIG_FILENAME = "data_manager_conf.xml"
# Characters that must be html escaped
MAPPED_CHARS = { '>' :'>',
'<' :'<',
@@ -37,9 +38,10 @@
'&' : '&',
'\'' : ''' }
MAX_CONTENT_SIZE = 32768
-NOT_TOOL_CONFIGS = [ 'datatypes_conf.xml', 'repository_dependencies.xml', 'tool_dependencies.xml' ]
+NOT_TOOL_CONFIGS = [ 'datatypes_conf.xml', 'repository_dependencies.xml', 'tool_dependencies.xml', REPOSITORY_DATA_MANAGER_CONFIG_FILENAME ]
GALAXY_ADMIN_TOOL_SHED_CONTROLLER = 'GALAXY_ADMIN_TOOL_SHED_CONTROLLER'
TOOL_SHED_ADMIN_CONTROLLER = 'TOOL_SHED_ADMIN_CONTROLLER'
+TOOL_TYPES_NOT_IN_TOOL_PANEL = [ 'manage_data' ]
VALID_CHARS = set( string.letters + string.digits + "'\"-=_.()/+*^,:?!#[]%\\$@;{}" )
new_repo_email_alert_template = """
@@ -981,6 +983,14 @@
repository_dependencies,
tool_dependencies )
return repo_info_dict
+def data_manager_config_elems_to_xml_file( app, config_elems, config_filename ):#, shed_tool_conf_filename ):
+ # Persist the current in-memory list of config_elems to a file named by the value of config_filename.
+ fh = open( config_filename, 'wb' )
+ fh.write( '<?xml version="1.0"?>\n<data_managers>\n' )#% ( shed_tool_conf_filename ))
+ for elem in config_elems:
+ fh.write( util.xml_to_string( elem, pretty=True ) )
+ fh.write( '</data_managers>\n' )
+ fh.close()
def ensure_required_repositories_exist_for_reinstall( trans, repository_dependencies ):
"""
Inspect the received repository_dependencies dictionary and make sure tool_shed_repository objects exist in the database for each entry. These
@@ -1008,6 +1018,64 @@
return '%s://%s%s/repos/%s/%s' % ( protocol, username, base, repository.user.username, repository.name )
else:
return '%s/repos/%s/%s' % ( base_url, repository.user.username, repository.name )
+def generate_data_manager_metadata( app, repository, repo_dir, data_manager_config_filename, metadata_dict, shed_config_dict=None ):
+ """Update the received metadata_dict with information from the parsed data_manager_config_filename."""
+ if data_manager_config_filename is None:
+ return metadata_dict
+ try:
+ tree = util.parse_xml( data_manager_config_filename )
+ except Exception, e:
+ log.error( 'There was an error parsing your Data Manager config file "%s": %s' % ( data_manager_config_filename, e ) )
+ return metadata_dict #we are not able to load any data managers
+ tool_path = None
+ if shed_config_dict:
+ tool_path = shed_config_dict.get( 'tool_path', None )
+ tools = {}
+ for tool in metadata_dict.get( 'tools', [] ):
+ tool_conf_name = tool['tool_config']
+ if tool_path:
+ tool_conf_name = os.path.join( tool_path, tool_conf_name )
+ tools[tool_conf_name] = tool
+ repo_path = repository.repo_path( app )
+ try:
+ repo_files_directory = repository.repo_files_directory( app )
+ repo_dir = repo_files_directory
+ except AttributeError:
+ repo_files_directory = repo_path
+ relative_data_manager_dir = util.relpath( os.path.split( data_manager_config_filename )[0], repo_dir )
+ rel_data_manager_config_filename = os.path.join( relative_data_manager_dir, os.path.split( data_manager_config_filename )[1] )
+ data_managers = {}
+ data_manager_metadata = { 'config_filename': rel_data_manager_config_filename, 'data_managers': data_managers }#'tool_config_files': tool_files }
+ metadata_dict[ 'data_manager' ] = data_manager_metadata
+ root = tree.getroot()
+ data_manager_tool_path = root.get( 'tool_path', None )
+ if data_manager_tool_path:
+ relative_data_manager_dir = os.path.join( relative_data_manager_dir, data_manager_tool_path )
+ for data_manager_elem in root.findall( 'data_manager' ):
+ tool_file = data_manager_elem.get( 'tool_file', None )
+ data_manager_id = data_manager_elem.get( 'id', None )
+ if data_manager_id is None:
+ log.error( 'Data Manager entry is missing id attribute in "%s".' % ( data_manager_config_filename ) )
+ continue
+ data_tables = []
+ if tool_file is None:
+ log.error( 'Data Manager entry is missing tool_file attribute in "%s".' % ( data_manager_config_filename ) )
+ else:
+ for data_table_elem in data_manager_elem.findall( 'data_table' ):
+ data_table_name = data_table_elem.get( 'name', None )
+ if data_table_name is None:
+ log.error( 'Data Manager data_table entry is name attribute in "%s".' % ( data_manager_config_filename ) )
+ else:
+ data_tables.append( data_table_name )
+ data_manager_metadata_tool_file = os.path.join( relative_data_manager_dir, tool_file )
+ tool_metadata_tool_file = os.path.join( repo_files_directory, data_manager_metadata_tool_file )
+ tool = tools.get( tool_metadata_tool_file, None )
+ if tool is None:
+ log.error( "Unable to determine tools metadata for '%s'." % ( data_manager_metadata_tool_file ) )
+ continue
+ data_managers[ data_manager_id ] = { 'tool_config_file': data_manager_metadata_tool_file, 'data_tables': data_tables, 'tool_guid': tool['guid'] }
+ log.debug( 'Loaded Data Manager tool_files: %s' % ( tool_file ) )
+ return metadata_dict
def generate_datatypes_metadata( datatypes_config, metadata_dict ):
"""Update the received metadata_dict with information from the parsed datatypes_config."""
tree = ElementTree.parse( datatypes_config )
@@ -1252,6 +1320,9 @@
exported_workflow_dict = json.from_json_string( workflow_text )
if 'a_galaxy_workflow' in exported_workflow_dict and exported_workflow_dict[ 'a_galaxy_workflow' ] == 'true':
metadata_dict = generate_workflow_metadata( relative_path, exported_workflow_dict, metadata_dict )
+ # Handle any data manager entries
+ metadata_dict = generate_data_manager_metadata( app, repository, files_dir, get_config_from_disk( REPOSITORY_DATA_MANAGER_CONFIG_FILENAME, files_dir ), metadata_dict, shed_config_dict=shed_config_dict )
+
if readme_files:
metadata_dict[ 'readme_files' ] = readme_files
# This step must be done after metadata for tools has been defined.
@@ -1531,6 +1602,7 @@
description=tool.description,
version_string_cmd = tool.version_string_cmd,
tool_config=tool_config,
+ tool_type=tool.tool_type,
requirements=tool_requirements,
tests=tool_tests )
if 'tools' in metadata_dict:
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
--- a/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
+++ b/lib/galaxy/webapps/galaxy/controllers/admin_toolshed.py
@@ -507,6 +507,8 @@
if tool_shed_repository.includes_tools:
# Handle tool panel alterations.
shed_util.remove_from_tool_panel( trans, tool_shed_repository, shed_tool_conf, uninstall=remove_from_disk_checked )
+ if tool_shed_repository.includes_data_managers:
+ shed_util.remove_from_data_manager( trans.app, tool_shed_repository )
if tool_shed_repository.includes_datatypes:
# Deactivate proprietary datatypes.
installed_repository_dict = shed_util.load_installed_datatypes( trans.app, tool_shed_repository, repository_install_dir, deactivate=True )
@@ -701,6 +703,9 @@
shed_tool_conf=shed_tool_conf,
tool_panel_dict=tool_panel_dict,
new_install=True )
+ if 'data_manager' in metadata_dict:
+ rval = shed_util.install_data_managers( trans.app, trans.app.config.shed_data_manager_config_file, metadata_dict, shed_config_dict, relative_install_dir,
+ tool_shed_repository, repository_tools_tups )
if 'datatypes' in metadata_dict:
tool_shed_repository.status = trans.model.ToolShedRepository.installation_status.LOADING_PROPRIETARY_DATATYPES
if not tool_shed_repository.includes_datatypes:
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 lib/galaxy/webapps/galaxy/controllers/tool_runner.py
--- a/lib/galaxy/webapps/galaxy/controllers/tool_runner.py
+++ b/lib/galaxy/webapps/galaxy/controllers/tool_runner.py
@@ -89,7 +89,7 @@
tool.input_translator.translate( params )
# We may be visiting Galaxy for the first time ( e.g., sending data from UCSC ),
# so make sure to create a new history if we've never had one before.
- history = trans.get_history( create=True )
+ history = tool.get_default_history_by_trans( trans, create=True )
template, vars = tool.handle_input( trans, params.__dict__ )
if len( params ) > 0:
trans.log_event( "Tool params: %s" % ( str( params ) ), tool_id=tool_id )
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 run.sh
--- a/run.sh
+++ b/run.sh
@@ -16,6 +16,8 @@
shed_tool_data_table_conf.xml.sample
tool_data_table_conf.xml.sample
tool_sheds_conf.xml.sample
+ data_manager_conf.xml.sample
+ shed_data_manager_conf.xml.sample
openid_conf.xml.sample
universe_wsgi.ini.sample
tool-data/shared/ncbi/builds.txt.sample
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 shed_data_manager_conf.xml.sample
--- /dev/null
+++ b/shed_data_manager_conf.xml.sample
@@ -0,0 +1,3 @@
+<?xml version="1.0"?>
+<data_managers>
+</data_managers>
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 templates/webapps/galaxy/admin/index.mako
--- a/templates/webapps/galaxy/admin/index.mako
+++ b/templates/webapps/galaxy/admin/index.mako
@@ -59,6 +59,7 @@
%if trans.app.config.enable_beta_job_managers:
<div class="toolTitle"><a href="${h.url_for( controller='data_admin', action='manage_data' )}" target="galaxy_main">Manage local data</a></div>
%endif
+ <div class="toolTitle"><a href="${h.url_for( controller='data_manager' )}" target="galaxy_main">Manage local data (beta)</a></div></div></div><div class="toolSectionPad"></div>
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 templates/webapps/galaxy/data_manager/index.mako
--- /dev/null
+++ b/templates/webapps/galaxy/data_manager/index.mako
@@ -0,0 +1,57 @@
+<%inherit file="/base.mako"/>
+<%namespace file="/message.mako" import="render_msg" />
+
+<%def name="title()">Data Manager</%def>
+
+%if message:
+ ${render_msg( message, status )}
+%endif
+
+<h2>Data Manager</h2>
+
+%if view_only:
+ <p>Not implemented</p>
+%else:
+ <p>Choose your data managing option from below.</p>
+ <ul>
+ <li><strong>Access data managers</strong> - get data, build indexes, etc
+ <p/>
+ <ul>
+ %for data_manager_id, data_manager in data_managers.data_managers.iteritems():
+ <li>
+ <a href="${ h.url_for( 'tool_runner?tool_id=%s' % ( data_manager.tool.id ) ) }"><strong>${ data_manager.name | h }</strong></a> - ${ data_manager.description | h }
+ </li>
+ <p/>
+ %endfor
+ </ul>
+ </li>
+ <p/>
+ <li><strong>View managed data by manager</strong>
+ <p/>
+ <ul>
+ %for data_manager_id, data_manager in data_managers.data_managers.iteritems():
+ <li>
+ <a href="${h.url_for( controller='data_manager', action='manage_data_manager', id=data_manager_id)}" target="galaxy_main"><strong>${ data_manager.name | h }</strong></a> - ${ data_manager.description | h }</a>
+ </li>
+ <p/>
+ %endfor
+ </ul>
+ </li>
+ <p/>
+ <p/>
+ <li><strong>View managed data by Tool Data Table</strong>
+ <p/>
+ <ul>
+ %for table_name, managers in data_managers.managed_data_tables.iteritems():
+ <li>
+ <a href="${h.url_for( controller='data_manager', action='manage_data_table', table_name=table_name)}" target="galaxy_main"><strong>${ table_name | h }</strong></a>
+ </li>
+ <p/>
+ %endfor
+ </ul>
+ </li>
+ <p/>
+ </ul>
+ <p/>
+ <br/>
+%endif
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 templates/webapps/galaxy/data_manager/manage_data_manager.mako
--- /dev/null
+++ b/templates/webapps/galaxy/data_manager/manage_data_manager.mako
@@ -0,0 +1,50 @@
+<%inherit file="/base.mako"/>
+<%namespace file="/message.mako" import="render_msg" />
+
+<%def name="title()">Data Manager: ${ data_manager.name | h } - ${ data_manager.description | h }</%def>
+
+%if message:
+ ${render_msg( message, status )}
+%endif
+
+<h2>Data Manager: ${ data_manager.name | h } - ${ data_manager.description | h }</h2>
+
+%if view_only:
+ <p>Not implemented</p>
+%else:
+ <p>Access managed data by job</p>
+
+%if jobs:
+<form name="jobs" action="${h.url_for()}" method="POST">
+ <table class="manage-table colored" border="0" cellspacing="0" cellpadding="0" width="100%">
+ <tr class="header">
+ <td>Job ID</td>
+ <td>User</td>
+ <td>Last Update</td>
+ <td>State</td>
+ <td>Command Line</td>
+ <td>Job Runner</td>
+ <td>PID/Cluster ID</td>
+ </tr>
+ %for job in jobs:
+ <td><a href="${ h.url_for( controller="data_manager", action="view_job", id=trans.security.encode_id( job.id ) ) }">${ job.id | h }</a></td>
+ %if job.history and job.history.user:
+ <td>${job.history.user.email | h}</td>
+ %else:
+ <td>anonymous</td>
+ %endif
+ <td>${job.update_time | h}</td>
+ <td>${job.state | h}</td>
+ <td>${job.command_line | h}</td>
+ <td>${job.job_runner_name | h}</td>
+ <td>${job.job_runner_external_id | h}</td>
+ </tr>
+ %endfor
+ </table>
+ <p/>
+</form>
+%else:
+ <div class="infomessage">There are no jobs for this data manager.</div>
+%endif
+
+%endif
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 templates/webapps/galaxy/data_manager/manage_data_table.mako
--- /dev/null
+++ b/templates/webapps/galaxy/data_manager/manage_data_table.mako
@@ -0,0 +1,36 @@
+<%inherit file="/base.mako"/>
+<%namespace file="/message.mako" import="render_msg" />
+
+<%def name="title()">Data Table Manager: ${ data_table.name | h }</%def>
+
+%if message:
+ ${render_msg( message, status )}
+%endif
+
+%if view_only:
+ <p>Not implemented</p>
+%else:
+<% column_name_list = data_table.get_column_name_list() %>
+<table class="tabletip">
+ <thead>
+ <tr><th colspan="${len (column_name_list) }" style="font-size: 120%;">
+ Data Manager: ${ data_table.name | h }
+ </th></tr>
+ <tr>
+
+ %for name in column_name_list:
+ <th>${name | h}</th>
+ %endfor
+ </tr>
+ </thead>
+ <tbody>
+ %for table_row in data_table.data:
+ <tr>
+ %for field in table_row:
+ <td>${field | h}</td>
+ %endfor
+ </tr>
+ %endfor
+</table>
+
+%endif
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 templates/webapps/galaxy/data_manager/view_job.mako
--- /dev/null
+++ b/templates/webapps/galaxy/data_manager/view_job.mako
@@ -0,0 +1,57 @@
+<%inherit file="/base.mako"/>
+<%namespace file="/message.mako" import="render_msg" />
+<% from galaxy.util import nice_size %>
+
+<%def name="title()">Data Manager: ${ data_manager.name | h } - ${ data_manager.description | h }</%def>
+
+%if message:
+ ${render_msg( message, status )}
+%endif
+
+%if view_only:
+ <p>Not implemented</p>
+%else:
+%for i, hda in enumerate( hdas ):
+<table class="tabletip">
+ <thead>
+ <tr><th colspan="2" style="font-size: 120%;">
+ Data Manager: ${ data_manager.name | h } - ${ data_manager.description | h }
+ </th></tr>
+ </thead>
+ <tbody>
+ <tr><td>Name:</td><td>${hda.name | h}</td></tr>
+ <tr><td>Created:</td><td>${hda.create_time.strftime("%b %d, %Y")}</td></tr>
+ <tr><td>Filesize:</td><td>${nice_size(hda.dataset.file_size)}</td></tr>
+ <tr><td>Tool Exit Code:</td><td>${job.exit_code | h}</td></tr>
+ <tr><td>Full Path:</td><td>${hda.file_name | h}</td></tr>
+ <tr><td>View complete info:</td><td><a href="${h.url_for( controller='dataset', action='show_params', dataset_id=trans.security.encode_id( hda.id ))}">${ hda.id | h }</a></td></tr>
+
+</table>
+<br />
+
+<% json_tables = data_manager_output[i]%>
+%for table_name, json_table in json_tables:
+<table class="tabletip">
+ <thead>
+ <tr><th colspan="2" style="font-size: 120%;">
+ Data Table: ${ table_name | h }
+ </th></tr>
+ </thead>
+ <% len_json_table = len( json_table ) %>
+ %for j, table_row in enumerate( json_table ):
+ <tbody>
+ %if len_json_table > 1:
+ <tr><td><strong>Entry #${j}</strong></td><td></td></tr>
+ %endif
+ %for name, value in table_row.iteritems():
+ <tr><td>${name | h}:</td><td>${value | h}</td></tr>
+ %endfor
+ %endfor
+ </tbody>
+</table>
+<br />
+%endfor
+
+%endfor
+
+%endif
diff -r db08c095de0c249f3a6cde62f254c104de1fb6ea -r 138642a8dc55689a3cab1d070aac72b293265bc9 universe_wsgi.ini.sample
--- a/universe_wsgi.ini.sample
+++ b/universe_wsgi.ini.sample
@@ -573,6 +573,16 @@
# Details" option in the history. Administrators can always see this.
#expose_dataset_path = False
+# Data manager configuration options
+# Allow non-admin users to view available Data Manager options
+#enable_data_manager_user_view = False
+# File where Data Managers are configured
+#data_manager_config_file = data_manager_conf.xml
+# File where Tool Shed based Data Managers are configured
+#shed_data_manager_config_file = shed_data_manager_conf.xml
+# Directory to store Data Manager based tool-data; defaults to tool_data_path
+#galaxy_data_manager_data_path = tool-data
+
# -- Job Execution
# To increase performance of job execution and the web interface, you can
Repository URL: https://bitbucket.org/galaxy/galaxy-central/
--
This is a commit notification from bitbucket.org. You are receiving
this because you have the service enabled, addressing the recipient of
this email.
1
0