Created
March 18, 2015 04:43
-
-
Save muhammaddadu/407dceae00e973ec70c8 to your computer and use it in GitHub Desktop.
greasemonkey-appc-coverage.user.js
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ==UserScript== | |
// @name greasemonkey-appc-coverage | |
// @namespace https://github.com/ | |
// @description GitHub Code Coverage Heat Map (using Greasemonkey) | |
// @include https://github.com/* | |
// @grant GM_xmlhttpRequest | |
// @require http://ajax.googleapis.com/ajax/libs/jquery/1.5.0/jquery.min.js | |
// ==/UserScript== | |
// Make sure jQuery is in the scope | |
if (typeof $ == 'undefined') { | |
this.$ = this.jQuery = jQuery.noConflict(true); | |
} | |
// Don't run on frames or iframes | |
if (window.top != window.self) { | |
return; | |
} | |
function button(title, onclick) { | |
var buttonGroup = $('.file-actions .button-group'), | |
className = title.replace(' ', '-') + '-btn'; | |
buttonGroup.append('<button id="' + className + '" class="minibutton">' + title + '</button>'); | |
$('#' + className).click(onclick); | |
}/** | |
* Displays heatmap over github code | |
*/ | |
var heatmap = function(data) { | |
this.coverage = data.coverage; | |
this.path = data.path; | |
} | |
/** | |
* Toggle On | |
*/ | |
heatmap.prototype.on = function() { | |
var status = false; | |
for (var f = 0, max = this.coverage.length; f < max; ++f) { | |
var url_path = document.URL.substring(document.URL.length - this.path.length); | |
if (url_path == this.path) { | |
status = true; | |
var hits = this.coverage[f].lines.hit, | |
lines = this.coverage[f].lines.details; | |
var rainbow = new Rainbow(); | |
rainbow.setSpectrum('yellow', 'red'); | |
rainbow.setNumberRange(0, hits); | |
for (var i = 0, maxI = lines.length; i < maxI; ++i) { | |
var line = lines[i]; | |
if (line.hit > 0) { | |
$('#LC' + line.line).css('background-color', '#'+rainbow.colourAt(line.hit)); | |
} else { | |
$('#LC' + line.line).css('background-color', 'lightgrey'); | |
} | |
} | |
} | |
} | |
return status; | |
} | |
/** | |
* Toggle Off | |
*/ | |
heatmap.prototype.off = function() { | |
for (var f = 0, max = this.coverage.length; f < max; ++f) { | |
var url_path = document.URL.substring(document.URL.length - this.path.length); | |
if (url_path == this.path) { | |
var hits = this.coverage[f].lines.hit, | |
lines = this.coverage[f].lines.details; | |
for (var i = 0, maxI = lines.length; i < maxI; ++i) { | |
var line = lines[i]; | |
$('#LC' + line.line).css('background-color', 'white'); | |
} | |
} | |
} | |
} | |
function Rainbow(){"use strict";function e(e){if(e.length<2)throw new Error("Rainbow must have two or more colours.");var a=(t-F)/(e.length-1),i=new ColourGradient;i.setGradient(e[0],e[1]),i.setNumberRange(F,F+a),r=[i];for(var o=1;o<e.length-1;o++){var l=new ColourGradient;l.setGradient(e[o],e[o+1]),l.setNumberRange(F+a*o,F+a*(o+1)),r[o]=l}n=e}var r=null,F=0,t=100,n=["ff0000","ffff00","00ff00","0000ff"];e(n),this.setSpectrum=function(){return e(arguments),this},this.setSpectrumByArray=function(r){return e(r),this},this.colourAt=function(e){if(isNaN(e))throw new TypeError(e+" is not a number");if(1===r.length)return r[0].colourAt(e);var n=(t-F)/r.length,a=Math.min(Math.floor((Math.max(e,F)-F)/n),r.length-1);return r[a].colourAt(e)},this.colorAt=this.colourAt,this.setNumberRange=function(r,a){if(!(a>r))throw new RangeError("maxNumber ("+a+") is not greater than minNumber ("+r+")");return F=r,t=a,e(n),this}}function ColourGradient(){"use strict";function e(e,F,t){var n=e;i>n&&(n=i),n>o&&(n=o);var a=o-i,l=parseInt(F,16),u=parseInt(t,16),s=(u-l)/a,g=Math.round(s*(n-i)+l);return r(g.toString(16))}function r(e){return 1===e.length?"0"+e:e}function F(e){var r=/^#?[0-9a-fA-F]{6}$/i;return r.test(e)}function t(e){if(F(e))return e.substring(e.length-6,e.length);var r=e.toLowerCase();if(l.hasOwnProperty(r))return l[r];throw new Error(e+" is not a valid colour.")}var n="ff0000",a="0000ff",i=0,o=100;this.setGradient=function(e,r){n=t(e),a=t(r)},this.setNumberRange=function(e,r){if(!(r>e))throw new RangeError("maxNumber ("+r+") is not greater than minNumber ("+e+")");i=e,o=r},this.colourAt=function(r){return e(r,n.substring(0,2),a.substring(0,2))+e(r,n.substring(2,4),a.substring(2,4))+e(r,n.substring(4,6),a.substring(4,6))};var l={aliceblue:"F0F8FF",antiquewhite:"FAEBD7",aqua:"00FFFF",aquamarine:"7FFFD4",azure:"F0FFFF",beige:"F5F5DC",bisque:"FFE4C4",black:"000000",blanchedalmond:"FFEBCD",blue:"0000FF",blueviolet:"8A2BE2",brown:"A52A2A",burlywood:"DEB887",cadetblue:"5F9EA0",chartreuse:"7FFF00",chocolate:"D2691E",coral:"FF7F50",cornflowerblue:"6495ED",cornsilk:"FFF8DC",crimson:"DC143C",cyan:"00FFFF",darkblue:"00008B",darkcyan:"008B8B",darkgoldenrod:"B8860B",darkgray:"A9A9A9",darkgreen:"006400",darkgrey:"A9A9A9",darkkhaki:"BDB76B",darkmagenta:"8B008B",darkolivegreen:"556B2F",darkorange:"FF8C00",darkorchid:"9932CC",darkred:"8B0000",darksalmon:"E9967A",darkseagreen:"8FBC8F",darkslateblue:"483D8B",darkslategray:"2F4F4F",darkslategrey:"2F4F4F",darkturquoise:"00CED1",darkviolet:"9400D3",deeppink:"FF1493",deepskyblue:"00BFFF",dimgray:"696969",dimgrey:"696969",dodgerblue:"1E90FF",firebrick:"B22222",floralwhite:"FFFAF0",forestgreen:"228B22",fuchsia:"FF00FF",gainsboro:"DCDCDC",ghostwhite:"F8F8FF",gold:"FFD700",goldenrod:"DAA520",gray:"808080",green:"008000",greenyellow:"ADFF2F",grey:"808080",honeydew:"F0FFF0",hotpink:"FF69B4",indianred:"CD5C5C",indigo:"4B0082",ivory:"FFFFF0",khaki:"F0E68C",lavender:"E6E6FA",lavenderblush:"FFF0F5",lawngreen:"7CFC00",lemonchiffon:"FFFACD",lightblue:"ADD8E6",lightcoral:"F08080",lightcyan:"E0FFFF",lightgoldenrodyellow:"FAFAD2",lightgray:"D3D3D3",lightgreen:"90EE90",lightgrey:"D3D3D3",lightpink:"FFB6C1",lightsalmon:"FFA07A",lightseagreen:"20B2AA",lightskyblue:"87CEFA",lightslategray:"778899",lightslategrey:"778899",lightsteelblue:"B0C4DE",lightyellow:"FFFFE0",lime:"00FF00",limegreen:"32CD32",linen:"FAF0E6",magenta:"FF00FF",maroon:"800000",mediumaquamarine:"66CDAA",mediumblue:"0000CD",mediumorchid:"BA55D3",mediumpurple:"9370DB",mediumseagreen:"3CB371",mediumslateblue:"7B68EE",mediumspringgreen:"00FA9A",mediumturquoise:"48D1CC",mediumvioletred:"C71585",midnightblue:"191970",mintcream:"F5FFFA",mistyrose:"FFE4E1",moccasin:"FFE4B5",navajowhite:"FFDEAD",navy:"000080",oldlace:"FDF5E6",olive:"808000",olivedrab:"6B8E23",orange:"FFA500",orangered:"FF4500",orchid:"DA70D6",palegoldenrod:"EEE8AA",palegreen:"98FB98",paleturquoise:"AFEEEE",palevioletred:"DB7093",papayawhip:"FFEFD5",peachpuff:"FFDAB9",peru:"CD853F",pink:"FFC0CB",plum:"DDA0DD",powderblue:"B0E0E6",purple:"800080",red:"FF0000",rosybrown:"BC8F8F",royalblue:"4169E1",saddlebrown:"8B4513",salmon:"FA8072",sandybrown:"F4A460",seagreen:"2E8B57",seashell:"FFF5EE",sienna:"A0522D",silver:"C0C0C0",skyblue:"87CEEB",slateblue:"6A5ACD",slategray:"708090",slategrey:"708090",snow:"FFFAFA",springgreen:"00FF7F",steelblue:"4682B4",tan:"D2B48C",teal:"008080",thistle:"D8BFD8",tomato:"FF6347",turquoise:"40E0D0",violet:"EE82EE",wheat:"F5DEB3",white:"FFFFFF",whitesmoke:"F5F5F5",yellow:"FFFF00",yellowgreen:"9ACD32"}}/** | |
* Gets the page information and sends a request to coverage.appcelerator.com | |
*/ | |
function request(callback) { | |
var page = { | |
organization: null, | |
repo: null, | |
path: null | |
}; | |
var ogtitle = $('meta[property="og:title"]').attr('content'), | |
splitogtitle = ogtitle.split('/'); | |
if (splitogtitle.length !== 2) { | |
return; | |
} | |
//page.path = $('input[name="path"]').val(); | |
page.organization = splitogtitle[0]; | |
page.repo = splitogtitle[1]; | |
var aHref = $('#raw-url').attr('href').split('/'); | |
page.path = ''; | |
for (var x = 5, max = aHref.length; x < max; ++x) { | |
page.path += '/' + aHref[x]; | |
} | |
console.log(page.path); | |
var path = 'https://coverage.appcelerator.com/' + page.organization + '/' + page.repo + '.view?json=true'; | |
requestJsonData(path, function(data) { | |
var current = data.current; | |
if (current) { | |
page.coverage = current.coverage; | |
return callback(null, page); | |
} | |
return; | |
}); | |
} | |
/** | |
* Sends a request and returns json data | |
* @param [string] loc - request URL | |
* @param [callback] callback(data) - JSON data returned from the request | |
*/ | |
function requestJsonData(loc, callback) { | |
GM_xmlhttpRequest({ | |
method: "GET", | |
url: loc, | |
onload: function(xhr) { | |
var data = eval("(" + xhr.responseText + ")"); | |
try { | |
callback(JSON.parse(data)); | |
} catch (e) { | |
callback(data); | |
} | |
} | |
}); | |
} | |
// Loads all scripts | |
function Runner() { | |
request(function(err, data) { | |
var status = false, | |
hm = new heatmap(data); | |
if (!hm) { | |
return; | |
} | |
button('Toggle Coverage', function() { | |
if (!status) { | |
hm.on(); | |
console.log('Coverage ON'); | |
} else { | |
hm.off(); | |
console.log('Coverage OFF'); | |
} | |
status = !status; | |
}); | |
}); | |
} | |
// When the page has loaded | |
$(document).ready(function() { | |
// Start script | |
Runner(); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment