sequenceserver 0.8.7 → 0.8.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/sequenceserver/helpers.rb +2 -2
- data/public/sequence.html +28 -0
- data/public/sequence.min.js +1 -0
- data/sequenceserver.gemspec +1 -1
- metadata +5 -6
- data/lib/profile_code.rb +0 -217
- data/tests/test_ui.rb~ +0 -104
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 631b0671719d8700180eb7987e01f0a951b68cfa
|
4
|
+
data.tar.gz: 028caff7b7edae94848eaba84dfd48ac5c6f5f81
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c1064444047ef36dc19d357bb7ad639a7dd4d4786ff4dee1da8d631dbdacd5bf00530a530d8bb9ba2887616535978f13a1ff1ad7a20974594a3e9dec3bcb99b5
|
7
|
+
data.tar.gz: a1379fe0d72402dc1c76ee8197c7ce1faa2a01e4e5c899cff5679c641b2788f419cbdbe4cbcaa305387ea6c292abb8d5bf285f0244551fc2f8ec64e98959271e
|
@@ -73,8 +73,8 @@ module SequenceServer
|
|
73
73
|
choice = gets.chomp[0,1].downcase
|
74
74
|
|
75
75
|
unless choice == 'n'
|
76
|
-
database_formatter = File.join(settings.root, 'database_formatter.rb')
|
77
|
-
|
76
|
+
database_formatter = File.join(settings.root, 'lib', 'sequenceserver', 'database_formatter.rb')
|
77
|
+
require database_formatter
|
78
78
|
retry
|
79
79
|
else
|
80
80
|
raise # let the caller decide what to do if database discovery fails
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<!doctype html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<script type="text/javascript" src="js/jquery.js"></script>
|
6
|
+
<script type="text/javascript" src="sequence.min.js"></script>
|
7
|
+
<script>
|
8
|
+
window.onload = function() {
|
9
|
+
var theSequence = "METLCQRLNVCQDKILTHYENDSTDLRDHIDYWKHMRLECAIYYKAREMGFKHINHQVVPTLAVSKNKALQAIELQLTLETIYNSQYSNEKWTLQDVSLEVYLTAPTGCIKKHGYTVEVQFDGDICNTMHYTNWTHIYICEEAojs SVTVVEGQVDYYGLYYVHEGIRTYFVQFKDDAEKYSKNKVWEVHAGGQVILCPTSVFSSNEVSSPEIIRQHLANHPAATHTKAVALGTEETQTTIQRPRSEPDTGNPCHTTKLLHRDSVDSAPILTAFNSSHKGRINCNSNTTPIVHLKGDANTLKCLRYRFKKHCTLYTAVSSTWHWTGHNVKHKSAIVTLTYDSEWQRDQFLSQVKIPKTITVSTGFMSI";
|
10
|
+
|
11
|
+
mySequence = new Sequence({
|
12
|
+
sequence : theSequence,
|
13
|
+
target : "holder",
|
14
|
+
format : 'CODATA',
|
15
|
+
formatOptions : {
|
16
|
+
title:false,
|
17
|
+
footer:false
|
18
|
+
},
|
19
|
+
id : 'P918283'
|
20
|
+
});
|
21
|
+
};
|
22
|
+
</script>
|
23
|
+
|
24
|
+
</head>
|
25
|
+
<body>
|
26
|
+
<div id="holder" />
|
27
|
+
</body>
|
28
|
+
</html>
|
@@ -0,0 +1 @@
|
|
1
|
+
!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.oo=t()}}(function(){var t;return function e(t,n,o){function i(s,a){if(!n[s]){if(!t[s]){var c="function"==typeof require&&require;if(!a&&c)return c(s,!0);if(r)return r(s,!0);var h=new Error("Cannot find module '"+s+"'");throw h.code="MODULE_NOT_FOUND",h}var l=n[s]={exports:{}};t[s][0].call(l.exports,function(e){var n=t[s][1][e];return i(n?n:e)},l,l.exports,e,t,n,o)}return n[s].exports}for(var r="function"==typeof require&&require,s=0;s<o.length;s++)i(o[s]);return i}({1:[function(t,e){$.browser=t("jquery-browser-plugin");var n=t("js-class"),r="onSelectionChange",s="onSelectionChanged",c="onAnnotationClicked";Sequence=n({constructor:function(t){var e=this;this.opt=jQuery.extend(this.opt,t),this._container=jQuery("#"+this.opt.target),this._container.ready(function(){e._initialize()})},opt:{sequence:"",id:"",target:"",format:"FASTA",selection:{start:0,end:0},columns:{size:35,spacedEach:10},highlights:[],annotations:[],sequenceUrl:"http://www.ebi.ac.uk/das-srv/uniprot/das/uniprot/sequence",selectionColor:"Yellow",selectionFontColor:"black",highlightFontColor:"red",highlightBackgroundColor:"white",fontFamily:'"Andale mono", courier, monospace',fontSize:"12px",fontColor:"inherit",backgroundColor:"inherit",width:void 0,height:void 0,formatSelectorVisible:!0},eventTypes:["onSelectionChanged","onSelectionChange","onAnnotationClicked"],getId:function(){return this.opt.id},_headerDiv:null,_contentDiv:null,_initialize:function(){void 0!==this.opt.width&&this._container.width(this.opt.width),void 0!==this.opt.height&&this._container.height(this.opt.height),this._container.css({"-moz-user-select":"none","-webkit-user-select":"none","user-select":"none"}),this._buildFormatSelector(),this._contentDiv=jQuery("<div></div>").appendTo(this._container),this._contentDiv.css({"font-family":this.opt.fontFamily,"font-size":this.opt.fontSize,"text-align":"left"}),this._highlights=this.opt.highlights,this._annotations=this.opt.annotations,jQuery('<div id="sequenceTip'+this.opt.target.id+'"></div>').css({position:"absolute","z-index":"999999",color:"#fff","font-size":"12px",width:"auto",display:"none"}).addClass("tooltip").appendTo("body").hide(),this.opt.sequence?this._redraw():this.opt.id?this._requestSequence(this.opt.id):this.clearSequence("No sequence available","../biojs/css/images/warning_icon.png")},setSequence:function(t,e){t.match(/^([A-N,R-Z][0-9][A-Z][A-Z, 0-9][A-Z, 0-9][0-9])|([O,P,Q][0-9][A-Z, 0-9][A-Z, 0-9][A-Z, 0-9][0-9])(\.\d+)?$/i)?this._requestSequence(arguments[0]):(this.opt.sequence=t,this.opt.id=e,this._highlights=[],this._highlightsCount=0,this.opt.selection={start:0,end:0},this._annotations=[],this._contentDiv.children().remove(),this._redraw())},_requestSequence:function(t){var e=this;console.log("Requesting sequence for: "+t),jQuery.ajax({url:e.opt.sequenceUrl,dataType:"xml",data:{segment:t},success:function(t){try{var n=jQuery(t).find("SEQUENCE:first");e.setSequence(n.text(),n.attr("id"),n.attr("label"))}catch(o){console.log("Error decoding response data: "+o.message),e.clearSequence("No sequence available","../biojs/css/images/warning_icon.png")}},error:function(t,n){console.log("Error decoding response data: "+n),e.clearSequence("Error requesting the sequence to the server "+this.url,"../biojs/css/images/warning_icon.png")}})},clearSequence:function(t,e){var n=void 0;this.opt.sequence="",this.opt.id="",this._highlights=[],this._highlightsCount=0,this.opt.selection={start:0,end:0},this._annotations=[],this._contentDiv.children().remove(),this._headerDiv.hide(),void 0!==t&&(n=jQuery("<div>"+t+"</div>").appendTo(this._contentDiv).addClass("message"),void 0!==e&&n.css({background:'transparent url("'+e+'") no-repeat center left',"padding-left":"20px"}))},setSelection:function(t,e){if(t>e){var n=e;e=t,t=n}(t!=this.opt.selection.start||e!=this.opt.selection.end)&&(this._setSelection(t,e),this.trigger(s,{start:t,end:e}))},_buildFormatSelector:function(){var t=this;this._headerDiv=jQuery("<div></div>").appendTo(this._container),this._headerDiv.css({"font-family":'"Heveltica Neue", Arial, "sans serif"',"font-size":"14px"}).append("Format: "),this._formatSelector=jQuery('<select> <option value="FASTA">FASTA</option><option value="CODATA">CODATA</option><option value="PRIDE">PRIDE</option><option value="RAW">RAW</option></select>').appendTo(t._headerDiv),this._formatSelector.change(function(){t.opt.format=jQuery(this).val(),t._redraw()}),this._formatSelector.val(t.opt.format),this.formatSelectorVisible(this.opt.formatSelectorVisible)},highlight:function(t,e,n,o,i){return this.addHighlight({start:t,end:e,color:n,background:o,id:i})},addHighlight:function(t){var e="-1",n="",o="",i={};return t instanceof Object&&t.start<=t.end&&(n="string"==typeof t.color?t.color:this.opt.highlightFontColor,o="string"==typeof t.background?t.background:this.opt.highlightBackgroundColor,e="string"==typeof t.id?t.id:new Number(this._highlightsCount++).toString(),i={start:t.start,end:t.end,color:n,background:o,id:e},this._highlights.push(i),this._applyHighlight(i),this._restoreSelection(t.start,t.end)),e},_applyHighlight:function(t){for(var e=this._contentDiv.find(".sequence"),n=t.start-1;n<t.end;n++)zindex=jQuery(e[n]).css("z-index"),"auto"==zindex?(z=1,o=1):(z=0,o=.5),jQuery(e[n]).css({color:t.color,"background-color":t.background,"z-index":z,opacity:o}).addClass("highlighted")},_applyHighlights:function(t){for(var e in t)this._applyHighlight(t[e])},_restoreHighlights:function(t,e){var n=this._highlights;this._applyHighlight({start:t,end:e,color:this.opt.fontColor,background:this.opt.backgroundColor});for(var o in n)n[o].start>e||n[o].end<t||(a=n[o].start<t?t:n[o].start,b=n[o].end>e?e:n[o].end,this._applyHighlight({start:a,end:b,color:n[o].color,background:n[o].background}))},_restoreSelection:function(t,e){var n=this.opt.selection;t>n.end||e<n.start||(a=t<n.start?n.start:t,b=e>n.end?n.end:e,this._applyHighlight({start:a,end:b,color:this.opt.selectionFontColor,background:this.opt.selectionColor}))},unHighlight:function(t){this.removeHighlight(t)},removeHighlight:function(t){var e=this._highlights;for(i in e)if(e[i].id==t){start=e[i].start,end=e[i].end,e.splice(i,1),this._restoreHighlights(start,end),this._restoreSelection(start,end);break}},unHighlightAll:function(){this.removeAllHighlights()},removeAllHighlights:function(){this._highlights=[],this._restoreHighlights(1,this.opt.sequence.length),this._restoreSelection(1,this.opt.sequence.length)},setFormat:function(t){this.opt.format!=t.toUpperCase()&&(this.opt.format=t.toUpperCase(),this._redraw());var e=this;this._headerDiv.find("option").each(function(){jQuery(this).val()==e.opt.format.toUpperCase()&&jQuery(this).attr("selected","selected")})},setNumCols:function(t){this.opt.columns.size=t,this._redraw()},formatSelectorVisible:function(t){t?this._headerDiv.show():this._headerDiv.hide()},showFormatSelector:function(){this._headerDiv.show()},hideFormatSelector:function(){this._headerDiv.hide()},hide:function(){this._headerDiv.hide(),this._contentDiv.hide()},show:function(){this._headerDiv.show(),this._contentDiv.show()},_setSelection:function(t,e){var n=this.opt.selection,o={};n.start==t?n.end<e?(o.start=n.end,o.end=e):this._restoreHighlights(e+1,n.end):n.end==e?n.start>t?(o.start=t,o.end=n.start):this._restoreHighlights(n.start,t-1):(this._restoreHighlights(n.start,n.end),o.start=t,o.end=e),n.start=t,n.end=e,void 0!=o.start&&this._applyHighlight({start:o.start,end:o.end,color:this.opt.selectionFontColor,background:this.opt.selectionColor})},_repaintSelection:function(){var t=this.opt.selection;this._setSelection(0,0),this._setSelection(t.start,t.end)},_redraw:function(){this._contentDiv.children().remove(),"RAW"==this.opt.format?this._drawRaw():"CODATA"==this.opt.format?this._drawCodata():"FASTA"==this.opt.format?this._drawFasta():(this.opt.format="PRIDE",this._drawPride()),this._applyHighlights(this._highlights),this._repaintSelection(),this._addSpanEvents()},_drawFasta:function(){var t=this.opt.sequence.toUpperCase().split(""),e=jQuery("<pre></pre>").appendTo(this._contentDiv),n=">"+this.opt.id+" "+t.length+" bp<br/>",o=this.opt.columns.size;this.opt.sequence.length<this.opt.columns.size&&(o=this.opt.sequence.length);var i={numCols:o,numColsForSpace:0};n+=this._drawSequence(t,i),e.html(n),this._drawAnnotations(i)},_drawCodata:function(){var t=this.opt.sequence.toUpperCase().split(""),e=jQuery('<pre style="white-space:pre"></pre>').appendTo(this._contentDiv),n="ENTRY "+this.opt.id+"<br/>";n+="SEQUENCE<br/>",void 0!==this.opt.formatOptions&&void 0!==this.opt.formatOptions.title&&0==this.opt.formatOptions.title&&(n="");var o=this.opt.columns.size;this.opt.sequence.length<this.opt.columns.size&&(o=this.opt.sequence.length);var i={numLeft:!0,numLeftSize:7,numLeftPad:" ",numTop:!0,numTopEach:5,numCols:o,numColsForSpace:0,spaceBetweenChars:!0};n+=this._drawSequence(t,i);var r="<br/>///";void 0!==this.opt.formatOptions&&void 0!==this.opt.formatOptions.footer&&0==this.opt.formatOptions.footer&&(r=""),n+=r,e.html(n),this._drawAnnotations(i)},_drawAnnotations:function(t){var e=this,n=this.opt.sequence.toLowerCase().split(""),o=this._annotations,i="",r="",s="";t.numLeft&&(i+=this._formatIndex(" ",t.numLeftSize+2," "));for(var a=0;a<n.length;a+=t.numCols){r="";for(var h in o)o[h].id=this.getId()+"_"+h,s=this._getHTMLRowAnnot(a+1,o[h],t),s.length>0&&(r+="<br/>",r+=i,r+=s,r+="<br/>");var l=t.numCols,u=n.length-a;l>u&&(l=u),jQuery(r).insertAfter(t.numRight?"div#"+e.opt.target+" div pre span#numRight_"+this.getId()+"_"+(a+l):"div#"+e.opt.target+" div pre span#"+this.getId()+"_"+(a+l))}jQuery(this._contentDiv).find(".annotation").each(function(){e._addToolTip(this,function(){return e._getAnnotationString(jQuery(this).attr("id"))}),jQuery(this).mouseover(function(t){jQuery(".annotation."+jQuery(t.target).attr("id")).each(function(){jQuery(this).css("background-color",jQuery(this).attr("color"))})}).mouseout(function(){jQuery(".annotation").css("background-color","transparent")}).click(function(t){for(var n=void 0,o=jQuery(t.target).attr("id"),i=0;i<e._annotations.length;i++)e._annotations[i].id!=o||(n=e._annotations[i].name);e.trigger(c,{name:n})})})},_getAnnotationString:function(t){var e=this._annotations[t.substr(t.indexOf("_")+1)];return e.name+"<br/>"+(e.html?e.html:"")},_getHTMLRowAnnot:function(t,e,n){for(var o="border-left:1px solid; border-bottom:1px solid; border-color:",i="border-bottom:1px solid; border-color:",r="border-bottom:1px solid; border-right:1px solid; border-color:",s="border-left:1px solid; border-right:1px solid; border-bottom:1px solid; border-color:",a=[],c=t+n.numCols,h=n.spaceBetweenChars?" ":"",l=e.color,u=e.id,p=t;c>p;p++)for(var d in e.regions)region=e.regions[d],spaceAfter="",spaceAfter+=p%n.numColsForSpace==0?" ":"",spaceAfter+=h,color=region.color?region.color:l,data='class="annotation '+u+'" id="'+u+'" color="'+color+'" pos="'+p+'"',p==region.start&&p==region.end?(a[p]='<span style="'+s+color+'" '+data+"> ",a[p]+=spaceAfter,a[p]+="</span>"):p==region.start?(a[p]='<span style="'+o+color+'" '+data+"> ",a[p]+=spaceAfter,a[p]+="</span>"):p==region.end?(a[p]='<span style="'+r+color+' " '+data+"> ",a[p]+="</span>"):p>region.start&&p<region.end?(a[p]='<span style="'+i+color+'" '+data+"> ",a[p]+=spaceAfter,a[p]+="</span>"):a[p]||(a[p]=" ",a[p]+=spaceAfter);var f=a.join("");return-1==f.indexOf("span")?"":f},_drawRaw:function(){var t=this.opt.sequence.toLowerCase().split(""),e=jQuery("<pre></pre>").appendTo(this._contentDiv),n=this.opt.columns.size;this.opt.sequence.length<this.opt.columns.size&&(n=this.opt.sequence.length);var o={numCols:n};e.html(this._drawSequence(t,o)),this._drawAnnotations(o)},_drawPride:function(){var t=this,e=this.opt.sequence.toUpperCase().split(""),n=jQuery("<pre></pre>").appendTo(this._contentDiv),o=this.opt.columns.size;this.opt.sequence.length<this.opt.columns.size&&(o=this.opt.sequence.length),opt={numLeft:!0,numLeftSize:5,numLeftPad:"0",numRight:!0,numRightSize:5,numRightPad:"0",numCols:o,numColsForSpace:t.opt.columns.spacedEach},n.html(this._drawSequence(e,opt)),this._drawAnnotations(opt)},_drawSequence:function(t,e){var n="",o="white-space: pre;";if(e.numTop){n+='<span style="'+o+'" class="numTop">';var i=e.spaceBetweenChars?2*e.numTopEach:e.numTopEach;e.numLeft&&(n+=this._formatIndex(" ",e.numLeftSize," ")),n+=this._formatIndex(" ",i," ");for(var r=e.numTopEach;r<e.numCols;r+=e.numTopEach)n+=this._formatIndex(r,i," ",!0);n+="</span><br/>"}e.numLeft&&(n+=this._formatIndex(1,e.numLeftSize,e.numLeftPad),n+=" ");for(var s=1,a=1;a<=t.length;a++)if(a%e.numCols==0){n+='<span class="sequence" id="'+this.getId()+"_"+a+'">'+t[a-1]+"</span>",e.numRight&&(n+='<span style="'+o+'" id="numRight_'+this.getId()+"_"+a+'">',n+=" ",n+=this._formatIndex(a,e.numRightSize,e.numRightPad),n+="</span>"),n+="<br/>";var c=t.length-a;e.numLeft&&c>0&&(n+='<span id="numLeft_'+this.getId()+"_"+a+'">',n+=this._formatIndex(a+1,e.numLeftSize,e.numLeftPad),n+=" ",n+="</span>"),s=1}else n+='<span class="sequence" style="'+o+'" id="'+this.getId()+"_"+a+'">'+t[a-1],n+=s%e.numColsForSpace==0?" ":"",n+=e.spaceBetweenChars?" ":"",n+="</span>",s++;return n+="<br/>",jQuery.browser.msie&&(n="<pre>"+n+"</pre>"),n},_formatIndex:function(t,e,n,o){var i=t.toString(),r="",s=e-i.length;if(s>0){for(;s-->0;)r+="<span>"+n+"</span>";i=o?t+r:r+t}return i},_addSpanEvents:function(){var t,e=this,n=!1;e._contentDiv.find(".sequence").each(function(){jQuery(this).mousedown(function(){var o=jQuery(this).attr("id");t=parseInt(o.substr(o.indexOf("_")+1)),clickPos=t,e._setSelection(clickPos,t),n=!0,e.trigger(r,{start:e.opt.selection.start,end:e.opt.selection.end})}).mouseover(function(){var o=jQuery(this).attr("id");t=parseInt(o.substr(o.indexOf("_")+1)),n&&(t>clickPos?e._setSelection(clickPos,t):e._setSelection(t,clickPos),e.trigger(r,{start:e.opt.selection.start,end:e.opt.selection.end}))}).mouseup(function(){n=!1,e.trigger(s,{start:e.opt.selection.start,end:e.opt.selection.end})}),e._addToolTip.call(e,this,function(){return n?"["+e.opt.selection.start+", "+e.opt.selection.end+"]":t})}).css("cursor","pointer")},_addToolTip:function(t,e){var n="#sequenceTip"+this.getId();jQuery(t).mouseover(function(o){var i=jQuery(o.target).offset();jQuery(n).is(":visible")||jQuery(n).css({"background-color":"#000",padding:"3px 10px 3px 10px",top:i.top+jQuery(o.target).height()+"px",left:i.left+jQuery(o.target).width()+"px"}).animate({opacity:"0.85"},10).html(e.call(t)).show()}).mouseout(function(){jQuery(n).hide()})},setAnnotation:function(t){this.addAnnotation(t)},addAnnotation:function(t){this._annotations.push(t),this._redraw()},removeAnnotation:function(t){for(var e=0;e<this._annotations.length;e++)if(t!=this._annotations[e].name){this._annotations.splice(e,1),this._redraw();break}},removeAllAnnotations:function(){this._annotations=[],this._redraw()}}),t("biojs-events").mixin(Sequence.prototype),e.exports=Sequence},{"biojs-events":2,"jquery-browser-plugin":5,"js-class":7}],2:[function(t,e){var n=t("backbone-events-standalone");n.onAll=function(t,e){return this.on("all",t,e),this},n.oldMixin=n.mixin,n.mixin=function(t){n.oldMixin(t);for(var e=["onAll"],o=0;o<e.length;o++){var i=e[o];t[i]=this[i]}return t},e.exports=n},{"backbone-events-standalone":4}],3:[function(e,n,o){!function(){function e(){return{keys:Object.keys||function(t){if("object"!=typeof t&&"function"!=typeof t||null===t)throw new TypeError("keys() called on a non-object");var e,n=[];for(e in t)t.hasOwnProperty(e)&&(n[n.length]=e);return n},uniqueId:function(t){var e=++l+"";return t?t+e:e},has:function(t,e){return c.call(t,e)},each:function(t,e,n){if(null!=t)if(a&&t.forEach===a)t.forEach(e,n);else if(t.length===+t.length){for(var o=0,i=t.length;i>o;o++)if(e.call(n,t[o],o,t)===s)return}else for(var r in t)if(this.has(t,r)&&e.call(n,t[r],r,t)===s)return},once:function(t){var e,n=!1;return function(){return n?e:(n=!0,e=t.apply(this,arguments),t=null,e)}}}}var i,r=this,s={},a=Array.prototype.forEach,c=Object.prototype.hasOwnProperty,h=Array.prototype.slice,l=0,u=e();i={on:function(t,e,n){if(!d(this,"on",t,[e,n])||!e)return this;this._events||(this._events={});var o=this._events[t]||(this._events[t]=[]);return o.push({callback:e,context:n,ctx:n||this}),this},once:function(t,e,n){if(!d(this,"once",t,[e,n])||!e)return this;var o=this,i=u.once(function(){o.off(t,i),e.apply(this,arguments)});return i._callback=e,this.on(t,i,n)},off:function(t,e,n){var o,i,r,s,a,c,h,l;if(!this._events||!d(this,"off",t,[e,n]))return this;if(!t&&!e&&!n)return this._events={},this;for(s=t?[t]:u.keys(this._events),a=0,c=s.length;c>a;a++)if(t=s[a],r=this._events[t]){if(this._events[t]=o=[],e||n)for(h=0,l=r.length;l>h;h++)i=r[h],(e&&e!==i.callback&&e!==i.callback._callback||n&&n!==i.context)&&o.push(i);o.length||delete this._events[t]}return this},trigger:function(t){if(!this._events)return this;var e=h.call(arguments,1);if(!d(this,"trigger",t,e))return this;var n=this._events[t],o=this._events.all;return n&&f(n,e),o&&f(o,arguments),this},stopListening:function(t,e,n){var o=this._listeners;if(!o)return this;var i=!e&&!n;"object"==typeof e&&(n=this),t&&((o={})[t._listenerId]=t);for(var r in o)o[r].off(e,n,this),i&&delete this._listeners[r];return this}};var p=/\s+/,d=function(t,e,n,o){if(!n)return!0;if("object"==typeof n){for(var i in n)t[e].apply(t,[i,n[i]].concat(o));return!1}if(p.test(n)){for(var r=n.split(p),s=0,a=r.length;a>s;s++)t[e].apply(t,[r[s]].concat(o));return!1}return!0},f=function(t,e){var n,o=-1,i=t.length,r=e[0],s=e[1],a=e[2];switch(e.length){case 0:for(;++o<i;)(n=t[o]).callback.call(n.ctx);return;case 1:for(;++o<i;)(n=t[o]).callback.call(n.ctx,r);return;case 2:for(;++o<i;)(n=t[o]).callback.call(n.ctx,r,s);return;case 3:for(;++o<i;)(n=t[o]).callback.call(n.ctx,r,s,a);return;default:for(;++o<i;)(n=t[o]).callback.apply(n.ctx,e)}},g={listenTo:"on",listenToOnce:"once"};u.each(g,function(t,e){i[e]=function(e,n,o){var i=this._listeners||(this._listeners={}),r=e._listenerId||(e._listenerId=u.uniqueId("l"));return i[r]=e,"object"==typeof n&&(o=this),e[t](n,o,this),this}}),i.bind=i.on,i.unbind=i.off,i.mixin=function(t){var e=["on","once","off","trigger","stopListening","listenTo","listenToOnce","bind","unbind"];return u.each(e,function(e){t[e]=this[e]},this),t},"function"==typeof t?t(function(){return i}):"undefined"!=typeof o?("undefined"!=typeof n&&n.exports&&(o=n.exports=i),o.BackboneEvents=i):r.BackboneEvents=i}(this)},{}],4:[function(t,e){e.exports=t("./backbone-events-standalone")},{"./backbone-events-standalone":3}],5:[function(t,e){e.exports=t("./jquery.browser")},{"./jquery.browser":6}],6:[function(t,e){var n,o,i=function(t){t=t.toLowerCase();var e=/(opr)[\/]([\w.]+)/.exec(t)||/(chrome)[ \/]([\w.]+)/.exec(t)||/(version)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(t)||/(webkit)[ \/]([\w.]+)/.exec(t)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(t)||/(msie) ([\w.]+)/.exec(t)||t.indexOf("trident")>=0&&/(rv)(?::| )([\w.]+)/.exec(t)||t.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(t)||[],n=/(ipad)/.exec(t)||/(iphone)/.exec(t)||/(android)/.exec(t)||/(windows phone)/.exec(t)||/(win)/.exec(t)||/(mac)/.exec(t)||/(linux)/.exec(t)||/(cros)/i.exec(t)||[];return{browser:e[3]||e[1]||"",version:e[2]||"0",platform:n[0]||""}};if(n=i(window.navigator.userAgent),o={},o.uaMatch=i,n.browser&&(o[n.browser]=!0,o.version=n.version,o.versionNumber=parseInt(n.version)),n.platform&&(o[n.platform]=!0),(o.android||o.ipad||o.iphone||o["windows phone"])&&(o.mobile=!0),(o.cros||o.mac||o.linux||o.win)&&(o.desktop=!0),(o.chrome||o.opr||o.safari)&&(o.webkit=!0),o.rv){var r="msie";n.browser=r,o[r]=!0}if(o.opr){var s="opera";n.browser=s,o[s]=!0}if(o.safari&&o.android){var a="android";n.browser=a,o[a]=!0}o.name=n.browser,o.platform=n.platform,e.exports=o},{}],7:[function(t,e){(function(t){function n(t,e,n){for(;e&&e!==Object.prototype&&(Object.getOwnPropertyNames(e).forEach(function(n){if(".class"!=n&&!t.hasOwnProperty(n)){var o=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,o)}}),!n);)e=e.__proto__;return t}function o(t,e){for(;t;){if(t.type.prototype===e.prototype)return!0;for(var n in t.implements){var i=t.implements[n],r=i[".class.meta"];if(r){if(o(r,e))return!0}else for(var s=i.prototype;s;s=s.__proto__)if(s===e.prototype)return!0}t=t.base?t.base[".class.meta"]:void 0}return!1}var i=function(t,e,n){"function"!=typeof t&&(n=e,e=t,t=Object),e||(e={}),n||(n={});var o={name:n.name,base:t,"implements":[]},r=i.clone(e);n.implements&&(Array.isArray(n.implements)?n.implements:[n.implements]).forEach(function(t){"function"==typeof t&&t.prototype&&(o.implements.push(t),i.extend(r,t.prototype))}),r.__proto__=t.prototype;var s=function(){"function"==typeof this.constructor&&this.constructor.apply(this,arguments)};return o.type=s,s.prototype=r,Object.defineProperty(s,".class.meta",{value:o,enumerable:!1,configurable:!1,writable:!1}),Object.defineProperty(r,".class",{value:s,enumerable:!1,configurable:!1,writable:!1}),n.statics&&i.extend(s,n.statics),s};i.extend=n,i.clone=function(t){return n({},t)};var r=i({constructor:function(t){this.object=t},typeOf:function(t){if(this.object instanceof t)return!0;var e=i.typeInfo(this.object);return e&&o(e,t)}});r.prototype.a=r.prototype.typeOf,r.prototype.an=r.prototype.typeOf,i.is=function(t){return new r(t)},i.typeInfo=function(t){var e=t.__proto__[".class"];return e?e[".class.meta"]:void 0},i.VERSION=[0,0,2],e?e.exports=i:t.Class=i}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],"biojs-vis-sequence":[function(t,e){e.exports=t("./lib/index")},{"./lib/index":1}]},{},["biojs-vis-sequence"])("biojs-vis-sequence")});
|
data/sequenceserver.gemspec
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sequenceserver
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.8.
|
4
|
+
version: 0.8.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Anurag Priyam
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2014-
|
13
|
+
date: 2014-12-09 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: bundler
|
@@ -111,7 +111,6 @@ files:
|
|
111
111
|
- bin/sequenceserver
|
112
112
|
- config.ru
|
113
113
|
- example.config.yml
|
114
|
-
- lib/profile_code.rb
|
115
114
|
- lib/sequenceserver.rb
|
116
115
|
- lib/sequenceserver/blast.rb
|
117
116
|
- lib/sequenceserver/customisation.rb
|
@@ -140,6 +139,8 @@ files:
|
|
140
139
|
- public/js/sequenceserver.blast.js
|
141
140
|
- public/js/sequenceserver.js
|
142
141
|
- public/js/store.min.js
|
142
|
+
- public/sequence.html
|
143
|
+
- public/sequence.min.js
|
143
144
|
- sequenceserver.gemspec
|
144
145
|
- tests/database/nucleotide/Sinvicta2-2-3.cdna.subset.fasta
|
145
146
|
- tests/database/nucleotide/Sinvicta2-2-3.cdna.subset.fasta.nhr
|
@@ -153,7 +154,6 @@ files:
|
|
153
154
|
- tests/test_sequencehelpers.rb
|
154
155
|
- tests/test_sequenceserver_blast.rb
|
155
156
|
- tests/test_ui.rb
|
156
|
-
- tests/test_ui.rb~
|
157
157
|
- tests/ui.specs.todo
|
158
158
|
- views/500.erb
|
159
159
|
- views/_options.erb
|
@@ -190,9 +190,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
190
190
|
version: '0'
|
191
191
|
requirements: []
|
192
192
|
rubyforge_project:
|
193
|
-
rubygems_version: 2.2
|
193
|
+
rubygems_version: 2.4.2
|
194
194
|
signing_key:
|
195
195
|
specification_version: 4
|
196
196
|
summary: BLAST search made easy!
|
197
197
|
test_files: []
|
198
|
-
has_rdoc:
|
data/lib/profile_code.rb
DELETED
@@ -1,217 +0,0 @@
|
|
1
|
-
require 'ruby-prof'
|
2
|
-
|
3
|
-
$:.unshift '.'
|
4
|
-
|
5
|
-
#require 'sinatra/base'
|
6
|
-
require 'yaml'
|
7
|
-
require 'logger'
|
8
|
-
require 'fileutils'
|
9
|
-
require 'sequenceserver/helpers'
|
10
|
-
require 'sequenceserver/blast'
|
11
|
-
require 'sequenceserver/sequencehelpers'
|
12
|
-
require 'sequenceserver/sinatralikeloggerformatter'
|
13
|
-
require 'sequenceserver/customisation'
|
14
|
-
require 'sequenceserver/version'
|
15
|
-
|
16
|
-
require 'sequenceserver'
|
17
|
-
|
18
|
-
|
19
|
-
query = '>1111883
|
20
|
-
GCTGGCGGCGTGCCTAACACATGTAAGTCGAACGGGACTGGGGGCAACTCCAGTTCAGTG
|
21
|
-
GCAGACGGGTGCGTAACACGTGAGCAACTTGTCCGACGGCGGGGGATAGCCGGCCCAACG
|
22
|
-
GCCGGGTAATACCGCGTACGCTCGTTTAGGGACATCCCTGAATGAGGAAAGCCGTAAGGC
|
23
|
-
ACCGACGGAGAGGCTCGCGGCCTATCAGCTAGTTGGCGGGGTAACGGCCCACCAAGGCGA
|
24
|
-
CGACGGGTAGCTGGTCTGAGAGGATGGCCAGCCACATTGGGACTGAGACACGGCCCAGAC
|
25
|
-
TCCTACGGGAGGCAGCAGTGGGGAATCTTGCGCAATGGCCGCAAGGCTGACGCAGCGACG
|
26
|
-
CCGCGTGTGGGATGACGGCCTTCGGGTTGTAAACCACTGTCGGGAGGAACGAATACTCGG
|
27
|
-
CTAGTCCGAGGGTGACGGTACCTCCAAAGGAAGCACCGGCTAACTCCGTGCCAGCAGCCG
|
28
|
-
CGGTAATACGGAGGGTGCGAGCGTTGTCCGGAATCACTGGGCGTAAAGGGCGCGTAGGTG
|
29
|
-
GCCCGTTAAGTGGCTGGTGAAATCCCGGGGCTCAACTCCGGGGCTGCCGGTCAGACTGGC
|
30
|
-
GAGCTAGAGCACGGTAGGGGCAGATGGAATTCCCGGTGTAGCGGTGGAATGCGTAGATAT
|
31
|
-
CGGGAAGAATACCAGTGGCGAAGGCGTTCTGCTGGGCCGTTGCTGACACTGAGGCGCGAC
|
32
|
-
AGCGTGGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGGACACT
|
33
|
-
AGACGTCGGGGGGAGCGACCCTCCCGGTGTCGTCGCTAACGCAGTAAGTGTCCCGCCTGG
|
34
|
-
GGAGTACGGCCGCAAGGCTGAAACTCAAAGGAATTGACGGGGGCCCGCACAAGCGGTGGA
|
35
|
-
GCATGTGGTTTAATTCGAAGCAACGCGAAGAACCTTACCTGGGCTTGACATGCTGGTGCA
|
36
|
-
AGCCGGTGGAAACATCGGCCCCTCTTCGGAGCGCCAGCACAGGTGCTGCATGGCTGTCGT
|
37
|
-
CAGCTCGTGTCGTGAGATGTTGGGTTAAGTCCCGCAACGAGCGCAACTCTCGCTCCCAGT
|
38
|
-
TGCCAGCGGTTCGGCCGGGGACTCTGGGGGGACTGCCGGCGTTAAGCCGGAGGAAGGTGG
|
39
|
-
GGACGACGTCAAGTCATCATGGCCCTTACGTCCAGGGCGACACACGTGCTACAATGCCTG
|
40
|
-
GTACAGCGCGTCGCGAACTCGCAAGAGGGAGCCAATCGCCAAAAGCCGGGCTAAGTTCGG
|
41
|
-
ATTGTCGTCTGCAACTCGACGGCATGAAGCCGGAATCGCTAGTAATCGCGGATCAGCCAC
|
42
|
-
GCCGCGGTGAATACGTTCCCGGGCCTTGTACACACCGCCCGTCACGCCATGGAAGCCGGA
|
43
|
-
GGGACCCGAAACCGGTGGGCCAACCGCAAGGGGGCAGCCGTCTAAGGT'
|
44
|
-
|
45
|
-
#blastn -db '/home/ben/git/sequenceserver/db/97_otus.fasta' -query '/tmp/sequenceserver_query20140119-10926-qt2ecp' -task blastn -num_threads 1 -html
|
46
|
-
method = 'blastn'#params['method']
|
47
|
-
databases = ['/home/ben/git/sequenceserver/db/97_otus.fasta']#params[:databases]
|
48
|
-
sequence = query #params[:sequence]
|
49
|
-
advanced_opts = '-max_target_seqs 1'#params['advanced']
|
50
|
-
|
51
|
-
# evaluate empty sequence as nil, otherwise as fasta
|
52
|
-
# sequence = sequence.empty? ? nil : to_fasta(sequence)
|
53
|
-
|
54
|
-
# blastn implies blastn, not megablast; but let's not interfere if a user
|
55
|
-
# specifies `task` herself
|
56
|
-
if method == 'blastn' and not advanced_opts =~ /task/
|
57
|
-
#advanced_opts << ' -task blastn '
|
58
|
-
end
|
59
|
-
|
60
|
-
|
61
|
-
# run blast and log
|
62
|
-
blast = SequenceServer::Blast.new(method, sequence, databases.join(' '), advanced_opts)
|
63
|
-
blast.run!
|
64
|
-
puts('Ran: ' + blast.command)
|
65
|
-
|
66
|
-
|
67
|
-
def format_blast_results(result, databases)
|
68
|
-
formatted_result = ''
|
69
|
-
@all_retrievable_ids = []
|
70
|
-
string_of_used_databases = databases.join(' ')
|
71
|
-
blast_database_number = 0
|
72
|
-
line_number = 0
|
73
|
-
started_query = false
|
74
|
-
finished_database_summary = false
|
75
|
-
finished_alignments = false
|
76
|
-
reference_string = ''
|
77
|
-
database_summary_string = ''
|
78
|
-
result.each do |line|
|
79
|
-
line_number += 1
|
80
|
-
next if line_number <= 5 #skip the first 5 lines
|
81
|
-
|
82
|
-
# Add the reference to the end, not the start, of the blast result
|
83
|
-
if line_number >= 7 and line_number <= 15
|
84
|
-
reference_string += line
|
85
|
-
next
|
86
|
-
end
|
87
|
-
|
88
|
-
if !finished_database_summary and line_number > 15
|
89
|
-
database_summary_string += line
|
90
|
-
finished_database_summary = true if line.match(/total letters/)
|
91
|
-
next
|
92
|
-
end
|
93
|
-
|
94
|
-
# Remove certain lines from the output
|
95
|
-
skipped_lines = [/^<\/BODY>/,/^<\/HTML>/,/^<\/PRE>/]
|
96
|
-
skip = false
|
97
|
-
skipped_lines.each do |skippy|
|
98
|
-
# $stderr.puts "`#{line}' matches #{skippy}?"
|
99
|
-
if skippy.match(line)
|
100
|
-
skip = true
|
101
|
-
# $stderr.puts 'yes'
|
102
|
-
else
|
103
|
-
# $stderr.puts 'no'
|
104
|
-
end
|
105
|
-
end
|
106
|
-
next if skip
|
107
|
-
|
108
|
-
# Remove the javascript inclusion
|
109
|
-
line.gsub!(/^<script src=\"blastResult.js\"><\/script>/, '')
|
110
|
-
|
111
|
-
if line.match(/^>/) # If line to possibly replace
|
112
|
-
# Reposition the anchor to the end of the line, so that it both still works and
|
113
|
-
# doesn't interfere with the diagnostic space at the beginning of the line.
|
114
|
-
#
|
115
|
-
# There are two cases:
|
116
|
-
#
|
117
|
-
# database formatted _with_ -parse_seqids
|
118
|
-
line.gsub!(/^>(.+)(<a.*><\/a>)(.*)/, '>\1\3\2')
|
119
|
-
#
|
120
|
-
# database formatted _without_ -parse_seqids
|
121
|
-
line.gsub!(/^>(<a.*><\/a>)(.*)/, '>\2\1')
|
122
|
-
|
123
|
-
# get hit coordinates -- useful for linking to genome browsers
|
124
|
-
hit_length = result[line_number..-1].index{|l| l =~ />lcl|Lambda/}
|
125
|
-
hit_coordinates = result[line_number, hit_length].grep(/Sbjct/).
|
126
|
-
map(&:split).map{|l| [l[1], l[-1]]}.flatten.map(&:to_i).minmax
|
127
|
-
|
128
|
-
# Create the hyperlink (if required)
|
129
|
-
formatted_result += construct_sequence_hyperlink_line(line, databases, hit_coordinates)
|
130
|
-
else
|
131
|
-
# Surround each query's result in <div> tags so they can be coloured by CSS
|
132
|
-
if matches = line.match(/^<b>Query=<\/b> (.*)/) # If starting a new query, then surround in new <div> tag, and finish the last one off
|
133
|
-
line = "<div class=\"resultn\" id=\"#{matches[1]}\">\n<h3>Query= #{matches[1]}</h3><pre>"
|
134
|
-
unless blast_database_number == 0
|
135
|
-
line = "</pre></div>\n#{line}"
|
136
|
-
end
|
137
|
-
blast_database_number += 1
|
138
|
-
elsif line.match(/^ Database: /) and !finished_alignments
|
139
|
-
formatted_result += "</div>\n<pre>#{database_summary_string}\n\n"
|
140
|
-
finished_alignments = true
|
141
|
-
end
|
142
|
-
formatted_result += line
|
143
|
-
end
|
144
|
-
end
|
145
|
-
formatted_result << "</pre>"
|
146
|
-
|
147
|
-
link_to_fasta_of_all = "/get_sequence/?id=#{@all_retrievable_ids.join(' ')}&db=#{string_of_used_databases}"
|
148
|
-
# #dbs must be sep by ' '
|
149
|
-
retrieval_text = @all_retrievable_ids.empty? ? '' : "<a href='#{url(link_to_fasta_of_all)}'>FASTA of #{@all_retrievable_ids.length} retrievable hit(s)</a>"
|
150
|
-
|
151
|
-
"<h2>Results</h2>"+
|
152
|
-
retrieval_text +
|
153
|
-
"<br/><br/>" +
|
154
|
-
formatted_result +
|
155
|
-
"<br/>" +
|
156
|
-
"<pre>#{reference_string.strip}</pre>"
|
157
|
-
end
|
158
|
-
|
159
|
-
def construct_sequence_hyperlink_line(line, databases, hit_coordinates)
|
160
|
-
matches = line.match(/^>(.+)/)
|
161
|
-
sequence_id = matches[1]
|
162
|
-
|
163
|
-
link = nil
|
164
|
-
|
165
|
-
# If a custom sequence hyperlink method has been defined,
|
166
|
-
# use that.
|
167
|
-
options = {
|
168
|
-
:sequence_id => sequence_id,
|
169
|
-
:databases => databases,
|
170
|
-
:hit_coordinates => hit_coordinates
|
171
|
-
}
|
172
|
-
|
173
|
-
# First precedence: construct the whole line to be customised
|
174
|
-
if self.respond_to?(:construct_custom_sequence_hyperlinking_line)
|
175
|
-
settings.log.debug("Using custom hyperlinking line creator with sequence #{options.inspect}")
|
176
|
-
link_line = construct_custom_sequence_hyperlinking_line(options)
|
177
|
-
unless link_line.nil?
|
178
|
-
return link_line
|
179
|
-
end
|
180
|
-
end
|
181
|
-
|
182
|
-
# If we have reached here, custom construction of the
|
183
|
-
# whole line either wasn't defined, or returned nil
|
184
|
-
# (indicating failure)
|
185
|
-
if self.respond_to?(:construct_custom_sequence_hyperlink)
|
186
|
-
# settings.log.debug("Using custom hyperlink creator with sequence #{options.inspect}")
|
187
|
-
link = construct_custom_sequence_hyperlink(options)
|
188
|
-
else
|
189
|
-
# settings.log.debug("Using standard hyperlink creator with sequence `#{options.inspect}'")
|
190
|
-
link = construct_standard_sequence_hyperlink(options)
|
191
|
-
end
|
192
|
-
|
193
|
-
# Return the BLAST output line with the link in it
|
194
|
-
if link.nil?
|
195
|
-
# settings.log.debug('No link added link for: `'+ sequence_id +'\'')
|
196
|
-
return line
|
197
|
-
else
|
198
|
-
settings.log.debug('Added link for: `'+ sequence_id +'\''+ link)
|
199
|
-
return "><a href='#{url(link)}' target='_blank'>#{sequence_id}</a> \n"
|
200
|
-
end
|
201
|
-
|
202
|
-
end
|
203
|
-
|
204
|
-
# Advanced options are specified by the user. Here they are checked for interference with SequenceServer operations.
|
205
|
-
# raise ArgumentError if an error has occurred, otherwise return without value
|
206
|
-
def validate_advanced_parameters(advanced_options)
|
207
|
-
raise ArgumentError, "Invalid characters detected in the advanced options" unless advanced_options =~ /\A[a-z0-9\-_\. ']*\Z/i
|
208
|
-
disallowed_options = %w(-out -html -outfmt -db -query)
|
209
|
-
disallowed_options.each do |o|
|
210
|
-
raise ArgumentError, "The advanced BLAST option \"#{o}\" is used internally by SequenceServer and so cannot be specified by the you" if advanced_options =~ /#{o}/i
|
211
|
-
end
|
212
|
-
end
|
213
|
-
|
214
|
-
puts format_blast_results(blast.result, databases)
|
215
|
-
|
216
|
-
|
217
|
-
|
data/tests/test_ui.rb~
DELETED
@@ -1,104 +0,0 @@
|
|
1
|
-
require 'rspec'
|
2
|
-
require 'watir-webdriver'
|
3
|
-
require 'headless'
|
4
|
-
|
5
|
-
# These shared examples should work for
|
6
|
-
shared_examples_for 'a browser' do
|
7
|
-
let(:seqserv_url){'http://localhost:4567'}
|
8
|
-
|
9
|
-
it 'should simply go the seqserv webpage' do
|
10
|
-
b.goto seqserv_url
|
11
|
-
b.url.gsub(/\/$/,'').should eq(seqserv_url)
|
12
|
-
b.ready_state.should eq('complete')
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'should do a simple blastp' do
|
16
|
-
b.goto seqserv_url
|
17
|
-
|
18
|
-
# Nucleotide database should be available
|
19
|
-
b.checkbox(:value => 'e205221dd32dc53ebfc9fb48cbdecd9e').enabled?.should eq(true)
|
20
|
-
|
21
|
-
# First up the blast button should be disabled
|
22
|
-
b.button(:id => 'method').text.should eq('BLAST')
|
23
|
-
b.button(:id => 'method').enabled?.should eq(false)
|
24
|
-
|
25
|
-
# Pick a protein blast database
|
26
|
-
b.checkbox(:value => '6669b1c88665158621afc06407ce88ea').set
|
27
|
-
b.checkbox(:value => '6669b1c88665158621afc06407ce88ea').checked?.should eq(true)
|
28
|
-
|
29
|
-
# nuc dbs now disabled
|
30
|
-
b.checkbox(:value => 'e205221dd32dc53ebfc9fb48cbdecd9e').enabled?.should eq(false)
|
31
|
-
|
32
|
-
# The blast button should still be disabled
|
33
|
-
b.button(:id => 'method').text.should eq('BLAST')
|
34
|
-
b.button(:id => 'method').enabled?.should eq(false)
|
35
|
-
|
36
|
-
# Give a sequence we know should hit
|
37
|
-
b.textarea(:name => 'sequence').set 'YTLPPPPTKLYSAPISCRKNKTGHWMDDILSIKTGESCPVNNYLHSGFLA'
|
38
|
-
|
39
|
-
#blast butn now active
|
40
|
-
b.button(:id => 'method').text.should eq('BLASTP')
|
41
|
-
b.button(:id => 'method').enabled?.should eq(true)
|
42
|
-
|
43
|
-
# Run the blast
|
44
|
-
b.button(:id => 'method').click
|
45
|
-
|
46
|
-
while b.div(:id => 'result').text.include?('Waiting for BLAST to be run')
|
47
|
-
end
|
48
|
-
|
49
|
-
# blast should have worked
|
50
|
-
b.div(:id => 'result').text.include?('Sequences producing significant alignments: ').should eq(true)
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
#####################################################################################
|
55
|
-
#+++++++++++ Below is admin code, hopefully not necessary to mess around with to test new UI specs
|
56
|
-
|
57
|
-
# NOT thread-safe, at least because of the interaction with headless
|
58
|
-
class BrowserAdmin
|
59
|
-
def self.setup_browser(type)
|
60
|
-
case type
|
61
|
-
when :firefox then
|
62
|
-
Watir::Browser.new :firefox
|
63
|
-
when :chrome then
|
64
|
-
Watir::Browser.new :chrome
|
65
|
-
when :headless_firefox then
|
66
|
-
@headless = Headless.new
|
67
|
-
@headless.start
|
68
|
-
Watir::Browser.new :firefox
|
69
|
-
when :headless_chrome then
|
70
|
-
@headless = Headless.new
|
71
|
-
@headless.start
|
72
|
-
Watir::Browser.new :chrome
|
73
|
-
else
|
74
|
-
raise "Unknown browser type asked for: #{type.inspect}"
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def self.teardown_browser(browser)
|
79
|
-
browser.close
|
80
|
-
|
81
|
-
# Re-head again, but maybe this makes no difference
|
82
|
-
@headless.destroy unless @headless.nil?
|
83
|
-
@headless = nil
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
|
88
|
-
describe 'ui' do
|
89
|
-
[:firefox, :chrome, :headless_firefox, :headless_chrome].each do |bro|
|
90
|
-
context bro.to_s do
|
91
|
-
it_behaves_like 'a browser' do
|
92
|
-
browser = nil
|
93
|
-
before do
|
94
|
-
browser = BrowserAdmin.setup_browser bro
|
95
|
-
end
|
96
|
-
after do
|
97
|
-
BrowserAdmin.teardown_browser browser
|
98
|
-
end
|
99
|
-
let(:b){browser}
|
100
|
-
end
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|