burnchart/docs/COVERAGE.html

355 lines
126 KiB
HTML

<!DOCTYPE html><html><head><title>Coverage</title><meta charset="utf-8"><script>
headings = [];
onload = function(){
headings = document.querySelectorAll('h2');
};
onscroll = function(e){
var heading = find(window.scrollY);
if (!heading) return;
var links = document.querySelectorAll('#menu a')
, link;
for (var i = 0, len = links.length; i < len; ++i) {
link = links[i];
link.className = link.getAttribute('href') == '#' + heading.id
? 'active'
: '';
}
};
function find(y) {
var i = headings.length
, heading;
while (i--) {
heading = headings[i];
if (y >= heading.offsetTop) {
return heading;
}
}
}
</script>
<style>
body {
font: 14px/1.6 "Helvetica Neue", Helvetica, Arial, sans-serif;
margin: 0;
color: #2C2C2C;
border-top: 2px solid #ddd;
}
#coverage {
padding: 60px;
}
h1 a {
color: inherit;
font-weight: inherit;
}
h1 a:hover {
text-decoration: none;
}
.onload h1 {
opacity: 1;
}
h2 {
width: 80%;
margin-top: 80px;
margin-bottom: 0;
font-weight: 100;
letter-spacing: 1px;
border-bottom: 1px solid #eee;
}
a {
color: #8A6343;
font-weight: bold;
text-decoration: none;
}
a:hover {
text-decoration: underline;
}
ul {
margin-top: 20px;
padding: 0 15px;
width: 100%;
}
ul li {
float: left;
width: 40%;
margin-top: 5px;
margin-right: 60px;
list-style: none;
border-bottom: 1px solid #eee;
padding: 5px 0;
font-size: 12px;
}
ul::after {
content: '.';
height: 0;
display: block;
visibility: hidden;
clear: both;
}
code {
font: 12px monaco, monospace;
}
pre {
margin: 30px;
padding: 30px;
border: 1px solid #eee;
border-bottom-color: #ddd;
-webkit-border-radius: 2px;
-moz-border-radius: 2px;
border-radius: 2px;
-webkit-box-shadow: inset 0 0 10px #eee;
-moz-box-shadow: inset 0 0 10px #eee;
box-shadow: inset 0 0 10px #eee;
overflow-x: auto;
}
img {
margin: 30px;
padding: 1px;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
-webkit-box-shadow: 0 3px 10px #dedede, 0 1px 5px #888;
-moz-box-shadow: 0 3px 10px #dedede, 0 1px 5px #888;
box-shadow: 0 3px 10px #dedede, 0 1px 5px #888;
max-width: 100%;
}
footer {
background: #eee;
width: 100%;
padding: 50px 0;
text-align: right;
border-top: 1px solid #ddd;
}
footer span {
display: block;
margin-right: 30px;
color: #888;
font-size: 12px;
}
#menu {
position: fixed;
font-size: 12px;
overflow-y: auto;
top: 0;
right: 0;
margin: 0;
height: 100%;
padding: 15px 0;
text-align: right;
border-left: 1px solid #eee;
-moz-box-shadow: 0 0 2px #888
, inset 5px 0 20px rgba(0,0,0,.5)
, inset 5px 0 3px rgba(0,0,0,.3);
-webkit-box-shadow: 0 0 2px #888
, inset 5px 0 20px rgba(0,0,0,.5)
, inset 5px 0 3px rgba(0,0,0,.3);
box-shadow: 0 0 2px #888
, inset 5px 0 20px rgba(0,0,0,.5)
, inset 5px 0 3px rgba(0,0,0,.3);
-webkit-font-smoothing: antialiased;
background: url("data:image/png;base64,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");
}
#menu::after {
display: block;
content: '';
padding-top: 80px;
}
#logo {
position: fixed;
bottom: 10px;
right: 10px;
background: rgba(255,255,255,.1);
font-size: 11px;
display: block;
width: 20px;
height: 20px;
line-height: 20px;
text-align: center;
-webkit-border-radius: 20px;
-moz-border-radius: 20px;
border-radius: 20px;
-webkit-box-shadow: 0 0 3px rgba(0,0,0,.2);
-moz-box-shadow: 0 0 3px rgba(0,0,0,.2);
box-shadow: 0 0 3px rgba(0,0,0,.2);
color: inherit;
}
#menu li a {
display: block;
color: white;
padding: 0 35px 0 25px;
-webkit-transition: background 300ms;
-moz-transition: background 300ms;
}
#menu li {
position: relative;
list-style: none;
}
#menu a:hover,
#menu a.active {
text-decoration: none;
background: rgba(255,255,255,.1);
}
#menu li:hover .cov {
opacity: 1;
}
#menu li .dirname {
opacity: .60;
padding-right: 2px;
}
#menu li .basename {
opacity: 1;
}
#menu .cov {
background: rgba(0,0,0,.4);
position: absolute;
top: 0;
right: 8px;
font-size: 9px;
opacity: .6;
text-align: left;
width: 17px;
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;
padding: 2px 3px;
text-align: center;
}
#stats:nth-child(2n) {
display: inline-block;
margin-top: 15px;
border: 1px solid #eee;
padding: 10px;
-webkit-box-shadow: inset 0 0 2px #eee;
-moz-box-shadow: inset 0 0 2px #eee;
box-shadow: inset 0 0 2px #eee;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
}
#stats div {
float: left;
padding: 0 5px;
}
#stats::after {
display: block;
content: '';
clear: both;
}
#stats .sloc::after {
content: ' SLOC';
color: #b6b6b6;
}
#stats .percentage::after {
content: ' coverage';
color: #b6b6b6;
}
#stats .hits,
#stats .misses {
display: none;
}
.high {
color: #00d4b4;
}
.medium {
color: #e87d0d;
}
.low {
color: #d4081a;
}
.terrible {
color: #d4081a;
font-weight: bold;
}
table {
width: 80%;
margin-top: 10px;
border-collapse: collapse;
border: 1px solid #cbcbcb;
color: #363636;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;
}
table thead {
display: none;
}
table td.line,
table td.hits {
width: 20px;
background: #eaeaea;
text-align: center;
font-size: 11px;
padding: 0 10px;
color: #949494;
}
table td.hits {
width: 10px;
padding: 2px 5px;
color: rgba(0,0,0,.2);
background: #f0f0f0;
}
tr.miss td.line,
tr.miss td.hits {
background: #e6c3c7;
}
tr.miss td {
background: #f8d5d8;
}
td.source {
padding-left: 15px;
line-height: 15px;
white-space: pre;
font: 12px monaco, monospace;
}
code .comment { color: #ddd }
code .init { color: #2F6FAD }
code .string { color: #5890AD }
code .keyword { color: #8A6343 }
code .number { color: #2F6FAD }
</style>
</head><body><div id="coverage"><h1 id="overview">Coverage</h1><div id="menu"><li><a href="#overview">overview</a></li><li><span class="cov high">100</span><a href="#/home/radek/dev/burnchart/src/models/config.coffee"><span class="dirname">/home/radek/dev/burnchart/src/models/</span><span class="basename">config.coffee</span></a></li><li><span class="cov high">80</span><a href="#/home/radek/dev/burnchart/src/models/projects.coffee"><span class="dirname">/home/radek/dev/burnchart/src/models/</span><span class="basename">projects.coffee</span></a></li><li><span class="cov high">100</span><a href="#/home/radek/dev/burnchart/src/models/user.coffee"><span class="dirname">/home/radek/dev/burnchart/src/models/</span><span class="basename">user.coffee</span></a></li><li><span class="cov terrible">6</span><a href="#/home/radek/dev/burnchart/src/modules/chart/lines.coffee"><span class="dirname">/home/radek/dev/burnchart/src/modules/chart/</span><span class="basename">lines.coffee</span></a></li><li><span class="cov high">98</span><a href="#/home/radek/dev/burnchart/src/modules/github/issues.coffee"><span class="dirname">/home/radek/dev/burnchart/src/modules/github/</span><span class="basename">issues.coffee</span></a></li><li><span class="cov medium">73</span><a href="#/home/radek/dev/burnchart/src/modules/github/request.coffee"><span class="dirname">/home/radek/dev/burnchart/src/modules/github/</span><span class="basename">request.coffee</span></a></li><li><span class="cov high">100</span><a href="#/home/radek/dev/burnchart/src/modules/mediator.coffee"><span class="dirname">/home/radek/dev/burnchart/src/modules/</span><span class="basename">mediator.coffee</span></a></li><li><span class="cov high">97</span><a href="#/home/radek/dev/burnchart/src/modules/stats.coffee"><span class="dirname">/home/radek/dev/burnchart/src/modules/</span><span class="basename">stats.coffee</span></a></li><li><span class="cov high">92</span><a href="#/home/radek/dev/burnchart/src/utils/mixins.coffee"><span class="dirname">/home/radek/dev/burnchart/src/utils/</span><span class="basename">mixins.coffee</span></a></li><li><span class="cov low">45</span><a href="#/home/radek/dev/burnchart/src/utils/ractive/eventful.coffee"><span class="dirname">/home/radek/dev/burnchart/src/utils/ractive/</span><span class="basename">eventful.coffee</span></a></li><li><span class="cov high">100</span><a href="#/home/radek/dev/burnchart/src/utils/ractive/model.coffee"><span class="dirname">/home/radek/dev/burnchart/src/utils/ractive/</span><span class="basename">model.coffee</span></a></li><a id="logo" href="http://visionmedia.github.io/mocha/">m</a></div><div id="stats" class="medium"><div class="percentage">67%</div><div class="sloc">478</div><div class="hits">323</div><div class="misses">155</div></div><div id="files"><div class="file"><h2 id="/home/radek/dev/burnchart/src/models/config.coffee">/home/radek/dev/burnchart/src/models/config.coffee</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">4</div><div class="hits">4</div><div class="misses">0</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">(function() {</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source"> var Model;</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source"> Model = require('../utils/ractive/model.coffee');</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source"> module.exports = new Model({</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> 'name': 'models/config',</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> &quot;data&quot;: {</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> &quot;firebase&quot;: &quot;burnchart&quot;,</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> &quot;provider&quot;: &quot;github&quot;,</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> &quot;fields&quot;: {</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> &quot;milestone&quot;: [&quot;closed_issues&quot;, &quot;created_at&quot;, &quot;description&quot;, &quot;due_on&quot;, &quot;number&quot;, &quot;open_issues&quot;, &quot;title&quot;, &quot;updated_at&quot;]</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> &quot;chart&quot;: {</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> &quot;off_days&quot;: [],</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> &quot;datetime&quot;: /^(\d{4}-\d{2}-\d{2})T(.*)/,</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> &quot;size_label&quot;: /^size (\d+)$/,</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> &quot;location&quot;: /^#!((\/[^\/]+){2,3})$/,</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> &quot;points&quot;: 'ONE_SIZE'</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> &quot;request&quot;: {</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> &quot;timeout&quot;: 5e3</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source">}).call(this);</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/home/radek/dev/burnchart/src/models/projects.coffee">/home/radek/dev/burnchart/src/models/projects.coffee</h2><div id="stats" class="high"><div class="percentage">80%</div><div class="sloc">122</div><div class="hits">98</div><div class="misses">24</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">(function() {</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source"> var Model, config, lscache, semver, sortedIndex, stats, user, _,</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> __slice = [].slice;</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source"> _ = require('lodash');</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">7</td><td class="hits">1</td><td class="source"> lscache = require('lscache');</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">9</td><td class="hits">1</td><td class="source"> sortedIndex = require('sortedindex-compare');</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">11</td><td class="hits">1</td><td class="source"> semver = require('semver');</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">13</td><td class="hits">1</td><td class="source"> Model = require('../utils/ractive/model.coffee');</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">15</td><td class="hits">1</td><td class="source"> config = require('../models/config.coffee');</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">17</td><td class="hits">1</td><td class="source"> stats = require('../modules/stats.coffee');</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">19</td><td class="hits">1</td><td class="source"> user = require('./user.coffee');</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">21</td><td class="hits">1</td><td class="source"> module.exports = new Model({</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> 'name': 'models/projects',</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> 'data': {</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> 'sortBy': 'priority',</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> 'sortFns': ['progress', 'priority', 'name']</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> comparator: function() {</td></tr><tr class="hit"><td class="line">28</td><td class="hits">14</td><td class="source"> var deIdx, defaults, list, sortBy, _ref;</td></tr><tr class="hit"><td class="line">29</td><td class="hits">14</td><td class="source"> _ref = this.data, list = _ref.list, sortBy = _ref.sortBy;</td></tr><tr class="hit"><td class="line">30</td><td class="hits">14</td><td class="source"> deIdx = (function(_this) {</td></tr><tr class="hit"><td class="line">31</td><td class="hits">14</td><td class="source"> return function(fn) {</td></tr><tr class="hit"><td class="line">32</td><td class="hits">14</td><td class="source"> return function() {</td></tr><tr class="hit"><td class="line">33</td><td class="hits">11</td><td class="source"> var i, j, rest, _arg;</td></tr><tr class="hit"><td class="line">34</td><td class="hits">11</td><td class="source"> _arg = arguments[0], rest = 2 &lt;= arguments.length ? __slice.call(arguments, 1) : [];</td></tr><tr class="hit"><td class="line">35</td><td class="hits">11</td><td class="source"> i = _arg[0], j = _arg[1];</td></tr><tr class="hit"><td class="line">36</td><td class="hits">11</td><td class="source"> return fn.apply(_this, [[list[i], list[i].milestones[j]]].concat(rest));</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> })(this);</td></tr><tr class="hit"><td class="line">40</td><td class="hits">14</td><td class="source"> defaults = function(arr, hash) {</td></tr><tr class="hit"><td class="line">41</td><td class="hits">7</td><td class="source"> var i, item, k, keys, p, ref, v, _i, _len, _results;</td></tr><tr class="hit"><td class="line">42</td><td class="hits">7</td><td class="source"> _results = [];</td></tr><tr class="hit"><td class="line">43</td><td class="hits">7</td><td class="source"> for (_i = 0, _len = arr.length; _i &lt; _len; _i++) {</td></tr><tr class="hit"><td class="line">44</td><td class="hits">14</td><td class="source"> item = arr[_i];</td></tr><tr class="hit"><td class="line">45</td><td class="hits">14</td><td class="source"> _results.push((function() {</td></tr><tr class="hit"><td class="line">46</td><td class="hits">14</td><td class="source"> var _results1;</td></tr><tr class="hit"><td class="line">47</td><td class="hits">14</td><td class="source"> _results1 = [];</td></tr><tr class="hit"><td class="line">48</td><td class="hits">14</td><td class="source"> for (k in hash) {</td></tr><tr class="hit"><td class="line">49</td><td class="hits">26</td><td class="source"> v = hash[k];</td></tr><tr class="hit"><td class="line">50</td><td class="hits">26</td><td class="source"> ref = item;</td></tr><tr class="hit"><td class="line">51</td><td class="hits">26</td><td class="source"> _results1.push((function() {</td></tr><tr class="hit"><td class="line">52</td><td class="hits">26</td><td class="source"> var _j, _len1, _ref1, _results2;</td></tr><tr class="hit"><td class="line">53</td><td class="hits">26</td><td class="source"> _ref1 = keys = k.split('.');</td></tr><tr class="hit"><td class="line">54</td><td class="hits">26</td><td class="source"> _results2 = [];</td></tr><tr class="hit"><td class="line">55</td><td class="hits">26</td><td class="source"> for (i = _j = 0, _len1 = _ref1.length; _j &lt; _len1; i = ++_j) {</td></tr><tr class="hit"><td class="line">56</td><td class="hits">66</td><td class="source"> p = _ref1[i];</td></tr><tr class="hit"><td class="line">57</td><td class="hits">66</td><td class="source"> if (i === keys.length - 1) {</td></tr><tr class="hit"><td class="line">58</td><td class="hits">26</td><td class="source"> _results2.push(ref[p] != null ? ref[p] : ref[p] = v);</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">60</td><td class="hits">40</td><td class="source"> _results2.push(ref = ref[p] != null ? ref[p] : ref[p] = {});</td></tr><tr><td class="line">61</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">62</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">63</td><td class="hits">26</td><td class="source"> return _results2;</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> })());</td></tr><tr><td class="line">65</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">66</td><td class="hits">14</td><td class="source"> return _results1;</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> })());</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">69</td><td class="hits">7</td><td class="source"> return _results;</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">71</td><td class="hits">14</td><td class="source"> switch (sortBy) {</td></tr><tr><td class="line">72</td><td class="hits"></td><td class="source"> case 'progress':</td></tr><tr class="hit"><td class="line">73</td><td class="hits">2</td><td class="source"> return deIdx(function(_arg, _arg1) {</td></tr><tr class="hit"><td class="line">74</td><td class="hits">1</td><td class="source"> var aM, aP, bM, bP;</td></tr><tr class="hit"><td class="line">75</td><td class="hits">1</td><td class="source"> aP = _arg[0], aM = _arg[1];</td></tr><tr class="hit"><td class="line">76</td><td class="hits">1</td><td class="source"> bP = _arg1[0], bM = _arg1[1];</td></tr><tr class="hit"><td class="line">77</td><td class="hits">1</td><td class="source"> defaults([aM, bM], {</td></tr><tr><td class="line">78</td><td class="hits"></td><td class="source"> 'stats.progress.points': 0</td></tr><tr><td class="line">79</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">80</td><td class="hits">1</td><td class="source"> return aM.stats.progress.points - bM.stats.progress.points;</td></tr><tr><td class="line">81</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">82</td><td class="hits"></td><td class="source"> case 'priority':</td></tr><tr class="hit"><td class="line">83</td><td class="hits">7</td><td class="source"> return deIdx(function(_arg, _arg1) {</td></tr><tr class="hit"><td class="line">84</td><td class="hits">6</td><td class="source"> var $a, $b, aM, aP, bM, bP, _ref1;</td></tr><tr class="hit"><td class="line">85</td><td class="hits">6</td><td class="source"> aP = _arg[0], aM = _arg[1];</td></tr><tr class="hit"><td class="line">86</td><td class="hits">6</td><td class="source"> bP = _arg1[0], bM = _arg1[1];</td></tr><tr class="hit"><td class="line">87</td><td class="hits">6</td><td class="source"> defaults([aM, bM], {</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> 'stats.progress.time': 0,</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> 'stats.days': 1e3</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">91</td><td class="hits">6</td><td class="source"> _ref1 = _.map([aM, bM], function(_arg2) {</td></tr><tr class="hit"><td class="line">92</td><td class="hits">12</td><td class="source"> var stats;</td></tr><tr class="hit"><td class="line">93</td><td class="hits">12</td><td class="source"> stats = _arg2.stats;</td></tr><tr class="hit"><td class="line">94</td><td class="hits">12</td><td class="source"> return (stats.progress.points - stats.progress.time) * stats.days;</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> }), $a = _ref1[0], $b = _ref1[1];</td></tr><tr class="hit"><td class="line">96</td><td class="hits">6</td><td class="source"> return $b - $a;</td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> case 'name':</td></tr><tr class="hit"><td class="line">99</td><td class="hits">5</td><td class="source"> return deIdx(function(_arg, _arg1) {</td></tr><tr class="hit"><td class="line">100</td><td class="hits">4</td><td class="source"> var aM, aP, bM, bP, name, owner;</td></tr><tr class="hit"><td class="line">101</td><td class="hits">4</td><td class="source"> aP = _arg[0], aM = _arg[1];</td></tr><tr class="hit"><td class="line">102</td><td class="hits">4</td><td class="source"> bP = _arg1[0], bM = _arg1[1];</td></tr><tr class="hit"><td class="line">103</td><td class="hits">4</td><td class="source"> if (owner = bP.owner.localeCompare(aP.owner)) {</td></tr><tr class="miss"><td class="line">104</td><td class="hits">0</td><td class="source"> return owner;</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">106</td><td class="hits">4</td><td class="source"> if (name = bP.name.localeCompare(aP.name)) {</td></tr><tr class="miss"><td class="line">107</td><td class="hits">0</td><td class="source"> return name;</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">109</td><td class="hits">4</td><td class="source"> if (semver.valid(bM.title) &amp;&amp; semver.valid(aM.title)) {</td></tr><tr class="hit"><td class="line">110</td><td class="hits">1</td><td class="source"> return semver.gt(bM.title, aM.title);</td></tr><tr><td class="line">111</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">112</td><td class="hits">3</td><td class="source"> return bM.title.localeCompare(aM.title);</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">114</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">115</td><td class="hits"></td><td class="source"> default:</td></tr><tr class="miss"><td class="line">116</td><td class="hits">0</td><td class="source"> return function() {</td></tr><tr class="miss"><td class="line">117</td><td class="hits">0</td><td class="source"> return 0;</td></tr><tr><td class="line">118</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">119</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">120</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">121</td><td class="hits"></td><td class="source"> find: function(project) {</td></tr><tr class="miss"><td class="line">122</td><td class="hits">0</td><td class="source"> return _.find(this.data.list, project);</td></tr><tr><td class="line">123</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">124</td><td class="hits"></td><td class="source"> exists: function() {</td></tr><tr class="miss"><td class="line">125</td><td class="hits">0</td><td class="source"> return !!this.find.apply(this, arguments);</td></tr><tr><td class="line">126</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">127</td><td class="hits"></td><td class="source"> add: function(project) {</td></tr><tr class="miss"><td class="line">128</td><td class="hits">0</td><td class="source"> if (!this.exists(project)) {</td></tr><tr class="miss"><td class="line">129</td><td class="hits">0</td><td class="source"> return this.push('list', project);</td></tr><tr><td class="line">130</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">131</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">132</td><td class="hits"></td><td class="source"> findIndex: function(_arg) {</td></tr><tr class="hit"><td class="line">133</td><td class="hits">14</td><td class="source"> var name, owner;</td></tr><tr class="hit"><td class="line">134</td><td class="hits">14</td><td class="source"> owner = _arg.owner, name = _arg.name;</td></tr><tr class="hit"><td class="line">135</td><td class="hits">14</td><td class="source"> return _.findIndex(this.data.list, {</td></tr><tr><td class="line">136</td><td class="hits"></td><td class="source"> owner: owner,</td></tr><tr><td class="line">137</td><td class="hits"></td><td class="source"> name: name</td></tr><tr><td class="line">138</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">139</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">140</td><td class="hits"></td><td class="source"> addMilestone: function(project, milestone) {</td></tr><tr class="hit"><td class="line">141</td><td class="hits">14</td><td class="source"> var i, j;</td></tr><tr class="hit"><td class="line">142</td><td class="hits">14</td><td class="source"> _.extend(milestone, {</td></tr><tr><td class="line">143</td><td class="hits"></td><td class="source"> 'stats': stats(milestone)</td></tr><tr><td class="line">144</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">145</td><td class="hits">14</td><td class="source"> if ((i = this.findIndex(project)) &lt; 0) {</td></tr><tr class="miss"><td class="line">146</td><td class="hits">0</td><td class="source"> throw 500;</td></tr><tr><td class="line">147</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">148</td><td class="hits">14</td><td class="source"> if (project.milestones != null) {</td></tr><tr class="hit"><td class="line">149</td><td class="hits">8</td><td class="source"> this.push(&quot;list.&quot; + i + &quot;.milestones&quot;, milestone);</td></tr><tr class="hit"><td class="line">150</td><td class="hits">8</td><td class="source"> j = this.data.list[i].milestones.length - 1;</td></tr><tr><td class="line">151</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">152</td><td class="hits">6</td><td class="source"> this.set(&quot;list.&quot; + i + &quot;.milestones&quot;, [milestone]);</td></tr><tr class="hit"><td class="line">153</td><td class="hits">6</td><td class="source"> j = 0;</td></tr><tr><td class="line">154</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">155</td><td class="hits">14</td><td class="source"> return this.sort([i, j], [project, milestone]);</td></tr><tr><td class="line">156</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">157</td><td class="hits"></td><td class="source"> saveError: function(project, err) {</td></tr><tr class="miss"><td class="line">158</td><td class="hits">0</td><td class="source"> var idx;</td></tr><tr class="miss"><td class="line">159</td><td class="hits">0</td><td class="source"> if ((idx = this.findIndex(project)) &gt; -1) {</td></tr><tr class="miss"><td class="line">160</td><td class="hits">0</td><td class="source"> if (project.errors != null) {</td></tr><tr class="miss"><td class="line">161</td><td class="hits">0</td><td class="source"> return this.push(&quot;list.&quot; + idx + &quot;.errors&quot;, err);</td></tr><tr><td class="line">162</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="miss"><td class="line">163</td><td class="hits">0</td><td class="source"> return this.set(&quot;list.&quot; + idx + &quot;.errors&quot;, [err]);</td></tr><tr><td class="line">164</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">165</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="miss"><td class="line">166</td><td class="hits">0</td><td class="source"> throw 500;</td></tr><tr><td class="line">167</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">168</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">169</td><td class="hits"></td><td class="source"> demo: function() {</td></tr><tr class="miss"><td class="line">170</td><td class="hits">0</td><td class="source"> return this.set({</td></tr><tr><td class="line">171</td><td class="hits"></td><td class="source"> 'list': [</td></tr><tr><td class="line">172</td><td class="hits"></td><td class="source"> {</td></tr><tr><td class="line">173</td><td class="hits"></td><td class="source"> 'owner': 'mbostock',</td></tr><tr><td class="line">174</td><td class="hits"></td><td class="source"> 'name': 'd3'</td></tr><tr><td class="line">175</td><td class="hits"></td><td class="source"> }, {</td></tr><tr><td class="line">176</td><td class="hits"></td><td class="source"> 'owner': 'medic',</td></tr><tr><td class="line">177</td><td class="hits"></td><td class="source"> 'name': 'medic-webapp'</td></tr><tr><td class="line">178</td><td class="hits"></td><td class="source"> }, {</td></tr><tr><td class="line">179</td><td class="hits"></td><td class="source"> 'owner': 'ractivejs',</td></tr><tr><td class="line">180</td><td class="hits"></td><td class="source"> 'name': 'ractive'</td></tr><tr><td class="line">181</td><td class="hits"></td><td class="source"> }, {</td></tr><tr><td class="line">182</td><td class="hits"></td><td class="source"> 'owner': 'radekstepan',</td></tr><tr><td class="line">183</td><td class="hits"></td><td class="source"> 'name': 'disposable'</td></tr><tr><td class="line">184</td><td class="hits"></td><td class="source"> }, {</td></tr><tr><td class="line">185</td><td class="hits"></td><td class="source"> 'owner': 'rails',</td></tr><tr><td class="line">186</td><td class="hits"></td><td class="source"> 'name': 'rails'</td></tr><tr><td class="line">187</td><td class="hits"></td><td class="source"> }, {</td></tr><tr><td class="line">188</td><td class="hits"></td><td class="source"> 'owner': 'rails',</td></tr><tr><td class="line">189</td><td class="hits"></td><td class="source"> 'name': 'spring'</td></tr><tr><td class="line">190</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">191</td><td class="hits"></td><td class="source"> ],</td></tr><tr><td class="line">192</td><td class="hits"></td><td class="source"> 'index': []</td></tr><tr><td class="line">193</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">194</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">195</td><td class="hits"></td><td class="source"> clear: function() {</td></tr><tr class="hit"><td class="line">196</td><td class="hits">6</td><td class="source"> return this.set({</td></tr><tr><td class="line">197</td><td class="hits"></td><td class="source"> 'list': [],</td></tr><tr><td class="line">198</td><td class="hits"></td><td class="source"> 'index': []</td></tr><tr><td class="line">199</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">200</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">201</td><td class="hits"></td><td class="source"> sort: function(ref, data) {</td></tr><tr class="hit"><td class="line">202</td><td class="hits">17</td><td class="source"> var i, idx, index, j, m, p, _i, _j, _len, _len1, _ref, _ref1;</td></tr><tr class="hit"><td class="line">203</td><td class="hits">17</td><td class="source"> index = this.data.index || [];</td></tr><tr class="hit"><td class="line">204</td><td class="hits">17</td><td class="source"> if (ref) {</td></tr><tr class="hit"><td class="line">205</td><td class="hits">14</td><td class="source"> idx = sortedIndex(index, data, this.comparator());</td></tr><tr class="hit"><td class="line">206</td><td class="hits">14</td><td class="source"> index.splice(idx, 0, ref);</td></tr><tr><td class="line">207</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">208</td><td class="hits">3</td><td class="source"> _ref = this.data.list;</td></tr><tr class="hit"><td class="line">209</td><td class="hits">3</td><td class="source"> for (i = _i = 0, _len = _ref.length; _i &lt; _len; i = ++_i) {</td></tr><tr class="miss"><td class="line">210</td><td class="hits">0</td><td class="source"> p = _ref[i];</td></tr><tr class="miss"><td class="line">211</td><td class="hits">0</td><td class="source"> if (p.milestones == null) {</td></tr><tr class="miss"><td class="line">212</td><td class="hits">0</td><td class="source"> continue;</td></tr><tr><td class="line">213</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">214</td><td class="hits">0</td><td class="source"> _ref1 = p.milestones;</td></tr><tr class="miss"><td class="line">215</td><td class="hits">0</td><td class="source"> for (j = _j = 0, _len1 = _ref1.length; _j &lt; _len1; j = ++_j) {</td></tr><tr class="miss"><td class="line">216</td><td class="hits">0</td><td class="source"> m = _ref1[j];</td></tr><tr class="miss"><td class="line">217</td><td class="hits">0</td><td class="source"> idx = sortedIndex(index, [p, m], this.comparator());</td></tr><tr class="miss"><td class="line">218</td><td class="hits">0</td><td class="source"> index.splice(idx, 0, [i, j]);</td></tr><tr><td class="line">219</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">220</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">221</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">222</td><td class="hits">17</td><td class="source"> return this.set('index', index);</td></tr><tr><td class="line">223</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">224</td><td class="hits"></td><td class="source"> onconstruct: function() {</td></tr><tr class="hit"><td class="line">225</td><td class="hits">1</td><td class="source"> this.subscribe('!projects/add', this.add, this);</td></tr><tr class="hit"><td class="line">226</td><td class="hits">1</td><td class="source"> return this.subscribe('!projects/demo', this.demo, this);</td></tr><tr><td class="line">227</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">228</td><td class="hits"></td><td class="source"> onrender: function() {</td></tr><tr class="hit"><td class="line">229</td><td class="hits">1</td><td class="source"> this.set('list', lscache.get('projects') || []);</td></tr><tr class="hit"><td class="line">230</td><td class="hits">1</td><td class="source"> this.observe('list', function(projects) {</td></tr><tr class="hit"><td class="line">231</td><td class="hits">26</td><td class="source"> return lscache.set('projects', _.pluckMany(projects, ['owner', 'name']));</td></tr><tr><td class="line">232</td><td class="hits"></td><td class="source"> }, {</td></tr><tr><td class="line">233</td><td class="hits"></td><td class="source"> 'init': false</td></tr><tr><td class="line">234</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">235</td><td class="hits">1</td><td class="source"> return this.observe('sortBy', function() {</td></tr><tr class="hit"><td class="line">236</td><td class="hits">3</td><td class="source"> this.set('index', null);</td></tr><tr class="hit"><td class="line">237</td><td class="hits">3</td><td class="source"> return this.sort();</td></tr><tr><td class="line">238</td><td class="hits"></td><td class="source"> }, {</td></tr><tr><td class="line">239</td><td class="hits"></td><td class="source"> 'init': false</td></tr><tr><td class="line">240</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">241</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">242</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">243</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">244</td><td class="hits"></td><td class="source">}).call(this);</td></tr><tr><td class="line">245</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/home/radek/dev/burnchart/src/models/user.coffee">/home/radek/dev/burnchart/src/models/user.coffee</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">4</div><div class="hits">4</div><div class="misses">0</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">(function() {</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source"> var Model;</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source"> Model = require('../utils/ractive/model.coffee');</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source"> module.exports = new Model({</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> 'name': 'models/user'</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source">}).call(this);</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/home/radek/dev/burnchart/src/modules/chart/lines.coffee">/home/radek/dev/burnchart/src/modules/chart/lines.coffee</h2><div id="stats" class="terrible"><div class="percentage">6%</div><div class="sloc">88</div><div class="hits">6</div><div class="misses">82</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">(function() {</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source"> var config, d3, _,</td></tr><tr class="miss"><td class="line">3</td><td class="hits">0</td><td class="source"> __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i &lt; l; i++) { if (i in this &amp;&amp; this[i] === item) return i; } return -1; };</td></tr><tr><td class="line">4</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">5</td><td class="hits">1</td><td class="source"> _ = require('lodash');</td></tr><tr><td class="line">6</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">7</td><td class="hits">1</td><td class="source"> d3 = require('d3');</td></tr><tr><td class="line">8</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">9</td><td class="hits">1</td><td class="source"> config = require('../../models/config.coffee');</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">11</td><td class="hits">1</td><td class="source"> module.exports = {</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> actual: function(issues, created_at, total) {</td></tr><tr class="miss"><td class="line">13</td><td class="hits">0</td><td class="source"> var head, max, min, range, rest;</td></tr><tr class="miss"><td class="line">14</td><td class="hits">0</td><td class="source"> head = [</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> {</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> 'date': new Date(created_at),</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> 'points': total</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> ];</td></tr><tr class="miss"><td class="line">20</td><td class="hits">0</td><td class="source"> min = +Infinity;</td></tr><tr class="miss"><td class="line">21</td><td class="hits">0</td><td class="source"> max = -Infinity;</td></tr><tr class="miss"><td class="line">22</td><td class="hits">0</td><td class="source"> rest = _.map(issues, function(issue) {</td></tr><tr class="miss"><td class="line">23</td><td class="hits">0</td><td class="source"> var closed_at, size;</td></tr><tr class="miss"><td class="line">24</td><td class="hits">0</td><td class="source"> size = issue.size, closed_at = issue.closed_at;</td></tr><tr class="miss"><td class="line">25</td><td class="hits">0</td><td class="source"> if (size &lt; min) {</td></tr><tr class="miss"><td class="line">26</td><td class="hits">0</td><td class="source"> min = size;</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">28</td><td class="hits">0</td><td class="source"> if (size &gt; max) {</td></tr><tr class="miss"><td class="line">29</td><td class="hits">0</td><td class="source"> max = size;</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">31</td><td class="hits">0</td><td class="source"> issue.date = new Date(closed_at);</td></tr><tr class="miss"><td class="line">32</td><td class="hits">0</td><td class="source"> issue.points = total -= size;</td></tr><tr class="miss"><td class="line">33</td><td class="hits">0</td><td class="source"> return issue;</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">35</td><td class="hits">0</td><td class="source"> range = d3.scale.linear().domain([min, max]).range([5, 8]);</td></tr><tr class="miss"><td class="line">36</td><td class="hits">0</td><td class="source"> rest = _.map(rest, function(issue) {</td></tr><tr class="miss"><td class="line">37</td><td class="hits">0</td><td class="source"> issue.radius = range(issue.size);</td></tr><tr class="miss"><td class="line">38</td><td class="hits">0</td><td class="source"> return issue;</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">40</td><td class="hits">0</td><td class="source"> return [].concat(head, rest);</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> ideal: function(a, b, total) {</td></tr><tr class="miss"><td class="line">43</td><td class="hits">0</td><td class="source"> var cutoff, d, days, length, m, now, once, velocity, y, _ref, _ref1;</td></tr><tr class="miss"><td class="line">44</td><td class="hits">0</td><td class="source"> if (b &lt; a) {</td></tr><tr class="miss"><td class="line">45</td><td class="hits">0</td><td class="source"> _ref = [a, b], b = _ref[0], a = _ref[1];</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">47</td><td class="hits">0</td><td class="source"> _ref1 = _.map(a.match(config.data.chart.datetime)[1].split('-'), function(v) {</td></tr><tr class="miss"><td class="line">48</td><td class="hits">0</td><td class="source"> return parseInt(v);</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> }), y = _ref1[0], m = _ref1[1], d = _ref1[2];</td></tr><tr class="miss"><td class="line">50</td><td class="hits">0</td><td class="source"> cutoff = new Date(b);</td></tr><tr class="miss"><td class="line">51</td><td class="hits">0</td><td class="source"> days = [];</td></tr><tr class="miss"><td class="line">52</td><td class="hits">0</td><td class="source"> length = 0;</td></tr><tr class="miss"><td class="line">53</td><td class="hits">0</td><td class="source"> (once = function(inc) {</td></tr><tr class="miss"><td class="line">54</td><td class="hits">0</td><td class="source"> var day, day_of;</td></tr><tr class="miss"><td class="line">55</td><td class="hits">0</td><td class="source"> day = new Date(y, m - 1, d + inc);</td></tr><tr class="miss"><td class="line">56</td><td class="hits">0</td><td class="source"> if (!(day_of = day.getDay())) {</td></tr><tr class="miss"><td class="line">57</td><td class="hits">0</td><td class="source"> day_of = 7;</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">59</td><td class="hits">0</td><td class="source"> if (__indexOf.call(config.data.chart.off_days, day_of) &gt;= 0) {</td></tr><tr class="miss"><td class="line">60</td><td class="hits">0</td><td class="source"> days.push({</td></tr><tr><td class="line">61</td><td class="hits"></td><td class="source"> date: day,</td></tr><tr><td class="line">62</td><td class="hits"></td><td class="source"> off_day: true</td></tr><tr><td class="line">63</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="miss"><td class="line">65</td><td class="hits">0</td><td class="source"> length += 1;</td></tr><tr class="miss"><td class="line">66</td><td class="hits">0</td><td class="source"> days.push({</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> date: day</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">70</td><td class="hits">0</td><td class="source"> if (!(day &gt; cutoff)) {</td></tr><tr class="miss"><td class="line">71</td><td class="hits">0</td><td class="source"> return once(inc + 1);</td></tr><tr><td class="line">72</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> })(0);</td></tr><tr class="miss"><td class="line">74</td><td class="hits">0</td><td class="source"> velocity = total / (length - 1);</td></tr><tr class="miss"><td class="line">75</td><td class="hits">0</td><td class="source"> days = _.map(days, function(day, i) {</td></tr><tr class="miss"><td class="line">76</td><td class="hits">0</td><td class="source"> day.points = total;</td></tr><tr class="miss"><td class="line">77</td><td class="hits">0</td><td class="source"> if (days[i] &amp;&amp; !days[i].off_day) {</td></tr><tr class="miss"><td class="line">78</td><td class="hits">0</td><td class="source"> total -= velocity;</td></tr><tr><td class="line">79</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">80</td><td class="hits">0</td><td class="source"> return day;</td></tr><tr><td class="line">81</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">82</td><td class="hits">0</td><td class="source"> if ((now = new Date) &gt; cutoff) {</td></tr><tr class="miss"><td class="line">83</td><td class="hits">0</td><td class="source"> days.push({</td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> date: now,</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> points: 0</td></tr><tr><td class="line">86</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">88</td><td class="hits">0</td><td class="source"> return days;</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> trend: function(actual, created_at, due_on) {</td></tr><tr class="miss"><td class="line">91</td><td class="hits">0</td><td class="source"> var a, b, b1, c1, e, fn, intercept, l, last, now, slope, start, values;</td></tr><tr class="miss"><td class="line">92</td><td class="hits">0</td><td class="source"> if (!actual.length) {</td></tr><tr class="miss"><td class="line">93</td><td class="hits">0</td><td class="source"> return [];</td></tr><tr><td class="line">94</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">95</td><td class="hits">0</td><td class="source"> start = +actual[0].date;</td></tr><tr class="miss"><td class="line">96</td><td class="hits">0</td><td class="source"> values = _.map(actual, function(_arg) {</td></tr><tr class="miss"><td class="line">97</td><td class="hits">0</td><td class="source"> var date, points;</td></tr><tr class="miss"><td class="line">98</td><td class="hits">0</td><td class="source"> date = _arg.date, points = _arg.points;</td></tr><tr class="miss"><td class="line">99</td><td class="hits">0</td><td class="source"> return [+date - start, points];</td></tr><tr><td class="line">100</td><td class="hits"></td><td class="source"> });</td></tr><tr class="miss"><td class="line">101</td><td class="hits">0</td><td class="source"> last = actual[actual.length - 1];</td></tr><tr class="miss"><td class="line">102</td><td class="hits">0</td><td class="source"> values.push([+(new Date) - start, last.points]);</td></tr><tr class="miss"><td class="line">103</td><td class="hits">0</td><td class="source"> b1 = 0;</td></tr><tr class="miss"><td class="line">104</td><td class="hits">0</td><td class="source"> e = 0;</td></tr><tr class="miss"><td class="line">105</td><td class="hits">0</td><td class="source"> c1 = 0;</td></tr><tr class="miss"><td class="line">106</td><td class="hits">0</td><td class="source"> a = (l = values.length) * _.reduce(values, function(sum, _arg) {</td></tr><tr class="miss"><td class="line">107</td><td class="hits">0</td><td class="source"> var a, b;</td></tr><tr class="miss"><td class="line">108</td><td class="hits">0</td><td class="source"> a = _arg[0], b = _arg[1];</td></tr><tr class="miss"><td class="line">109</td><td class="hits">0</td><td class="source"> b1 += a;</td></tr><tr class="miss"><td class="line">110</td><td class="hits">0</td><td class="source"> e += b;</td></tr><tr class="miss"><td class="line">111</td><td class="hits">0</td><td class="source"> c1 += Math.pow(a, 2);</td></tr><tr class="miss"><td class="line">112</td><td class="hits">0</td><td class="source"> return sum + (a * b);</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> }, 0);</td></tr><tr class="miss"><td class="line">114</td><td class="hits">0</td><td class="source"> slope = (a - (b1 * e)) / ((l * c1) - (Math.pow(b1, 2)));</td></tr><tr class="miss"><td class="line">115</td><td class="hits">0</td><td class="source"> intercept = (e - (slope * b1)) / l;</td></tr><tr class="miss"><td class="line">116</td><td class="hits">0</td><td class="source"> fn = function(x) {</td></tr><tr class="miss"><td class="line">117</td><td class="hits">0</td><td class="source"> return slope * x + intercept;</td></tr><tr><td class="line">118</td><td class="hits"></td><td class="source"> };</td></tr><tr class="miss"><td class="line">119</td><td class="hits">0</td><td class="source"> created_at = new Date(created_at);</td></tr><tr class="miss"><td class="line">120</td><td class="hits">0</td><td class="source"> now = new Date;</td></tr><tr class="miss"><td class="line">121</td><td class="hits">0</td><td class="source"> if (due_on) {</td></tr><tr class="miss"><td class="line">122</td><td class="hits">0</td><td class="source"> due_on = new Date(due_on);</td></tr><tr class="miss"><td class="line">123</td><td class="hits">0</td><td class="source"> if (now &gt; due_on) {</td></tr><tr class="miss"><td class="line">124</td><td class="hits">0</td><td class="source"> due_on = now;</td></tr><tr><td class="line">125</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">126</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="miss"><td class="line">127</td><td class="hits">0</td><td class="source"> due_on = now;</td></tr><tr><td class="line">128</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">129</td><td class="hits">0</td><td class="source"> a = created_at - start;</td></tr><tr class="miss"><td class="line">130</td><td class="hits">0</td><td class="source"> b = due_on - start;</td></tr><tr class="miss"><td class="line">131</td><td class="hits">0</td><td class="source"> return [</td></tr><tr><td class="line">132</td><td class="hits"></td><td class="source"> {</td></tr><tr><td class="line">133</td><td class="hits"></td><td class="source"> 'date': created_at,</td></tr><tr><td class="line">134</td><td class="hits"></td><td class="source"> 'points': fn(a)</td></tr><tr><td class="line">135</td><td class="hits"></td><td class="source"> }, {</td></tr><tr><td class="line">136</td><td class="hits"></td><td class="source"> 'date': due_on,</td></tr><tr><td class="line">137</td><td class="hits"></td><td class="source"> 'points': fn(b)</td></tr><tr><td class="line">138</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">139</td><td class="hits"></td><td class="source"> ];</td></tr><tr><td class="line">140</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">141</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">142</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">143</td><td class="hits"></td><td class="source">}).call(this);</td></tr><tr><td class="line">144</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/home/radek/dev/burnchart/src/modules/github/issues.coffee">/home/radek/dev/burnchart/src/modules/github/issues.coffee</h2><div id="stats" class="high"><div class="percentage">98%</div><div class="sloc">51</div><div class="hits">50</div><div class="misses">1</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">(function() {</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source"> var async, calcSize, config, oneStatus, request, _;</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source"> _ = require('lodash');</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source"> async = require('async');</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">8</td><td class="hits">1</td><td class="source"> config = require('../../models/config.coffee');</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">10</td><td class="hits">1</td><td class="source"> request = require('./request.coffee');</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">12</td><td class="hits">1</td><td class="source"> module.exports = {</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> fetchAll: function(repo, cb) {</td></tr><tr class="hit"><td class="line">14</td><td class="hits">14</td><td class="source"> return async.parallel([_.partial(oneStatus, repo, 'open'), _.partial(oneStatus, repo, 'closed')], function(err, _arg) {</td></tr><tr class="hit"><td class="line">15</td><td class="hits">14</td><td class="source"> var closed, open;</td></tr><tr class="hit"><td class="line">16</td><td class="hits">14</td><td class="source"> open = _arg[0], closed = _arg[1];</td></tr><tr class="hit"><td class="line">17</td><td class="hits">14</td><td class="source"> return cb(err, {</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> open: open,</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> closed: closed</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">21</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">25</td><td class="hits">1</td><td class="source"> calcSize = function(list) {</td></tr><tr class="hit"><td class="line">26</td><td class="hits">26</td><td class="source"> var issue, size, _i, _len;</td></tr><tr class="hit"><td class="line">27</td><td class="hits">26</td><td class="source"> switch (config.data.chart.points) {</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> case 'ONE_SIZE':</td></tr><tr class="hit"><td class="line">29</td><td class="hits">16</td><td class="source"> size = list.length;</td></tr><tr class="hit"><td class="line">30</td><td class="hits">16</td><td class="source"> for (_i = 0, _len = list.length; _i &lt; _len; _i++) {</td></tr><tr class="hit"><td class="line">31</td><td class="hits">1006</td><td class="source"> issue = list[_i];</td></tr><tr class="hit"><td class="line">32</td><td class="hits">1006</td><td class="source"> issue.size = 1;</td></tr><tr><td class="line">33</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">34</td><td class="hits">16</td><td class="source"> break;</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> case 'LABELS':</td></tr><tr class="hit"><td class="line">36</td><td class="hits">10</td><td class="source"> size = 0;</td></tr><tr class="hit"><td class="line">37</td><td class="hits">10</td><td class="source"> list = _.filter(list, function(issue) {</td></tr><tr class="hit"><td class="line">38</td><td class="hits">16</td><td class="source"> var labels;</td></tr><tr class="hit"><td class="line">39</td><td class="hits">16</td><td class="source"> if (!(labels = issue.labels)) {</td></tr><tr class="hit"><td class="line">40</td><td class="hits">2</td><td class="source"> return false;</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">42</td><td class="hits">14</td><td class="source"> issue.size = _.reduce(labels, function(sum, label) {</td></tr><tr class="hit"><td class="line">43</td><td class="hits">16</td><td class="source"> var matches;</td></tr><tr class="hit"><td class="line">44</td><td class="hits">16</td><td class="source"> if (!(matches = label.name.match(config.data.chart.size_label))) {</td></tr><tr class="hit"><td class="line">45</td><td class="hits">6</td><td class="source"> return sum;</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">47</td><td class="hits">10</td><td class="source"> return sum += parseInt(matches[1]);</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> }, 0);</td></tr><tr class="hit"><td class="line">49</td><td class="hits">14</td><td class="source"> size += issue.size;</td></tr><tr class="hit"><td class="line">50</td><td class="hits">14</td><td class="source"> return !!issue.size;</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">52</td><td class="hits">10</td><td class="source"> break;</td></tr><tr><td class="line">53</td><td class="hits"></td><td class="source"> default:</td></tr><tr class="miss"><td class="line">54</td><td class="hits">0</td><td class="source"> throw 500;</td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">56</td><td class="hits">26</td><td class="source"> return {</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> list: list,</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> size: size</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">61</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">62</td><td class="hits">1</td><td class="source"> oneStatus = function(repo, state, cb) {</td></tr><tr class="hit"><td class="line">63</td><td class="hits">28</td><td class="source"> var done, fetchPage, results;</td></tr><tr class="hit"><td class="line">64</td><td class="hits">28</td><td class="source"> results = [];</td></tr><tr class="hit"><td class="line">65</td><td class="hits">28</td><td class="source"> done = function(err) {</td></tr><tr class="hit"><td class="line">66</td><td class="hits">28</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">67</td><td class="hits">2</td><td class="source"> return cb(err);</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">69</td><td class="hits">26</td><td class="source"> return cb(null, calcSize(results));</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">71</td><td class="hits">28</td><td class="source"> return (fetchPage = function(page) {</td></tr><tr class="hit"><td class="line">72</td><td class="hits">36</td><td class="source"> return request.allIssues(repo, {</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> state: state,</td></tr><tr><td class="line">74</td><td class="hits"></td><td class="source"> page: page</td></tr><tr><td class="line">75</td><td class="hits"></td><td class="source"> }, function(err, data) {</td></tr><tr class="hit"><td class="line">76</td><td class="hits">36</td><td class="source"> if (err) {</td></tr><tr class="hit"><td class="line">77</td><td class="hits">2</td><td class="source"> return done(err);</td></tr><tr><td class="line">78</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">79</td><td class="hits">34</td><td class="source"> if (!data.length) {</td></tr><tr class="hit"><td class="line">80</td><td class="hits">6</td><td class="source"> return done(null, results);</td></tr><tr><td class="line">81</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">82</td><td class="hits">28</td><td class="source"> results = results.concat(_.sortBy(data, 'closed_at'));</td></tr><tr class="hit"><td class="line">83</td><td class="hits">28</td><td class="source"> if (data.length &lt; 100) {</td></tr><tr class="hit"><td class="line">84</td><td class="hits">20</td><td class="source"> return done(null, results);</td></tr><tr><td class="line">85</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">86</td><td class="hits">8</td><td class="source"> return fetchPage(page + 1);</td></tr><tr><td class="line">87</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> })(1);</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source">}).call(this);</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/home/radek/dev/burnchart/src/modules/github/request.coffee">/home/radek/dev/burnchart/src/modules/github/request.coffee</h2><div id="stats" class="medium"><div class="percentage">73%</div><div class="sloc">124</div><div class="hits">91</div><div class="misses">33</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">2</td><td class="source">(function() {</td></tr><tr class="hit"><td class="line">2</td><td class="hits">2</td><td class="source"> var config, defaults, error, headers, isReady, isValid, ready, request, response, stack, superagent, user, _;</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">4</td><td class="hits">2</td><td class="source"> _ = require('lodash');</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">6</td><td class="hits">2</td><td class="source"> superagent = require('superagent');</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">8</td><td class="hits">2</td><td class="source"> require('../../utils/mixins.coffee');</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">10</td><td class="hits">2</td><td class="source"> config = require('../../models/config.coffee');</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">12</td><td class="hits">2</td><td class="source"> user = require('../../models/user.coffee');</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">14</td><td class="hits">2</td><td class="source"> superagent.parse = {</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> 'application/json': function(res) {</td></tr><tr class="miss"><td class="line">16</td><td class="hits">0</td><td class="source"> var e;</td></tr><tr class="miss"><td class="line">17</td><td class="hits">0</td><td class="source"> try {</td></tr><tr class="miss"><td class="line">18</td><td class="hits">0</td><td class="source"> return JSON.parse(res);</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> } catch (_error) {</td></tr><tr class="miss"><td class="line">20</td><td class="hits">0</td><td class="source"> e = _error;</td></tr><tr class="miss"><td class="line">21</td><td class="hits">0</td><td class="source"> return {};</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">26</td><td class="hits">2</td><td class="source"> defaults = {</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> 'github': {</td></tr><tr><td class="line">28</td><td class="hits"></td><td class="source"> 'host': 'api.github.com',</td></tr><tr><td class="line">29</td><td class="hits"></td><td class="source"> 'protocol': 'https'</td></tr><tr><td class="line">30</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">33</td><td class="hits">2</td><td class="source"> module.exports = {</td></tr><tr><td class="line">34</td><td class="hits"></td><td class="source"> repo: function(_arg, cb) {</td></tr><tr class="miss"><td class="line">35</td><td class="hits">0</td><td class="source"> var name, owner;</td></tr><tr class="miss"><td class="line">36</td><td class="hits">0</td><td class="source"> owner = _arg.owner, name = _arg.name;</td></tr><tr class="miss"><td class="line">37</td><td class="hits">0</td><td class="source"> if (!isValid({</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> owner: owner,</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> name: name</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> })) {</td></tr><tr class="miss"><td class="line">41</td><td class="hits">0</td><td class="source"> return cb('Request is malformed');</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">43</td><td class="hits">0</td><td class="source"> return ready(function() {</td></tr><tr class="miss"><td class="line">44</td><td class="hits">0</td><td class="source"> var data;</td></tr><tr class="miss"><td class="line">45</td><td class="hits">0</td><td class="source"> data = _.defaults({</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> 'path': &quot;/repos/&quot; + owner + &quot;/&quot; + name,</td></tr><tr><td class="line">47</td><td class="hits"></td><td class="source"> 'headers': headers(user.data.accessToken)</td></tr><tr><td class="line">48</td><td class="hits"></td><td class="source"> }, defaults.github);</td></tr><tr class="miss"><td class="line">49</td><td class="hits">0</td><td class="source"> return request(data, cb);</td></tr><tr><td class="line">50</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">51</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">52</td><td class="hits"></td><td class="source"> allMilestones: function(_arg, cb) {</td></tr><tr class="hit"><td class="line">53</td><td class="hits">1</td><td class="source"> var name, owner;</td></tr><tr class="hit"><td class="line">54</td><td class="hits">1</td><td class="source"> owner = _arg.owner, name = _arg.name;</td></tr><tr class="hit"><td class="line">55</td><td class="hits">1</td><td class="source"> if (!isValid({</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> owner: owner,</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> name: name</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> })) {</td></tr><tr class="miss"><td class="line">59</td><td class="hits">0</td><td class="source"> return cb('Request is malformed');</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">61</td><td class="hits">1</td><td class="source"> return ready(function() {</td></tr><tr class="hit"><td class="line">62</td><td class="hits">1</td><td class="source"> var data;</td></tr><tr class="hit"><td class="line">63</td><td class="hits">1</td><td class="source"> data = _.defaults({</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> 'path': &quot;/repos/&quot; + owner + &quot;/&quot; + name + &quot;/milestones&quot;,</td></tr><tr><td class="line">65</td><td class="hits"></td><td class="source"> 'query': {</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> 'state': 'open',</td></tr><tr><td class="line">67</td><td class="hits"></td><td class="source"> 'sort': 'due_date',</td></tr><tr><td class="line">68</td><td class="hits"></td><td class="source"> 'direction': 'asc'</td></tr><tr><td class="line">69</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">70</td><td class="hits"></td><td class="source"> 'headers': headers(user.data.accessToken)</td></tr><tr><td class="line">71</td><td class="hits"></td><td class="source"> }, defaults.github);</td></tr><tr class="hit"><td class="line">72</td><td class="hits">1</td><td class="source"> return request(data, cb);</td></tr><tr><td class="line">73</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">74</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">75</td><td class="hits"></td><td class="source"> oneMilestone: function(_arg, cb) {</td></tr><tr class="hit"><td class="line">76</td><td class="hits">3</td><td class="source"> var milestone, name, owner;</td></tr><tr class="hit"><td class="line">77</td><td class="hits">3</td><td class="source"> owner = _arg.owner, name = _arg.name, milestone = _arg.milestone;</td></tr><tr class="hit"><td class="line">78</td><td class="hits">3</td><td class="source"> if (!isValid({</td></tr><tr><td class="line">79</td><td class="hits"></td><td class="source"> owner: owner,</td></tr><tr><td class="line">80</td><td class="hits"></td><td class="source"> name: name,</td></tr><tr><td class="line">81</td><td class="hits"></td><td class="source"> milestone: milestone</td></tr><tr><td class="line">82</td><td class="hits"></td><td class="source"> })) {</td></tr><tr class="miss"><td class="line">83</td><td class="hits">0</td><td class="source"> return cb('Request is malformed');</td></tr><tr><td class="line">84</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">85</td><td class="hits">3</td><td class="source"> return ready(function() {</td></tr><tr class="hit"><td class="line">86</td><td class="hits">3</td><td class="source"> var data;</td></tr><tr class="hit"><td class="line">87</td><td class="hits">3</td><td class="source"> data = _.defaults({</td></tr><tr><td class="line">88</td><td class="hits"></td><td class="source"> 'path': &quot;/repos/&quot; + owner + &quot;/&quot; + name + &quot;/milestones/&quot; + milestone,</td></tr><tr><td class="line">89</td><td class="hits"></td><td class="source"> 'query': {</td></tr><tr><td class="line">90</td><td class="hits"></td><td class="source"> 'state': 'open',</td></tr><tr><td class="line">91</td><td class="hits"></td><td class="source"> 'sort': 'due_date',</td></tr><tr><td class="line">92</td><td class="hits"></td><td class="source"> 'direction': 'asc'</td></tr><tr><td class="line">93</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">94</td><td class="hits"></td><td class="source"> 'headers': headers(user.data.accessToken)</td></tr><tr><td class="line">95</td><td class="hits"></td><td class="source"> }, defaults.github);</td></tr><tr class="hit"><td class="line">96</td><td class="hits">3</td><td class="source"> return request(data, cb);</td></tr><tr><td class="line">97</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">98</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">99</td><td class="hits"></td><td class="source"> allIssues: function(_arg, query, cb) {</td></tr><tr class="hit"><td class="line">100</td><td class="hits">2</td><td class="source"> var milestone, name, owner;</td></tr><tr class="hit"><td class="line">101</td><td class="hits">2</td><td class="source"> owner = _arg.owner, name = _arg.name, milestone = _arg.milestone;</td></tr><tr class="hit"><td class="line">102</td><td class="hits">2</td><td class="source"> if (!isValid({</td></tr><tr><td class="line">103</td><td class="hits"></td><td class="source"> owner: owner,</td></tr><tr><td class="line">104</td><td class="hits"></td><td class="source"> name: name,</td></tr><tr><td class="line">105</td><td class="hits"></td><td class="source"> milestone: milestone</td></tr><tr><td class="line">106</td><td class="hits"></td><td class="source"> })) {</td></tr><tr class="miss"><td class="line">107</td><td class="hits">0</td><td class="source"> return cb('Request is malformed');</td></tr><tr><td class="line">108</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">109</td><td class="hits">2</td><td class="source"> return ready(function() {</td></tr><tr class="hit"><td class="line">110</td><td class="hits">2</td><td class="source"> var data;</td></tr><tr class="hit"><td class="line">111</td><td class="hits">2</td><td class="source"> data = _.defaults({</td></tr><tr><td class="line">112</td><td class="hits"></td><td class="source"> 'path': &quot;/repos/&quot; + owner + &quot;/&quot; + name + &quot;/issues&quot;,</td></tr><tr><td class="line">113</td><td class="hits"></td><td class="source"> 'query': _.extend(query, {</td></tr><tr><td class="line">114</td><td class="hits"></td><td class="source"> milestone: milestone,</td></tr><tr><td class="line">115</td><td class="hits"></td><td class="source"> 'per_page': '100'</td></tr><tr><td class="line">116</td><td class="hits"></td><td class="source"> }),</td></tr><tr><td class="line">117</td><td class="hits"></td><td class="source"> 'headers': headers(user.data.accessToken)</td></tr><tr><td class="line">118</td><td class="hits"></td><td class="source"> }, defaults.github);</td></tr><tr class="hit"><td class="line">119</td><td class="hits">2</td><td class="source"> return request(data, cb);</td></tr><tr><td class="line">120</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">121</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">122</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">123</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">124</td><td class="hits">2</td><td class="source"> request = function(_arg, cb) {</td></tr><tr class="hit"><td class="line">125</td><td class="hits">6</td><td class="source"> var exited, headers, host, k, path, protocol, q, query, req, timeout, v;</td></tr><tr class="hit"><td class="line">126</td><td class="hits">6</td><td class="source"> protocol = _arg.protocol, host = _arg.host, path = _arg.path, query = _arg.query, headers = _arg.headers;</td></tr><tr class="hit"><td class="line">127</td><td class="hits">6</td><td class="source"> exited = false;</td></tr><tr class="hit"><td class="line">128</td><td class="hits">6</td><td class="source"> q = query ? '?' + ((function() {</td></tr><tr class="hit"><td class="line">129</td><td class="hits">6</td><td class="source"> var _results;</td></tr><tr class="hit"><td class="line">130</td><td class="hits">6</td><td class="source"> _results = [];</td></tr><tr class="hit"><td class="line">131</td><td class="hits">6</td><td class="source"> for (k in query) {</td></tr><tr class="hit"><td class="line">132</td><td class="hits">16</td><td class="source"> v = query[k];</td></tr><tr class="hit"><td class="line">133</td><td class="hits">16</td><td class="source"> _results.push(&quot;&quot; + k + &quot;=&quot; + v);</td></tr><tr><td class="line">134</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">135</td><td class="hits">6</td><td class="source"> return _results;</td></tr><tr><td class="line">136</td><td class="hits"></td><td class="source"> })()).join('&amp;') : '';</td></tr><tr class="hit"><td class="line">137</td><td class="hits">6</td><td class="source"> req = superagent.get(&quot;&quot; + protocol + &quot;://&quot; + host + path + q);</td></tr><tr class="hit"><td class="line">138</td><td class="hits">6</td><td class="source"> for (k in headers) {</td></tr><tr class="hit"><td class="line">139</td><td class="hits">12</td><td class="source"> v = headers[k];</td></tr><tr class="hit"><td class="line">140</td><td class="hits">12</td><td class="source"> req.set(k, v);</td></tr><tr><td class="line">141</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">142</td><td class="hits">6</td><td class="source"> timeout = setTimeout(function() {</td></tr><tr class="hit"><td class="line">143</td><td class="hits">1</td><td class="source"> exited = true;</td></tr><tr class="hit"><td class="line">144</td><td class="hits">1</td><td class="source"> return cb('Request has timed out');</td></tr><tr><td class="line">145</td><td class="hits"></td><td class="source"> }, config.data.request.timeout);</td></tr><tr class="hit"><td class="line">146</td><td class="hits">6</td><td class="source"> return req.end(function(err, data) {</td></tr><tr class="hit"><td class="line">147</td><td class="hits">6</td><td class="source"> if (exited) {</td></tr><tr class="hit"><td class="line">148</td><td class="hits">1</td><td class="source"> return;</td></tr><tr><td class="line">149</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">150</td><td class="hits">5</td><td class="source"> exited = true;</td></tr><tr class="hit"><td class="line">151</td><td class="hits">5</td><td class="source"> clearTimeout(timeout);</td></tr><tr class="hit"><td class="line">152</td><td class="hits">5</td><td class="source"> return response(err, data, cb);</td></tr><tr><td class="line">153</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">154</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">155</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">156</td><td class="hits">2</td><td class="source"> response = function(err, data, cb) {</td></tr><tr class="hit"><td class="line">157</td><td class="hits">5</td><td class="source"> var _ref;</td></tr><tr class="hit"><td class="line">158</td><td class="hits">5</td><td class="source"> if (err) {</td></tr><tr class="miss"><td class="line">159</td><td class="hits">0</td><td class="source"> return cb(error(err));</td></tr><tr><td class="line">160</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">161</td><td class="hits">5</td><td class="source"> if (data.statusType !== 2) {</td></tr><tr class="hit"><td class="line">162</td><td class="hits">2</td><td class="source"> if ((data != null ? (_ref = data.body) != null ? _ref.message : void 0 : void 0) != null) {</td></tr><tr class="hit"><td class="line">163</td><td class="hits">1</td><td class="source"> return cb(data.body.message);</td></tr><tr><td class="line">164</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">165</td><td class="hits">1</td><td class="source"> return cb(data.error.message);</td></tr><tr><td class="line">166</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">167</td><td class="hits">3</td><td class="source"> return cb(null, data.body);</td></tr><tr><td class="line">168</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">169</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">170</td><td class="hits">2</td><td class="source"> headers = function(token) {</td></tr><tr class="hit"><td class="line">171</td><td class="hits">6</td><td class="source"> var h;</td></tr><tr class="hit"><td class="line">172</td><td class="hits">6</td><td class="source"> h = {</td></tr><tr><td class="line">173</td><td class="hits"></td><td class="source"> 'Content-Type': 'application/json',</td></tr><tr><td class="line">174</td><td class="hits"></td><td class="source"> 'Accept': 'application/vnd.github.v3'</td></tr><tr><td class="line">175</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">176</td><td class="hits">6</td><td class="source"> if (token != null) {</td></tr><tr class="miss"><td class="line">177</td><td class="hits">0</td><td class="source"> h.Authorization = &quot;token &quot; + token;</td></tr><tr><td class="line">178</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">179</td><td class="hits">6</td><td class="source"> return h;</td></tr><tr><td class="line">180</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">181</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">182</td><td class="hits">2</td><td class="source"> isValid = function(obj) {</td></tr><tr class="hit"><td class="line">183</td><td class="hits">6</td><td class="source"> var key, rules, val;</td></tr><tr class="hit"><td class="line">184</td><td class="hits">6</td><td class="source"> rules = {</td></tr><tr><td class="line">185</td><td class="hits"></td><td class="source"> 'owner': function(val) {</td></tr><tr class="hit"><td class="line">186</td><td class="hits">6</td><td class="source"> return val != null;</td></tr><tr><td class="line">187</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">188</td><td class="hits"></td><td class="source"> 'name': function(val) {</td></tr><tr class="hit"><td class="line">189</td><td class="hits">6</td><td class="source"> return val != null;</td></tr><tr><td class="line">190</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">191</td><td class="hits"></td><td class="source"> 'milestone': function(val) {</td></tr><tr class="hit"><td class="line">192</td><td class="hits">5</td><td class="source"> return _.isInt(val);</td></tr><tr><td class="line">193</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">194</td><td class="hits"></td><td class="source"> };</td></tr><tr class="hit"><td class="line">195</td><td class="hits">6</td><td class="source"> for (key in obj) {</td></tr><tr class="hit"><td class="line">196</td><td class="hits">17</td><td class="source"> val = obj[key];</td></tr><tr class="hit"><td class="line">197</td><td class="hits">17</td><td class="source"> if (key in rules &amp;&amp; !rules[key](val)) {</td></tr><tr class="miss"><td class="line">198</td><td class="hits">0</td><td class="source"> return false;</td></tr><tr><td class="line">199</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">200</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">201</td><td class="hits">6</td><td class="source"> return true;</td></tr><tr><td class="line">202</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">203</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">204</td><td class="hits">2</td><td class="source"> isReady = user.data.ready;</td></tr><tr><td class="line">205</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">206</td><td class="hits">2</td><td class="source"> stack = [];</td></tr><tr><td class="line">207</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">208</td><td class="hits">2</td><td class="source"> ready = function(cb) {</td></tr><tr class="hit"><td class="line">209</td><td class="hits">6</td><td class="source"> if (isReady) {</td></tr><tr class="hit"><td class="line">210</td><td class="hits">6</td><td class="source"> return cb();</td></tr><tr><td class="line">211</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="miss"><td class="line">212</td><td class="hits">0</td><td class="source"> return stack.push(cb);</td></tr><tr><td class="line">213</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">214</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">215</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">216</td><td class="hits">2</td><td class="source"> user.observe('ready', function(val) {</td></tr><tr class="hit"><td class="line">217</td><td class="hits">4</td><td class="source"> var _results;</td></tr><tr class="hit"><td class="line">218</td><td class="hits">4</td><td class="source"> isReady = val;</td></tr><tr class="hit"><td class="line">219</td><td class="hits">4</td><td class="source"> if (val) {</td></tr><tr class="hit"><td class="line">220</td><td class="hits">2</td><td class="source"> _results = [];</td></tr><tr class="hit"><td class="line">221</td><td class="hits">2</td><td class="source"> while (stack.length) {</td></tr><tr class="miss"><td class="line">222</td><td class="hits">0</td><td class="source"> _results.push(stack.shift()());</td></tr><tr><td class="line">223</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">224</td><td class="hits">2</td><td class="source"> return _results;</td></tr><tr><td class="line">225</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">226</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">227</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">228</td><td class="hits">2</td><td class="source"> error = function(err) {</td></tr><tr class="miss"><td class="line">229</td><td class="hits">0</td><td class="source"> var message;</td></tr><tr class="miss"><td class="line">230</td><td class="hits">0</td><td class="source"> switch (false) {</td></tr><tr><td class="line">231</td><td class="hits"></td><td class="source"> case !_.isString(err):</td></tr><tr class="miss"><td class="line">232</td><td class="hits">0</td><td class="source"> message = err;</td></tr><tr class="miss"><td class="line">233</td><td class="hits">0</td><td class="source"> break;</td></tr><tr><td class="line">234</td><td class="hits"></td><td class="source"> case !_.isArray(err):</td></tr><tr class="miss"><td class="line">235</td><td class="hits">0</td><td class="source"> message = err[1];</td></tr><tr class="miss"><td class="line">236</td><td class="hits">0</td><td class="source"> break;</td></tr><tr><td class="line">237</td><td class="hits"></td><td class="source"> case !(_.isObject(err) &amp;&amp; _.isString(err.message)):</td></tr><tr class="miss"><td class="line">238</td><td class="hits">0</td><td class="source"> message = err.message;</td></tr><tr><td class="line">239</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">240</td><td class="hits">0</td><td class="source"> if (!message) {</td></tr><tr class="miss"><td class="line">241</td><td class="hits">0</td><td class="source"> try {</td></tr><tr class="miss"><td class="line">242</td><td class="hits">0</td><td class="source"> message = JSON.stringify(err);</td></tr><tr><td class="line">243</td><td class="hits"></td><td class="source"> } catch (_error) {</td></tr><tr class="miss"><td class="line">244</td><td class="hits">0</td><td class="source"> message = err.toString();</td></tr><tr><td class="line">245</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">246</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">247</td><td class="hits">0</td><td class="source"> return message;</td></tr><tr><td class="line">248</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">249</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">250</td><td class="hits"></td><td class="source">}).call(this);</td></tr><tr><td class="line">251</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/home/radek/dev/burnchart/src/modules/mediator.coffee">/home/radek/dev/burnchart/src/modules/mediator.coffee</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">5</div><div class="hits">5</div><div class="misses">0</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">(function() {</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source"> var Mediator, Ractive;</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source"> Ractive = require('ractive');</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source"> Mediator = Ractive.extend({});</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">8</td><td class="hits">1</td><td class="source"> module.exports = new Mediator();</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source">}).call(this);</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/home/radek/dev/burnchart/src/modules/stats.coffee">/home/radek/dev/burnchart/src/modules/stats.coffee</h2><div id="stats" class="high"><div class="percentage">97%</div><div class="sloc">34</div><div class="hits">33</div><div class="misses">1</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">(function() {</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source"> var moment, progress;</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source"> moment = require('moment');</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source"> progress = function(a, b) {</td></tr><tr class="hit"><td class="line">7</td><td class="hits">6</td><td class="source"> if (a + b === 0) {</td></tr><tr class="miss"><td class="line">8</td><td class="hits">0</td><td class="source"> return 0;</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="hit"><td class="line">10</td><td class="hits">6</td><td class="source"> return 100 * (a / (b + a));</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">14</td><td class="hits">1</td><td class="source"> module.exports = function(milestone) {</td></tr><tr class="hit"><td class="line">15</td><td class="hits">19</td><td class="source"> var a, b, c, days, isDone, isEmpty, isOnTime, isOverdue, points, time;</td></tr><tr class="hit"><td class="line">16</td><td class="hits">19</td><td class="source"> if (milestone.stats != null) {</td></tr><tr class="hit"><td class="line">17</td><td class="hits">14</td><td class="source"> return milestone.stats;</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">19</td><td class="hits">5</td><td class="source"> isDone = false;</td></tr><tr class="hit"><td class="line">20</td><td class="hits">5</td><td class="source"> isOnTime = true;</td></tr><tr class="hit"><td class="line">21</td><td class="hits">5</td><td class="source"> isOverdue = false;</td></tr><tr class="hit"><td class="line">22</td><td class="hits">5</td><td class="source"> isEmpty = true;</td></tr><tr class="hit"><td class="line">23</td><td class="hits">5</td><td class="source"> points = 0;</td></tr><tr class="hit"><td class="line">24</td><td class="hits">5</td><td class="source"> a = milestone.issues.closed.size;</td></tr><tr class="hit"><td class="line">25</td><td class="hits">5</td><td class="source"> b = milestone.issues.open.size;</td></tr><tr class="hit"><td class="line">26</td><td class="hits">5</td><td class="source"> if (a + b &gt; 0) {</td></tr><tr class="hit"><td class="line">27</td><td class="hits">3</td><td class="source"> isEmpty = false;</td></tr><tr class="hit"><td class="line">28</td><td class="hits">3</td><td class="source"> points = progress(a, b);</td></tr><tr class="hit"><td class="line">29</td><td class="hits">3</td><td class="source"> if (points === 100) {</td></tr><tr class="hit"><td class="line">30</td><td class="hits">1</td><td class="source"> isDone = true;</td></tr><tr><td class="line">31</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">32</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">33</td><td class="hits">5</td><td class="source"> if (milestone.due_on == null) {</td></tr><tr class="hit"><td class="line">34</td><td class="hits">2</td><td class="source"> return {</td></tr><tr><td class="line">35</td><td class="hits"></td><td class="source"> isOverdue: isOverdue,</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> isOnTime: isOnTime,</td></tr><tr><td class="line">37</td><td class="hits"></td><td class="source"> isDone: isDone,</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> isEmpty: isEmpty,</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> 'progress': {</td></tr><tr><td class="line">40</td><td class="hits"></td><td class="source"> points: points</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">44</td><td class="hits">3</td><td class="source"> a = +new Date(milestone.created_at);</td></tr><tr class="hit"><td class="line">45</td><td class="hits">3</td><td class="source"> b = +(new Date);</td></tr><tr class="hit"><td class="line">46</td><td class="hits">3</td><td class="source"> c = +new Date(milestone.due_on);</td></tr><tr class="hit"><td class="line">47</td><td class="hits">3</td><td class="source"> if (b &gt; c) {</td></tr><tr class="hit"><td class="line">48</td><td class="hits">1</td><td class="source"> isOverdue = true;</td></tr><tr><td class="line">49</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">50</td><td class="hits">3</td><td class="source"> time = progress(b - a, c - b);</td></tr><tr class="hit"><td class="line">51</td><td class="hits">3</td><td class="source"> days = (moment(b).diff(moment(a), 'days')) / 100;</td></tr><tr class="hit"><td class="line">52</td><td class="hits">3</td><td class="source"> isOnTime = points &gt; time;</td></tr><tr class="hit"><td class="line">53</td><td class="hits">3</td><td class="source"> return {</td></tr><tr><td class="line">54</td><td class="hits"></td><td class="source"> isDone: isDone,</td></tr><tr><td class="line">55</td><td class="hits"></td><td class="source"> days: days,</td></tr><tr><td class="line">56</td><td class="hits"></td><td class="source"> isOnTime: isOnTime,</td></tr><tr><td class="line">57</td><td class="hits"></td><td class="source"> isOverdue: isOverdue,</td></tr><tr><td class="line">58</td><td class="hits"></td><td class="source"> 'progress': {</td></tr><tr><td class="line">59</td><td class="hits"></td><td class="source"> points: points,</td></tr><tr><td class="line">60</td><td class="hits"></td><td class="source"> time: time</td></tr><tr><td class="line">61</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">62</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">63</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">64</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">65</td><td class="hits"></td><td class="source">}).call(this);</td></tr><tr><td class="line">66</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/home/radek/dev/burnchart/src/utils/mixins.coffee">/home/radek/dev/burnchart/src/utils/mixins.coffee</h2><div id="stats" class="high"><div class="percentage">92%</div><div class="sloc">13</div><div class="hits">12</div><div class="misses">1</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">(function() {</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source"> var _;</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source"> _ = require('lodash');</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source"> _.mixin({</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> 'pluckMany': function(source, keys) {</td></tr><tr class="hit"><td class="line">8</td><td class="hits">26</td><td class="source"> if (!_.isArray(keys)) {</td></tr><tr class="miss"><td class="line">9</td><td class="hits">0</td><td class="source"> throw '`keys` needs to be an Array';</td></tr><tr><td class="line">10</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">11</td><td class="hits">26</td><td class="source"> return _.map(source, function(item) {</td></tr><tr class="hit"><td class="line">12</td><td class="hits">20</td><td class="source"> var obj;</td></tr><tr class="hit"><td class="line">13</td><td class="hits">20</td><td class="source"> obj = {};</td></tr><tr class="hit"><td class="line">14</td><td class="hits">20</td><td class="source"> _.each(keys, function(key) {</td></tr><tr class="hit"><td class="line">15</td><td class="hits">40</td><td class="source"> return obj[key] = item[key];</td></tr><tr><td class="line">16</td><td class="hits"></td><td class="source"> });</td></tr><tr class="hit"><td class="line">17</td><td class="hits">20</td><td class="source"> return obj;</td></tr><tr><td class="line">18</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">19</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> 'isInt': function(val) {</td></tr><tr class="hit"><td class="line">21</td><td class="hits">5</td><td class="source"> return !isNaN(val) &amp;&amp; parseInt(Number(val)) === val &amp;&amp; !isNaN(parseInt(val, 10));</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">25</td><td class="hits"></td><td class="source">}).call(this);</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/home/radek/dev/burnchart/src/utils/ractive/eventful.coffee">/home/radek/dev/burnchart/src/utils/ractive/eventful.coffee</h2><div id="stats" class="low"><div class="percentage">45%</div><div class="sloc">24</div><div class="hits">11</div><div class="misses">13</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">(function() {</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source"> var Ractive, mediator, _;</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source"> _ = require('lodash');</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source"> Ractive = require('ractive');</td></tr><tr><td class="line">7</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">8</td><td class="hits">1</td><td class="source"> mediator = require('../../modules/mediator.coffee');</td></tr><tr><td class="line">9</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">10</td><td class="hits">1</td><td class="source"> module.exports = Ractive.extend({</td></tr><tr><td class="line">11</td><td class="hits"></td><td class="source"> subscribe: function(name, cb, ctx) {</td></tr><tr class="hit"><td class="line">12</td><td class="hits">2</td><td class="source"> if (ctx == null) {</td></tr><tr class="miss"><td class="line">13</td><td class="hits">0</td><td class="source"> ctx = this;</td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">15</td><td class="hits">2</td><td class="source"> if (!_.isArray(this._subs)) {</td></tr><tr class="hit"><td class="line">16</td><td class="hits">1</td><td class="source"> this._subs = [];</td></tr><tr><td class="line">17</td><td class="hits"></td><td class="source"> }</td></tr><tr class="hit"><td class="line">18</td><td class="hits">2</td><td class="source"> if (_.isFunction(cb)) {</td></tr><tr class="hit"><td class="line">19</td><td class="hits">2</td><td class="source"> return this._subs.push(mediator.on(name, _.bind(cb, ctx)));</td></tr><tr><td class="line">20</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="miss"><td class="line">21</td><td class="hits">0</td><td class="source"> return console.log(&quot;Warning: `cb` is not a function&quot;);</td></tr><tr><td class="line">22</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">23</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">24</td><td class="hits"></td><td class="source"> publish: function() {</td></tr><tr class="miss"><td class="line">25</td><td class="hits">0</td><td class="source"> return mediator.fire.apply(mediator, arguments);</td></tr><tr><td class="line">26</td><td class="hits"></td><td class="source"> },</td></tr><tr><td class="line">27</td><td class="hits"></td><td class="source"> onteardown: function() {</td></tr><tr class="miss"><td class="line">28</td><td class="hits">0</td><td class="source"> var sub, _i, _len, _ref, _results;</td></tr><tr class="miss"><td class="line">29</td><td class="hits">0</td><td class="source"> if (_.isArray(this._subs)) {</td></tr><tr class="miss"><td class="line">30</td><td class="hits">0</td><td class="source"> _ref = this._subs;</td></tr><tr class="miss"><td class="line">31</td><td class="hits">0</td><td class="source"> _results = [];</td></tr><tr class="miss"><td class="line">32</td><td class="hits">0</td><td class="source"> for (_i = 0, _len = _ref.length; _i &lt; _len; _i++) {</td></tr><tr class="miss"><td class="line">33</td><td class="hits">0</td><td class="source"> sub = _ref[_i];</td></tr><tr class="miss"><td class="line">34</td><td class="hits">0</td><td class="source"> if (_.isFunction(sub.cancel)) {</td></tr><tr class="miss"><td class="line">35</td><td class="hits">0</td><td class="source"> _results.push(sub.cancel());</td></tr><tr><td class="line">36</td><td class="hits"></td><td class="source"> } else {</td></tr><tr class="miss"><td class="line">37</td><td class="hits">0</td><td class="source"> _results.push(console.log(&quot;Warning: `sub.cancel` is not a function&quot;));</td></tr><tr><td class="line">38</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">39</td><td class="hits"></td><td class="source"> }</td></tr><tr class="miss"><td class="line">40</td><td class="hits">0</td><td class="source"> return _results;</td></tr><tr><td class="line">41</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">42</td><td class="hits"></td><td class="source"> }</td></tr><tr><td class="line">43</td><td class="hits"></td><td class="source"> });</td></tr><tr><td class="line">44</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">45</td><td class="hits"></td><td class="source">}).call(this);</td></tr><tr><td class="line">46</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div><div class="file"><h2 id="/home/radek/dev/burnchart/src/utils/ractive/model.coffee">/home/radek/dev/burnchart/src/utils/ractive/model.coffee</h2><div id="stats" class="high"><div class="percentage">100%</div><div class="sloc">9</div><div class="hits">9</div><div class="misses">0</div></div><table id="source"><thead><tr><th>Line</th><th>Hits</th><th>Source</th></tr></thead><tbody><tr class="hit"><td class="line">1</td><td class="hits">1</td><td class="source">(function() {</td></tr><tr class="hit"><td class="line">2</td><td class="hits">1</td><td class="source"> var Eventful;</td></tr><tr><td class="line">3</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">4</td><td class="hits">1</td><td class="source"> Eventful = require('./eventful.coffee');</td></tr><tr><td class="line">5</td><td class="hits"></td><td class="source"> </td></tr><tr class="hit"><td class="line">6</td><td class="hits">1</td><td class="source"> module.exports = function(opts) {</td></tr><tr class="hit"><td class="line">7</td><td class="hits">3</td><td class="source"> var Model, model;</td></tr><tr class="hit"><td class="line">8</td><td class="hits">3</td><td class="source"> Model = Eventful.extend(opts);</td></tr><tr class="hit"><td class="line">9</td><td class="hits">3</td><td class="source"> model = new Model();</td></tr><tr class="hit"><td class="line">10</td><td class="hits">3</td><td class="source"> model.render();</td></tr><tr class="hit"><td class="line">11</td><td class="hits">3</td><td class="source"> return model;</td></tr><tr><td class="line">12</td><td class="hits"></td><td class="source"> };</td></tr><tr><td class="line">13</td><td class="hits"></td><td class="source"> </td></tr><tr><td class="line">14</td><td class="hits"></td><td class="source">}).call(this);</td></tr><tr><td class="line">15</td><td class="hits"></td><td class="source"> </td></tr></tbody></table></div></div></div></body></html>