Skip to content

Instantly share code, notes, and snippets.

@muhammaddadu
Created March 18, 2015 04:44
Show Gist options
  • Save muhammaddadu/872c406541bd1d0705af to your computer and use it in GitHub Desktop.
Save muhammaddadu/872c406541bd1d0705af to your computer and use it in GitHub Desktop.
GitHub Code Coverage Heat Map (using Greasemonkey)
// ==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