cubism-rails 1.2.2 → 1.5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +3 -3
- data/lib/cubism-rails/version.rb +1 -1
- data/vendor/assets/javascripts/cubism.js +307 -2
- data/vendor/assets/javascripts/cubism.min.js +1 -1
- metadata +13 -17
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2a2636391b5921e934f476fc315d9292cbe0def8
|
4
|
+
data.tar.gz: 2b51c1a2cacc36aa86f88efe2c57882a96b01627
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 756f9289fc742f8e94cb386b794f9ab3b22827162fd36f211090e4bbcd722d38ad01bc322872147fdae2eb8648894796de1fe8b7aa8b60b05a082e0c5be855be
|
7
|
+
data.tar.gz: a78c6d692b9c47cbd562b0a9eea3efc4d85347b0547b290ec0cd34ecffea145e4b8e093090ad24ddaa8c2743636903fe40c64d8a2568dbbbc925d64256e53cbc
|
data/README.md
CHANGED
@@ -6,15 +6,15 @@ Cubism.js is a [D3](http://mbostock.github.com/d3/) plugin for visualizing time
|
|
6
6
|
|
7
7
|
Add the following to your gemfile:
|
8
8
|
|
9
|
-
|
9
|
+
gem 'cubism-rails'
|
10
10
|
|
11
11
|
And then execute:
|
12
12
|
|
13
|
-
|
13
|
+
$ bundle
|
14
14
|
|
15
15
|
Add the following directive to your JavaScript manifest file (application.js):
|
16
16
|
|
17
|
-
|
17
|
+
//= require cubism
|
18
18
|
|
19
19
|
## Contributing
|
20
20
|
|
data/lib/cubism-rails/version.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
(function(exports){
|
2
|
-
var cubism = exports.cubism = {version: "1.
|
2
|
+
var cubism = exports.cubism = {version: "1.5.0"};
|
3
3
|
var cubism_id = 0;
|
4
4
|
function cubism_identity(d) { return d; }
|
5
5
|
cubism.option = function(name, defaultValue) {
|
@@ -185,6 +185,210 @@ cubism_contextPrototype.cube = function(host) {
|
|
185
185
|
};
|
186
186
|
|
187
187
|
var cubism_cubeFormatDate = d3.time.format.iso;
|
188
|
+
/* librato (http://dev.librato.com/v1/post/metrics) source
|
189
|
+
* If you want to see an example of how to use this source, check: https://gist.github.com/drio/5792680
|
190
|
+
*/
|
191
|
+
cubism_contextPrototype.librato = function(user, token) {
|
192
|
+
var source = {},
|
193
|
+
context = this;
|
194
|
+
auth_string = "Basic " + btoa(user + ":" + token);
|
195
|
+
enable_log = true,
|
196
|
+
avail_rsts = [ 1, 60, 900, 3600 ];
|
197
|
+
|
198
|
+
function log(msg) { if (enable_log) console.log(msg); }
|
199
|
+
|
200
|
+
function log_interval(start, stop, step) {
|
201
|
+
log("---------------------- Starting request");
|
202
|
+
log("START: " + new Date(start * 1000));
|
203
|
+
log("STOP : " + new Date(stop * 1000));
|
204
|
+
log("STEP : " + step);
|
205
|
+
var nes_num_mes = (stop - start)/step;
|
206
|
+
log("# of measurements necessary: " + nes_num_mes);
|
207
|
+
}
|
208
|
+
|
209
|
+
/* Given a step, find the best librato resolution to use.
|
210
|
+
*
|
211
|
+
* Example:
|
212
|
+
*
|
213
|
+
* (s) : cubism step
|
214
|
+
*
|
215
|
+
* avail_rsts 1 --------------- 60 --------------- 900 ---------------- 3600
|
216
|
+
* | (s) |
|
217
|
+
* | |
|
218
|
+
* [low_res top_res]
|
219
|
+
*
|
220
|
+
* return: low_res (60)
|
221
|
+
*/
|
222
|
+
function find_ideal_librato_resolution(step) {
|
223
|
+
var highest_res = avail_rsts[0],
|
224
|
+
lowest_res = avail_rsts[avail_rsts.length]; // high and lowest available resolution from librato
|
225
|
+
|
226
|
+
/* If step is outside the highest or lowest librato resolution, pick them and we are done */
|
227
|
+
if (step >= lowest_res)
|
228
|
+
return lowest_res;
|
229
|
+
|
230
|
+
if (step <= highest_res)
|
231
|
+
return highest_res;
|
232
|
+
|
233
|
+
/* If not, find in what resolution interval the step lands. */
|
234
|
+
var iof, top_res, i;
|
235
|
+
for (i=step; i<=lowest_res; i++) {
|
236
|
+
iof = avail_rsts.indexOf(i);
|
237
|
+
if (iof > -1) {
|
238
|
+
top_res = avail_rsts[iof];
|
239
|
+
break;
|
240
|
+
}
|
241
|
+
}
|
242
|
+
|
243
|
+
var low_res;
|
244
|
+
for (i=step; i>=highest_res; i--) {
|
245
|
+
iof = avail_rsts.indexOf(i);
|
246
|
+
if (iof > -1) {
|
247
|
+
low_res = avail_rsts[iof];
|
248
|
+
break;
|
249
|
+
}
|
250
|
+
}
|
251
|
+
|
252
|
+
/* What's the closest librato resolution given the step ? */
|
253
|
+
return ((top_res-step) < (step-low_res)) ? top_res : low_res;
|
254
|
+
}
|
255
|
+
|
256
|
+
function find_librato_resolution(sdate, edate, step) {
|
257
|
+
var i_size = edate - sdate, // interval size
|
258
|
+
month = 2419200,
|
259
|
+
week = 604800,
|
260
|
+
two_days = 172800,
|
261
|
+
ideal_res;
|
262
|
+
|
263
|
+
if (i_size > month)
|
264
|
+
return 3600;
|
265
|
+
|
266
|
+
ideal_res = find_ideal_librato_resolution(step);
|
267
|
+
|
268
|
+
/*
|
269
|
+
* Now we have the ideal resolution, but due to the retention policies at librato, maybe we have
|
270
|
+
* to use a higher resolution.
|
271
|
+
* http://support.metrics.librato.com/knowledgebase/articles/66838-understanding-metrics-roll-ups-retention-and-grap
|
272
|
+
*/
|
273
|
+
if (i_size > week && ideal_res < 900)
|
274
|
+
return 900;
|
275
|
+
else if (i_size > two_days && ideal_res < 60)
|
276
|
+
return 60;
|
277
|
+
else
|
278
|
+
return ideal_res;
|
279
|
+
}
|
280
|
+
|
281
|
+
/* All the logic to query the librato API is here */
|
282
|
+
var librato_request = function(metric, source) {
|
283
|
+
var url_prefix = "https://metrics-api.librato.com/v1/metrics";
|
284
|
+
|
285
|
+
function make_url(sdate, edate, step) {
|
286
|
+
var params = "start_time=" + sdate +
|
287
|
+
"&end_time=" + edate +
|
288
|
+
"&resolution=" + find_librato_resolution(sdate, edate, step);
|
289
|
+
full_url = url_prefix + "/" + metric + "?" + params;
|
290
|
+
|
291
|
+
log("full_url = " + full_url);
|
292
|
+
log_interval(sdate, edate, step);
|
293
|
+
return full_url;
|
294
|
+
}
|
295
|
+
|
296
|
+
/*
|
297
|
+
* We are most likely not going to get the same number of measurements
|
298
|
+
* cubism expects for a particular context: We have to perform down/up
|
299
|
+
* sampling
|
300
|
+
*/
|
301
|
+
function down_up_sampling(isdate, iedate, step, librato_mm) {
|
302
|
+
var av = [];
|
303
|
+
|
304
|
+
for (i=isdate; i<=iedate; i+=step) {
|
305
|
+
var int_mes = [];
|
306
|
+
while (librato_mm.length && librato_mm[0].measure_time <= i) {
|
307
|
+
int_mes.push(librato_mm.shift().value);
|
308
|
+
}
|
309
|
+
|
310
|
+
var v;
|
311
|
+
if (int_mes.length) { /* Compute the average */
|
312
|
+
v = int_mes.reduce(function(a, b) { return a + b }) / int_mes.length;
|
313
|
+
} else { /* No librato values on interval */
|
314
|
+
v = (av.length) ? av[av.length-1] : 0;
|
315
|
+
}
|
316
|
+
av.push(v);
|
317
|
+
}
|
318
|
+
|
319
|
+
return av;
|
320
|
+
}
|
321
|
+
|
322
|
+
request = {};
|
323
|
+
|
324
|
+
request.fire = function(isdate, iedate, step, callback_done) {
|
325
|
+
var a_values = []; /* Store partial values from librato */
|
326
|
+
|
327
|
+
/*
|
328
|
+
* Librato has a limit in the number of measurements we get back in a request (100).
|
329
|
+
* We recursively perform requests to the API to ensure we have all the data points
|
330
|
+
* for the interval we are working on.
|
331
|
+
*/
|
332
|
+
function actual_request(full_url) {
|
333
|
+
d3.json(full_url)
|
334
|
+
.header("X-Requested-With", "XMLHttpRequest")
|
335
|
+
.header("Authorization", auth_string)
|
336
|
+
.header("Librato-User-Agent", 'cubism/' + cubism.version)
|
337
|
+
.get(function (error, data) { /* Callback; data available */
|
338
|
+
if (!error) {
|
339
|
+
log("# of partial measurements: " + data.measurements[source].length);
|
340
|
+
data.measurements[source].forEach(function(o) { a_values.push(o); });
|
341
|
+
|
342
|
+
var still_more_values = 'query' in data && 'next_time' in data.query;
|
343
|
+
if (still_more_values) {
|
344
|
+
log("Requesting more values");
|
345
|
+
actual_request(make_url(data.query.next_time, iedate, step));
|
346
|
+
} else {
|
347
|
+
log("total number of measurements from librato: " + a_values.length);
|
348
|
+
var a_adjusted = down_up_sampling(isdate, iedate, step, a_values);
|
349
|
+
log("number of measurements after adjusting time values: " + a_adjusted.length);
|
350
|
+
callback_done(a_adjusted);
|
351
|
+
}
|
352
|
+
} else {
|
353
|
+
log("There was an error when performing the librato request:");
|
354
|
+
log(error);
|
355
|
+
}
|
356
|
+
});
|
357
|
+
}
|
358
|
+
|
359
|
+
actual_request(make_url(isdate, iedate, step));
|
360
|
+
};
|
361
|
+
|
362
|
+
return request;
|
363
|
+
};
|
364
|
+
|
365
|
+
/*
|
366
|
+
* The user will use this method to create a cubism source (librato in this case)
|
367
|
+
* and call .metric() as necessary to create metrics.
|
368
|
+
*/
|
369
|
+
source.metric = function(m_name, m_source) {
|
370
|
+
return context.metric(function(start, stop, step, callback) {
|
371
|
+
/* All the librato logic is here; .fire() retrieves the metrics' data */
|
372
|
+
librato_request(m_name, m_source)
|
373
|
+
.fire(cubism_libratoFormatDate(start),
|
374
|
+
cubism_libratoFormatDate(stop),
|
375
|
+
cubism_libratoFormatDate(step),
|
376
|
+
function(a_values) { callback(null, a_values); });
|
377
|
+
|
378
|
+
}, m_name += "");
|
379
|
+
};
|
380
|
+
|
381
|
+
/* This is not used when the source is librato */
|
382
|
+
source.toString = function() {
|
383
|
+
return "librato";
|
384
|
+
};
|
385
|
+
|
386
|
+
return source;
|
387
|
+
};
|
388
|
+
|
389
|
+
var cubism_libratoFormatDate = function(time) {
|
390
|
+
return Math.floor(time / 1000);
|
391
|
+
};
|
188
392
|
cubism_contextPrototype.graphite = function(host) {
|
189
393
|
if (!arguments.length) host = "";
|
190
394
|
var source = {},
|
@@ -254,6 +458,99 @@ function cubism_graphiteParse(text) {
|
|
254
458
|
.slice(1) // the first value is always None?
|
255
459
|
.map(function(d) { return +d; });
|
256
460
|
}
|
461
|
+
cubism_contextPrototype.gangliaWeb = function(config) {
|
462
|
+
var host = '',
|
463
|
+
uriPathPrefix = '/ganglia2/';
|
464
|
+
|
465
|
+
if (arguments.length) {
|
466
|
+
if (config.host) {
|
467
|
+
host = config.host;
|
468
|
+
}
|
469
|
+
|
470
|
+
if (config.uriPathPrefix) {
|
471
|
+
uriPathPrefix = config.uriPathPrefix;
|
472
|
+
|
473
|
+
/* Add leading and trailing slashes, as appropriate. */
|
474
|
+
if( uriPathPrefix[0] != '/' ) {
|
475
|
+
uriPathPrefix = '/' + uriPathPrefix;
|
476
|
+
}
|
477
|
+
|
478
|
+
if( uriPathPrefix[uriPathPrefix.length - 1] != '/' ) {
|
479
|
+
uriPathPrefix += '/';
|
480
|
+
}
|
481
|
+
}
|
482
|
+
}
|
483
|
+
|
484
|
+
var source = {},
|
485
|
+
context = this;
|
486
|
+
|
487
|
+
source.metric = function(metricInfo) {
|
488
|
+
|
489
|
+
/* Store the members from metricInfo into local variables. */
|
490
|
+
var clusterName = metricInfo.clusterName,
|
491
|
+
metricName = metricInfo.metricName,
|
492
|
+
hostName = metricInfo.hostName,
|
493
|
+
isReport = metricInfo.isReport || false,
|
494
|
+
titleGenerator = metricInfo.titleGenerator ||
|
495
|
+
/* Reasonable (not necessarily pretty) default for titleGenerator. */
|
496
|
+
function(unusedMetricInfo) {
|
497
|
+
/* unusedMetricInfo is, well, unused in this default case. */
|
498
|
+
return ('clusterName:' + clusterName +
|
499
|
+
' metricName:' + metricName +
|
500
|
+
(hostName ? ' hostName:' + hostName : ''));
|
501
|
+
},
|
502
|
+
onChangeCallback = metricInfo.onChangeCallback;
|
503
|
+
|
504
|
+
/* Default to plain, simple metrics. */
|
505
|
+
var metricKeyName = isReport ? 'g' : 'm';
|
506
|
+
|
507
|
+
var gangliaWebMetric = context.metric(function(start, stop, step, callback) {
|
508
|
+
|
509
|
+
function constructGangliaWebRequestQueryParams() {
|
510
|
+
return ('c=' + clusterName +
|
511
|
+
'&' + metricKeyName + '=' + metricName +
|
512
|
+
(hostName ? '&h=' + hostName : '') +
|
513
|
+
'&cs=' + start/1000 + '&ce=' + stop/1000 + '&step=' + step/1000 + '&graphlot=1');
|
514
|
+
}
|
515
|
+
|
516
|
+
d3.json(host + uriPathPrefix + 'graph.php?' + constructGangliaWebRequestQueryParams(),
|
517
|
+
function(result) {
|
518
|
+
if( !result ) {
|
519
|
+
return callback(new Error("Unable to fetch GangliaWeb data"));
|
520
|
+
}
|
521
|
+
|
522
|
+
callback(null, result[0].data);
|
523
|
+
});
|
524
|
+
|
525
|
+
}, titleGenerator(metricInfo));
|
526
|
+
|
527
|
+
gangliaWebMetric.toString = function() {
|
528
|
+
return titleGenerator(metricInfo);
|
529
|
+
};
|
530
|
+
|
531
|
+
/* Allow users to run their custom code each time a gangliaWebMetric changes.
|
532
|
+
*
|
533
|
+
* TODO Consider abstracting away the naked Cubism call, and instead exposing
|
534
|
+
* a callback that takes in the values array (maybe alongwith the original
|
535
|
+
* start and stop 'naked' parameters), since it's handy to have the entire
|
536
|
+
* dataset at your disposal (and users will likely implement onChangeCallback
|
537
|
+
* primarily to get at this dataset).
|
538
|
+
*/
|
539
|
+
if (onChangeCallback) {
|
540
|
+
gangliaWebMetric.on('change', onChangeCallback);
|
541
|
+
}
|
542
|
+
|
543
|
+
return gangliaWebMetric;
|
544
|
+
};
|
545
|
+
|
546
|
+
// Returns the gangliaWeb host + uriPathPrefix.
|
547
|
+
source.toString = function() {
|
548
|
+
return host + uriPathPrefix;
|
549
|
+
};
|
550
|
+
|
551
|
+
return source;
|
552
|
+
};
|
553
|
+
|
257
554
|
function cubism_metric(context) {
|
258
555
|
if (!(context instanceof cubism_context)) throw new Error("invalid context");
|
259
556
|
this.context = context;
|
@@ -547,6 +844,7 @@ cubism_contextPrototype.horizon = function() {
|
|
547
844
|
for (var i = i0, n = width, y1; i < n; ++i) {
|
548
845
|
y1 = metric_.valueAt(i);
|
549
846
|
if (y1 <= 0) { negative = true; continue; }
|
847
|
+
if (y1 === undefined) continue;
|
550
848
|
canvas.fillRect(i, y1 = scale(y1), 1, y0 - y1);
|
551
849
|
}
|
552
850
|
}
|
@@ -904,9 +1202,10 @@ cubism_contextPrototype.axis = function() {
|
|
904
1202
|
scale = context.scale,
|
905
1203
|
axis_ = d3.svg.axis().scale(scale);
|
906
1204
|
|
907
|
-
var
|
1205
|
+
var formatDefault = context.step() < 6e4 ? cubism_axisFormatSeconds
|
908
1206
|
: context.step() < 864e5 ? cubism_axisFormatMinutes
|
909
1207
|
: cubism_axisFormatDays;
|
1208
|
+
var format = formatDefault;
|
910
1209
|
|
911
1210
|
function axis(selection) {
|
912
1211
|
var id = ++cubism_id,
|
@@ -953,6 +1252,12 @@ cubism_contextPrototype.axis = function() {
|
|
953
1252
|
}
|
954
1253
|
};
|
955
1254
|
|
1255
|
+
axis.focusFormat = function(_) {
|
1256
|
+
if (!arguments.length) return format == formatDefault ? null : _;
|
1257
|
+
format = _ == null ? formatDefault : _;
|
1258
|
+
return axis;
|
1259
|
+
};
|
1260
|
+
|
956
1261
|
return d3.rebind(axis, axis_,
|
957
1262
|
"orient",
|
958
1263
|
"ticks",
|
@@ -1 +1 @@
|
|
1
|
-
(function(a){function d(a){return a}function e(){}function h(a){return Math.floor(a/1e3)}function i(a){var b=a.indexOf("|"),c=a.substring(0,b),d=c.lastIndexOf(","),e=c.lastIndexOf(",",d-1),f=c.lastIndexOf(",",e-1),g=c.substring(f+1,e)*1e3,h=c.substring(d+1)*1e3;return a.substring(b+1).split(",").slice(1).map(function(a){return+a})}function j(a){if(!(a instanceof e))throw new Error("invalid context");this.context=a}function m(a,b){return function(c,d,e,f){a(new Date(+c+b),new Date(+d+b),e,f)}}function n(a,b){j.call(this,a),b=+b;var c=b+"";this.valueOf=function(){return b},this.toString=function(){return c}}function p(a,b){function c(b,c){if(c instanceof j){if(b.context!==c.context)throw new Error("mismatch context")}else c=new n(b.context,c);j.call(this,b.context),this.left=b,this.right=c,this.toString=function(){return b+" "+a+" "+c}}var d=c.prototype=Object.create(j.prototype);return d.valueAt=function(a){return b(this.left.valueAt(a),this.right.valueAt(a))},d.shift=function(a){return new c(this.left.shift(a),this.right.shift(a))},d.on=function(a,b){return arguments.length<2?this.left.on(a):(this.left.on(a,b),this.right.on(a,b),this)},function(a){return new c(this,a)}}function s(a){return a&16777214}function t(a){return(a+1&16777214)-1}function x(a){a.style("position","absolute").style("top",0).style("bottom",0).style("width","1px").style("pointer-events","none")}function y(a){return a+"px"}var b=a.cubism={version:"1.2.2"},c=0;b.option=function(a,c){var d=b.options(a);return d.length?d[0]:c},b.options=function(a,b){var c=location.search.substring(1).split("&"),d=[],e=-1,f=c.length,g;while(++e<f)(g=c[e].split("="))[0]==a&&d.push(decodeURIComponent(g[1]));return d.length||arguments.length<2?d:b},b.context=function(){function p(){var c=Date.now();return g=new Date(Math.floor((c-j-k)/b)*b),f=new Date(g-d*b),i=new Date(Math.floor((c-j)/b)*b),h=new Date(i-d*b),m.domain([f,g]),a}var a=new e,b=1e4,d=1440,f,g,h,i,j=5e3,k=5e3,l=d3.dispatch("prepare","beforechange","change","focus"),m=a.scale=d3.time.scale().range([0,d]),n,o;return a.start=function(){n&&clearTimeout(n);var c=+i+j-Date.now();return c<k&&(c+=b),n=setTimeout(function e(){i=new Date(Math.floor((Date.now()-j)/b)*b),h=new Date(i-d*b),l.prepare.call(a,h,i),setTimeout(function(){m.domain([f=h,g=i]),l.beforechange.call(a,h,i),l.change.call(a,h,i),l.focus.call(a,o)},k),n=setTimeout(e,b)},c),a},a.stop=function(){return n=clearTimeout(n),a},n=setTimeout(a.start,10),a.step=function(a){return arguments.length?(b=+a,p()):b},a.size=function(a){return arguments.length?(m.range([0,d=+a]),p()):d},a.serverDelay=function(a){return arguments.length?(j=+a,p()):j},a.clientDelay=function(a){return arguments.length?(k=+a,p()):k},a.focus=function(b){return l.focus.call(a,o=b),a},a.on=function(b,c){return arguments.length<2?l.on(b):(l.on(b,c),c!=null&&(/^prepare(\.|$)/.test(b)&&c.call(a,h,i),/^beforechange(\.|$)/.test(b)&&c.call(a,f,g),/^change(\.|$)/.test(b)&&c.call(a,f,g),/^focus(\.|$)/.test(b)&&c.call(a,o)),a)},d3.select(window).on("keydown.context-"+ ++c,function(){switch(!d3.event.metaKey&&d3.event.keyCode){case 37:o==null&&(o=d-1),o>0&&a.focus(--o);break;case 39:o==null&&(o=d-2),o<d-1&&a.focus(++o);break;default:return}d3.event.preventDefault()}),p()};var f=b.context.prototype=e.prototype;f.constant=function(a){return new n(this,+a)},f.cube=function(a){arguments.length||(a="");var b={},c=this;return b.metric=function(b){return c.metric(function(c,d,e,f){d3.json(a+"/1.0/metric"+"?expression="+encodeURIComponent(b)+"&start="+g(c)+"&stop="+g(d)+"&step="+e,function(a){if(!a)return f(new Error("unable to load data"));f(null,a.map(function(a){return a.value}))})},b+="")},b.toString=function(){return a},b};var g=d3.time.format.iso;f.graphite=function(a){arguments.length||(a="");var b={},c=this;return b.metric=function(b){var d="sum",e=c.metric(function(c,e,f,g){var j=b;f!==1e4&&(j="summarize("+j+",'"+(f%36e5?f%6e4?f/1e3+"sec":f/6e4+"min":f/36e5+"hour")+"','"+d+"')"),d3.text(a+"/render?format=raw"+"&target="+encodeURIComponent("alias("+j+",'')")+"&from="+h(c-2*f)+"&until="+h(e-1e3),function(a){if(!a)return g(new Error("unable to load data"));g(null,i(a))})},b+="");return e.summarize=function(a){return d=a,e},e},b.find=function(b,c){d3.json(a+"/metrics/find?format=completer"+"&query="+encodeURIComponent(b),function(a){if(!a)return c(new Error("unable to find metrics"));c(null,a.metrics.map(function(a){return a.path}))})},b.toString=function(){return a},b};var k=j.prototype;b.metric=j,k.valueAt=function(){return NaN},k.alias=function(a){return this.toString=function(){return a},this},k.extent=function(){var a=0,b=this.context.size(),c,d=Infinity,e=-Infinity;while(++a<b)c=this.valueAt(a),c<d&&(d=c),c>e&&(e=c);return[d,e]},k.on=function(a,b){return arguments.length<2?null:this},k.shift=function(){return this},k.on=function(){return arguments.length<2?null:this},f.metric=function(a,b){function r(b,c){var d=Math.min(k,Math.round((b-g)/i));if(!d||q)return;q=!0,d=Math.min(k,d+l);var f=new Date(c-d*i);a(f,c,i,function(a,b){q=!1;if(a)return console.warn(a);var d=isFinite(g)?Math.round((f-g)/i):0;for(var h=0,j=b.length;h<j;++h)n[h+d]=b[h];o.change.call(e,g,c)})}function s(a,b){isFinite(g)||(g=a),n.splice(0,Math.max(0,Math.min(k,Math.round((a-g)/i)))),g=a,h=b}var d=this,e=new j(d),f=".metric-"+ ++c,g=-Infinity,h,i=d.step(),k=d.size(),n=[],o=d3.dispatch("change"),p=0,q;return e.valueAt=function(a){return n[a]},e.shift=function(b){return d.metric(m(a,+b))},e.on=function(a,b){return arguments.length?(b==null?o.on(a)!=null&&--p==0&&d.on("prepare"+f,null).on("beforechange"+f,null):o.on(a)==null&&++p==1&&d.on("prepare"+f,r).on("beforechange"+f,s),o.on(a,b),b!=null&&/^change(\.|$)/.test(a)&&b.call(d,g,h),e):o.on(a)},arguments.length>1&&(e.toString=function(){return b}),e};var l=6,o=n.prototype=Object.create(j.prototype);o.valueAt=function(){return+this},o.extent=function(){return[+this,+this]},k.add=p("+",function(a,b){return a+b}),k.subtract=p("-",function(a,b){return a-b}),k.multiply=p("*",function(a,b){return a*b}),k.divide=p("/",function(a,b){return a/b}),f.horizon=function(){function o(o){o.on("mousemove.horizon",function(){a.focus(Math.round(d3.mouse(this)[0]))}).on("mouseout.horizon",function(){a.focus(null)}),o.append("canvas").attr("width",f).attr("height",g),o.append("span").attr("class","title").text(k),o.append("span").attr("class","value"),o.each(function(k,o){function B(c,d){w.save();var i=r.extent();A=i.every(isFinite),t!=null&&(i=t);var j=0,k=Math.max(-i[0],i[1]);if(this===a){if(k==y){j=f-l;var m=(c-u)/v;if(m<f){var n=e.getContext("2d");n.clearRect(0,0,f,g),n.drawImage(w.canvas,m,0,f-m,g,0,0,f-m,g),w.clearRect(0,0,f,g),w.drawImage(n.canvas,0,0)}}u=c}h.domain([0,y=k]),w.clearRect(j,0,f-j,g);var o;for(var p=0;p<z;++p){w.fillStyle=s[z+p];var q=(p-z+1)*g;h.range([z*g+q,q]),q=h(0);for(var x=j,B=f,C;x<B;++x){C=r.valueAt(x);if(C<=0){o=!0;continue}w.fillRect(x,C=h(C),1,q-C)}}if(o){b==="offset"&&(w.translate(0,g),w.scale(1,-1));for(var p=0;p<z;++p){w.fillStyle=s[z-1-p];var q=(p-z+1)*g;h.range([z*g+q,q]),q=h(0);for(var x=j,B=f,C;x<B;++x){C=r.valueAt(x);if(C>=0)continue;w.fillRect(x,h(-C),1,q-h(-C))}}}w.restore()}function C(a){a==null&&(a=f-1);var b=r.valueAt(a);x.datum(b).text(isNaN(b)?null:m)}var p=this,q=++c,r=typeof i=="function"?i.call(p,k,o):i,s=typeof n=="function"?n.call(p,k,o):n,t=typeof j=="function"?j.call(p,k,o):j,u=-Infinity,v=a.step(),w=d3.select(p).select("canvas"),x=d3.select(p).select(".value"),y,z=s.length>>1,A;w.datum({id:q,metric:r}),w=w.node().getContext("2d"),a.on("change.horizon-"+q,B),a.on("focus.horizon-"+q,C),r.on("change.horizon-"+q,function(a,b){B(a,b),C(),A&&r.on("change.horizon-"+q,d)})})}var a=this,b="offset",e=document.createElement("canvas"),f=e.width=a.size(),g=e.height=30,h=d3.scale.linear().interpolate(d3.interpolateRound),i=d,j=null,k=d,m=d3.format(".2s"),n=["#08519c","#3182bd","#6baed6","#bdd7e7","#bae4b3","#74c476","#31a354","#006d2c"];return o.remove=function(b){function c(b){b.metric.on("change.horizon-"+b.id,null),a.on("change.horizon-"+b.id,null),a.on("focus.horizon-"+b.id,null)}b.on("mousemove.horizon",null).on("mouseout.horizon",null),b.selectAll("canvas").each(c).remove(),b.selectAll(".title,.value").remove()},o.mode=function(a){return arguments.length?(b=a+"",o):b},o.height=function(a){return arguments.length?(e.height=g=+a,o):g},o.metric=function(a){return arguments.length?(i=a,o):i},o.scale=function(a){return arguments.length?(h=a,o):h},o.extent=function(a){return arguments.length?(j=a,o):j},o.title=function(a){return arguments.length?(k=a,o):k},o.format=function(a){return arguments.length?(m=a,o):m},o.colors=function(a){return arguments.length?(n=a,o):n},o},f.comparison=function(){function o(o){o.on("mousemove.comparison",function(){a.focus(Math.round(d3.mouse(this)[0]))}).on("mouseout.comparison",function(){a.focus(null)}),o.append("canvas").attr("width",b).attr("height",e),o.append("span").attr("class","title").text(j),o.append("span").attr("class","value primary"),o.append("span").attr("class","value change"),o.each(function(j,o){function B(c,d){x.save(),x.clearRect(0,0,b,e);var g=r.extent(),h=u.extent(),i=v==null?g:v;f.domain(i).range([e,0]),A=g.concat(h).every(isFinite);var j=c/a.step()&1?t:s;x.fillStyle=m[2];for(var k=0,l=b;k<l;++k){var o=f(r.valueAt(k)),p=f(u.valueAt(k));o<p&&x.fillRect(j(k),o,1,p-o)}x.fillStyle=m[0];for(k=0;k<l;++k){var o=f(r.valueAt(k)),p=f(u.valueAt(k));o>p&&x.fillRect(j(k),p,1,o-p)}x.fillStyle=m[3];for(k=0;k<l;++k){var o=f(r.valueAt(k)),p=f(u.valueAt(k));o<=p&&x.fillRect(j(k),o,1,n)}x.fillStyle=m[1];for(k=0;k<l;++k){var o=f(r.valueAt(k)),p=f(u.valueAt(k));o>p&&x.fillRect(j(k),o-n,1,n)}x.restore()}function C(a){a==null&&(a=b-1);var c=r.valueAt(a),d=u.valueAt(a),e=(c-d)/d;y.datum(c).text(isNaN(c)?null:k),z.datum(e).text(isNaN(e)?null:l).attr("class","value change "+(e>0?"positive":e<0?"negative":""))}function D(a,b){B(a,b),C(),A&&(r.on("change.comparison-"+q,d),u.on("change.comparison-"+q,d))}var p=this,q=++c,r=typeof g=="function"?g.call(p,j,o):g,u=typeof h=="function"?h.call(p,j,o):h,v=typeof i=="function"?i.call(p,j,o):i,w=d3.select(p),x=w.select("canvas"),y=w.select(".value.primary"),z=w.select(".value.change"),A;x.datum({id:q,primary:r,secondary:u}),x=x.node().getContext("2d"),r.on("change.comparison-"+q,D),u.on("change.comparison-"+q,D),a.on("change.comparison-"+q,B),a.on("focus.comparison-"+q,C)})}var a=this,b=a.size(),e=120,f=d3.scale.linear().interpolate(d3.interpolateRound),g=function(a){return a[0]},h=function(a){return a[1]},i=null,j=d,k=q,l=r,m=["#9ecae1","#225b84","#a1d99b","#22723a"],n=1.5;return o.remove=function(b){function c(b){b.primary.on("change.comparison-"+b.id,null),b.secondary.on("change.comparison-"+b.id,null),a.on("change.comparison-"+b.id,null),a.on("focus.comparison-"+b.id,null)}b.on("mousemove.comparison",null).on("mouseout.comparison",null),b.selectAll("canvas").each(c).remove(),b.selectAll(".title,.value").remove()},o.height=function(a){return arguments.length?(e=+a,o):e},o.primary=function(a){return arguments.length?(g=a,o):g},o.secondary=function(a){return arguments.length?(h=a,o):h},o.scale=function(a){return arguments.length?(f=a,o):f},o.extent=function(a){return arguments.length?(i=a,o):i},o.title=function(a){return arguments.length?(j=a,o):j},o.formatPrimary=function(a){return arguments.length?(k=a,o):k},o.formatChange=function(a){return arguments.length?(l=a,o):l},o.colors=function(a){return arguments.length?(m=a,o):m},o.strokeWidth=function(a){return arguments.length?(n=a,o):n},o};var q=d3.format(".2s"),r=d3.format("+.0%");f.axis=function(){function f(g){var h=++c,i,j=g.append("svg").datum({id:h}).attr("width",a.size()).attr("height",Math.max(28,-f.tickSize())).append("g").attr("transform","translate(0,"+(d.orient()==="top"?27:4)+")").call(d);a.on("change.axis-"+h,function(){j.call(d),i||(i=d3.select(j.node().appendChild(j.selectAll("text").node().cloneNode(!0))).style("display","none").text(null))}),a.on("focus.axis-"+h,function(a){if(i)if(a==null)i.style("display","none"),j.selectAll("text").style("fill-opacity",null);else{i.style("display",null).attr("x",a).text(e(b.invert(a)));var c=i.node().getComputedTextLength()+6;j.selectAll("text").style("fill-opacity",function(d){return Math.abs(b(d)-a)<c?0:1})}})}var a=this,b=a.scale,d=d3.svg.axis().scale(b),e=a.step()<6e4?u:a.step()<864e5?v:w;return f.remove=function(b){function c(b){a.on("change.axis-"+b.id,null),a.on("focus.axis-"+b.id,null)}b.selectAll("svg").each(c).remove()},d3.rebind(f,d,"orient","ticks","tickSubdivide","tickSize","tickPadding","tickFormat")};var u=d3.time.format("%I:%M:%S %p"),v=d3.time.format("%I:%M %p"),w=d3.time.format("%B %d");f.rule=function(){function e(d){var e=++c,f=d.append("div").datum({id:e}).attr("class","line").call(x);d.each(function(e,f){function j(b,c){var e=[];for(var f=0,g=a.size();f<g;++f)i.valueAt(f)&&e.push(f);var h=d.selectAll(".metric").data(e);h.exit().remove(),h.enter().append("div").attr("class","metric line").call(x),h.style("left",y)}var g=this,h=++c,i=typeof b=="function"?b.call(g,e,f):b;if(!i)return;a.on("change.rule-"+h,j),i.on("change.rule-"+h,j)}),a.on("focus.rule-"+e,function(a){f.datum(a).style("display",a==null?"none":null).style("left",a==null?null:y)})}var a=this,b=d;return e.remove=function(b){function c(b){a.on("focus.rule-"+b.id,null)}b.selectAll(".line").each(c).remove()},e.metric=function(a){return arguments.length?(b=a,e):b},e}})(this);
|
1
|
+
(function(a){function d(a){return a}function e(){}function j(a){return Math.floor(a/1e3)}function k(a){var b=a.indexOf("|"),c=a.substring(0,b),d=c.lastIndexOf(","),e=c.lastIndexOf(",",d-1),f=c.lastIndexOf(",",e-1),g=c.substring(f+1,e)*1e3,h=c.substring(d+1)*1e3;return a.substring(b+1).split(",").slice(1).map(function(a){return+a})}function l(a){if(!(a instanceof e))throw new Error("invalid context");this.context=a}function o(a,b){return function(c,d,e,f){a(new Date(+c+b),new Date(+d+b),e,f)}}function p(a,b){l.call(this,a),b=+b;var c=b+"";this.valueOf=function(){return b},this.toString=function(){return c}}function r(a,b){function c(b,c){if(c instanceof l){if(b.context!==c.context)throw new Error("mismatch context")}else c=new p(b.context,c);l.call(this,b.context),this.left=b,this.right=c,this.toString=function(){return b+" "+a+" "+c}}var d=c.prototype=Object.create(l.prototype);return d.valueAt=function(a){return b(this.left.valueAt(a),this.right.valueAt(a))},d.shift=function(a){return new c(this.left.shift(a),this.right.shift(a))},d.on=function(a,b){return arguments.length<2?this.left.on(a):(this.left.on(a,b),this.right.on(a,b),this)},function(a){return new c(this,a)}}function u(a){return a&16777214}function v(a){return(a+1&16777214)-1}function z(a){a.style("position","absolute").style("top",0).style("bottom",0).style("width","1px").style("pointer-events","none")}function A(a){return a+"px"}var b=a.cubism={version:"1.5.0"},c=0;b.option=function(a,c){var d=b.options(a);return d.length?d[0]:c},b.options=function(a,b){var c=location.search.substring(1).split("&"),d=[],e=-1,f=c.length,g;while(++e<f)(g=c[e].split("="))[0]==a&&d.push(decodeURIComponent(g[1]));return d.length||arguments.length<2?d:b},b.context=function(){function p(){var c=Date.now();return g=new Date(Math.floor((c-j-k)/b)*b),f=new Date(g-d*b),i=new Date(Math.floor((c-j)/b)*b),h=new Date(i-d*b),m.domain([f,g]),a}var a=new e,b=1e4,d=1440,f,g,h,i,j=5e3,k=5e3,l=d3.dispatch("prepare","beforechange","change","focus"),m=a.scale=d3.time.scale().range([0,d]),n,o;return a.start=function(){n&&clearTimeout(n);var c=+i+j-Date.now();return c<k&&(c+=b),n=setTimeout(function e(){i=new Date(Math.floor((Date.now()-j)/b)*b),h=new Date(i-d*b),l.prepare.call(a,h,i),setTimeout(function(){m.domain([f=h,g=i]),l.beforechange.call(a,h,i),l.change.call(a,h,i),l.focus.call(a,o)},k),n=setTimeout(e,b)},c),a},a.stop=function(){return n=clearTimeout(n),a},n=setTimeout(a.start,10),a.step=function(a){return arguments.length?(b=+a,p()):b},a.size=function(a){return arguments.length?(m.range([0,d=+a]),p()):d},a.serverDelay=function(a){return arguments.length?(j=+a,p()):j},a.clientDelay=function(a){return arguments.length?(k=+a,p()):k},a.focus=function(b){return l.focus.call(a,o=b),a},a.on=function(b,c){return arguments.length<2?l.on(b):(l.on(b,c),c!=null&&(/^prepare(\.|$)/.test(b)&&c.call(a,h,i),/^beforechange(\.|$)/.test(b)&&c.call(a,f,g),/^change(\.|$)/.test(b)&&c.call(a,f,g),/^focus(\.|$)/.test(b)&&c.call(a,o)),a)},d3.select(window).on("keydown.context-"+ ++c,function(){switch(!d3.event.metaKey&&d3.event.keyCode){case 37:o==null&&(o=d-1),o>0&&a.focus(--o);break;case 39:o==null&&(o=d-2),o<d-1&&a.focus(++o);break;default:return}d3.event.preventDefault()}),p()};var f=b.context.prototype=e.prototype;f.constant=function(a){return new p(this,+a)},f.cube=function(a){arguments.length||(a="");var b={},c=this;return b.metric=function(b){return c.metric(function(c,d,e,f){d3.json(a+"/1.0/metric"+"?expression="+encodeURIComponent(b)+"&start="+g(c)+"&stop="+g(d)+"&step="+e,function(a){if(!a)return f(new Error("unable to load data"));f(null,a.map(function(a){return a.value}))})},b+="")},b.toString=function(){return a},b};var g=d3.time.format.iso;f.librato=function(a,c){function f(a){enable_log&&console.log(a)}function g(a,b,c){f("---------------------- Starting request"),f("START: "+new Date(a*1e3)),f("STOP : "+new Date(b*1e3)),f("STEP : "+c);var d=(b-a)/c;f("# of measurements necessary: "+d)}function j(a){var b=avail_rsts[0],c=avail_rsts[avail_rsts.length];if(a>=c)return c;if(a<=b)return b;var d,e,f;for(f=a;f<=c;f++){d=avail_rsts.indexOf(f);if(d>-1){e=avail_rsts[d];break}}var g;for(f=a;f>=b;f--){d=avail_rsts.indexOf(f);if(d>-1){g=avail_rsts[d];break}}return e-a<a-g?e:g}function k(a,b,c){var d=b-a,e=2419200,f=604800,g=172800,h;return d>e?3600:(h=j(c),d>f&&h<900?900:d>g&&h<60?60:h)}var d={},e=this;auth_string="Basic "+btoa(a+":"+c),enable_log=!0,avail_rsts=[1,60,900,3600];var l=function(a,c){function e(b,c,e){var h="start_time="+b+"&end_time="+c+"&resolution="+k(b,c,e);return full_url=d+"/"+a+"?"+h,f("full_url = "+full_url),g(b,c,e),full_url}function h(a,b,c,d){var e=[];for(i=a;i<=b;i+=c){var f=[];while(d.length&&d[0].measure_time<=i)f.push(d.shift().value);var g;f.length?g=f.reduce(function(a,b){return a+b})/f.length:g=e.length?e[e.length-1]:0,e.push(g)}return e}var d="https://metrics-api.librato.com/v1/metrics";return request={},request.fire=function(a,d,g,i){function k(l){d3.json(l).header("X-Requested-With","XMLHttpRequest").header("Authorization",auth_string).header("Librato-User-Agent","cubism/"+b.version).get(function(b,l){if(!b){f("# of partial measurements: "+l.measurements[c].length),l.measurements[c].forEach(function(a){j.push(a)});var m="query"in l&&"next_time"in l.query;if(m)f("Requesting more values"),k(e(l.query.next_time,d,g));else{f("total number of measurements from librato: "+j.length);var n=h(a,d,g,j);f("number of measurements after adjusting time values: "+n.length),i(n)}}else f("There was an error when performing the librato request:"),f(b)})}var j=[];k(e(a,d,g))},request};return d.metric=function(a,b){return e.metric(function(c,d,e,f){l(a,b).fire(h(c),h(d),h(e),function(a){f(null,a)})},a+="")},d.toString=function(){return"librato"},d};var h=function(a){return Math.floor(a/1e3)};f.graphite=function(a){arguments.length||(a="");var b={},c=this;return b.metric=function(b){var d="sum",e=c.metric(function(c,e,f,g){var h=b;f!==1e4&&(h="summarize("+h+",'"+(f%36e5?f%6e4?f/1e3+"sec":f/6e4+"min":f/36e5+"hour")+"','"+d+"')"),d3.text(a+"/render?format=raw"+"&target="+encodeURIComponent("alias("+h+",'')")+"&from="+j(c-2*f)+"&until="+j(e-1e3),function(a){if(!a)return g(new Error("unable to load data"));g(null,k(a))})},b+="");return e.summarize=function(a){return d=a,e},e},b.find=function(b,c){d3.json(a+"/metrics/find?format=completer"+"&query="+encodeURIComponent(b),function(a){if(!a)return c(new Error("unable to find metrics"));c(null,a.metrics.map(function(a){return a.path}))})},b.toString=function(){return a},b},f.gangliaWeb=function(a){var b="",c="/ganglia2/";arguments.length&&(a.host&&(b=a.host),a.uriPathPrefix&&(c=a.uriPathPrefix,c[0]!="/"&&(c="/"+c),c[c.length-1]!="/"&&(c+="/")));var d={},e=this;return d.metric=function(a){var d=a.clusterName,f=a.metricName,g=a.hostName,h=a.isReport||!1,i=a.titleGenerator||function(a){return"clusterName:"+d+" metricName:"+f+(g?" hostName:"+g:"")},j=a.onChangeCallback,k=h?"g":"m",l=e.metric(function(a,e,h,i){function j(){return"c="+d+"&"+k+"="+f+(g?"&h="+g:"")+"&cs="+a/1e3+"&ce="+e/1e3+"&step="+h/1e3+"&graphlot=1"}d3.json(b+c+"graph.php?"+j(),function(a){if(!a)return i(new Error("Unable to fetch GangliaWeb data"));i(null,a[0].data)})},i(a));return l.toString=function(){return i(a)},j&&l.on("change",j),l},d.toString=function(){return b+c},d};var m=l.prototype;b.metric=l,m.valueAt=function(){return NaN},m.alias=function(a){return this.toString=function(){return a},this},m.extent=function(){var a=0,b=this.context.size(),c,d=Infinity,e=-Infinity;while(++a<b)c=this.valueAt(a),c<d&&(d=c),c>e&&(e=c);return[d,e]},m.on=function(a,b){return arguments.length<2?null:this},m.shift=function(){return this},m.on=function(){return arguments.length<2?null:this},f.metric=function(a,b){function r(b,c){var d=Math.min(j,Math.round((b-g)/i));if(!d||q)return;q=!0,d=Math.min(j,d+n);var f=new Date(c-d*i);a(f,c,i,function(a,b){q=!1;if(a)return console.warn(a);var d=isFinite(g)?Math.round((f-g)/i):0;for(var h=0,j=b.length;h<j;++h)k[h+d]=b[h];m.change.call(e,g,c)})}function s(a,b){isFinite(g)||(g=a),k.splice(0,Math.max(0,Math.min(j,Math.round((a-g)/i)))),g=a,h=b}var d=this,e=new l(d),f=".metric-"+ ++c,g=-Infinity,h,i=d.step(),j=d.size(),k=[],m=d3.dispatch("change"),p=0,q;return e.valueAt=function(a){return k[a]},e.shift=function(b){return d.metric(o(a,+b))},e.on=function(a,b){return arguments.length?(b==null?m.on(a)!=null&&--p==0&&d.on("prepare"+f,null).on("beforechange"+f,null):m.on(a)==null&&++p==1&&d.on("prepare"+f,r).on("beforechange"+f,s),m.on(a,b),b!=null&&/^change(\.|$)/.test(a)&&b.call(d,g,h),e):m.on(a)},arguments.length>1&&(e.toString=function(){return b}),e};var n=6,q=p.prototype=Object.create(l.prototype);q.valueAt=function(){return+this},q.extent=function(){return[+this,+this]},m.add=r("+",function(a,b){return a+b}),m.subtract=r("-",function(a,b){return a-b}),m.multiply=r("*",function(a,b){return a*b}),m.divide=r("/",function(a,b){return a/b}),f.horizon=function(){function o(o){o.on("mousemove.horizon",function(){a.focus(Math.round(d3.mouse(this)[0]))}).on("mouseout.horizon",function(){a.focus(null)}),o.append("canvas").attr("width",f).attr("height",g),o.append("span").attr("class","title").text(k),o.append("span").attr("class","value"),o.each(function(k,o){function B(c,d){w.save();var i=r.extent();A=i.every(isFinite),t!=null&&(i=t);var j=0,k=Math.max(-i[0],i[1]);if(this===a){if(k==y){j=f-n;var l=(c-u)/v;if(l<f){var m=e.getContext("2d");m.clearRect(0,0,f,g),m.drawImage(w.canvas,l,0,f-l,g,0,0,f-l,g),w.clearRect(0,0,f,g),w.drawImage(m.canvas,0,0)}}u=c}h.domain([0,y=k]),w.clearRect(j,0,f-j,g);var o;for(var p=0;p<z;++p){w.fillStyle=s[z+p];var q=(p-z+1)*g;h.range([z*g+q,q]),q=h(0);for(var x=j,B=f,C;x<B;++x){C=r.valueAt(x);if(C<=0){o=!0;continue}if(C===undefined)continue;w.fillRect(x,C=h(C),1,q-C)}}if(o){b==="offset"&&(w.translate(0,g),w.scale(1,-1));for(var p=0;p<z;++p){w.fillStyle=s[z-1-p];var q=(p-z+1)*g;h.range([z*g+q,q]),q=h(0);for(var x=j,B=f,C;x<B;++x){C=r.valueAt(x);if(C>=0)continue;w.fillRect(x,h(-C),1,q-h(-C))}}}w.restore()}function C(a){a==null&&(a=f-1);var b=r.valueAt(a);x.datum(b).text(isNaN(b)?null:l)}var p=this,q=++c,r=typeof i=="function"?i.call(p,k,o):i,s=typeof m=="function"?m.call(p,k,o):m,t=typeof j=="function"?j.call(p,k,o):j,u=-Infinity,v=a.step(),w=d3.select(p).select("canvas"),x=d3.select(p).select(".value"),y,z=s.length>>1,A;w.datum({id:q,metric:r}),w=w.node().getContext("2d"),a.on("change.horizon-"+q,B),a.on("focus.horizon-"+q,C),r.on("change.horizon-"+q,function(a,b){B(a,b),C(),A&&r.on("change.horizon-"+q,d)})})}var a=this,b="offset",e=document.createElement("canvas"),f=e.width=a.size(),g=e.height=30,h=d3.scale.linear().interpolate(d3.interpolateRound),i=d,j=null,k=d,l=d3.format(".2s"),m=["#08519c","#3182bd","#6baed6","#bdd7e7","#bae4b3","#74c476","#31a354","#006d2c"];return o.remove=function(b){function c(b){b.metric.on("change.horizon-"+b.id,null),a.on("change.horizon-"+b.id,null),a.on("focus.horizon-"+b.id,null)}b.on("mousemove.horizon",null).on("mouseout.horizon",null),b.selectAll("canvas").each(c).remove(),b.selectAll(".title,.value").remove()},o.mode=function(a){return arguments.length?(b=a+"",o):b},o.height=function(a){return arguments.length?(e.height=g=+a,o):g},o.metric=function(a){return arguments.length?(i=a,o):i},o.scale=function(a){return arguments.length?(h=a,o):h},o.extent=function(a){return arguments.length?(j=a,o):j},o.title=function(a){return arguments.length?(k=a,o):k},o.format=function(a){return arguments.length?(l=a,o):l},o.colors=function(a){return arguments.length?(m=a,o):m},o},f.comparison=function(){function o(o){o.on("mousemove.comparison",function(){a.focus(Math.round(d3.mouse(this)[0]))}).on("mouseout.comparison",function(){a.focus(null)}),o.append("canvas").attr("width",b).attr("height",e),o.append("span").attr("class","title").text(j),o.append("span").attr("class","value primary"),o.append("span").attr("class","value change"),o.each(function(j,o){function B(c,d){x.save(),x.clearRect(0,0,b,e);var g=r.extent(),h=s.extent(),i=t==null?g:t;f.domain(i).range([e,0]),A=g.concat(h).every(isFinite);var j=c/a.step()&1?v:u;x.fillStyle=m[2];for(var k=0,l=b;k<l;++k){var o=f(r.valueAt(k)),p=f(s.valueAt(k));o<p&&x.fillRect(j(k),o,1,p-o)}x.fillStyle=m[0];for(k=0;k<l;++k){var o=f(r.valueAt(k)),p=f(s.valueAt(k));o>p&&x.fillRect(j(k),p,1,o-p)}x.fillStyle=m[3];for(k=0;k<l;++k){var o=f(r.valueAt(k)),p=f(s.valueAt(k));o<=p&&x.fillRect(j(k),o,1,n)}x.fillStyle=m[1];for(k=0;k<l;++k){var o=f(r.valueAt(k)),p=f(s.valueAt(k));o>p&&x.fillRect(j(k),o-n,1,n)}x.restore()}function C(a){a==null&&(a=b-1);var c=r.valueAt(a),d=s.valueAt(a),e=(c-d)/d;y.datum(c).text(isNaN(c)?null:k),z.datum(e).text(isNaN(e)?null:l).attr("class","value change "+(e>0?"positive":e<0?"negative":""))}function D(a,b){B(a,b),C(),A&&(r.on("change.comparison-"+q,d),s.on("change.comparison-"+q,d))}var p=this,q=++c,r=typeof g=="function"?g.call(p,j,o):g,s=typeof h=="function"?h.call(p,j,o):h,t=typeof i=="function"?i.call(p,j,o):i,w=d3.select(p),x=w.select("canvas"),y=w.select(".value.primary"),z=w.select(".value.change"),A;x.datum({id:q,primary:r,secondary:s}),x=x.node().getContext("2d"),r.on("change.comparison-"+q,D),s.on("change.comparison-"+q,D),a.on("change.comparison-"+q,B),a.on("focus.comparison-"+q,C)})}var a=this,b=a.size(),e=120,f=d3.scale.linear().interpolate(d3.interpolateRound),g=function(a){return a[0]},h=function(a){return a[1]},i=null,j=d,k=s,l=t,m=["#9ecae1","#225b84","#a1d99b","#22723a"],n=1.5;return o.remove=function(b){function c(b){b.primary.on("change.comparison-"+b.id,null),b.secondary.on("change.comparison-"+b.id,null),a.on("change.comparison-"+b.id,null),a.on("focus.comparison-"+b.id,null)}b.on("mousemove.comparison",null).on("mouseout.comparison",null),b.selectAll("canvas").each(c).remove(),b.selectAll(".title,.value").remove()},o.height=function(a){return arguments.length?(e=+a,o):e},o.primary=function(a){return arguments.length?(g=a,o):g},o.secondary=function(a){return arguments.length?(h=a,o):h},o.scale=function(a){return arguments.length?(f=a,o):f},o.extent=function(a){return arguments.length?(i=a,o):i},o.title=function(a){return arguments.length?(j=a,o):j},o.formatPrimary=function(a){return arguments.length?(k=a,o):k},o.formatChange=function(a){return arguments.length?(l=a,o):l},o.colors=function(a){return arguments.length?(m=a,o):m},o.strokeWidth=function(a){return arguments.length?(n=a,o):n},o};var s=d3.format(".2s"),t=d3.format("+.0%");f.axis=function(){function g(e){var h=++c,i,j=e.append("svg").datum({id:h}).attr("width",a.size()).attr("height",Math.max(28,-g.tickSize())).append("g").attr("transform","translate(0,"+(d.orient()==="top"?27:4)+")").call(d);a.on("change.axis-"+h,function(){j.call(d),i||(i=d3.select(j.node().appendChild(j.selectAll("text").node().cloneNode(!0))).style("display","none").text(null))}),a.on("focus.axis-"+h,function(a){if(i)if(a==null)i.style("display","none"),j.selectAll("text").style("fill-opacity",null);else{i.style("display",null).attr("x",a).text(f(b.invert(a)));var c=i.node().getComputedTextLength()+6;j.selectAll("text").style("fill-opacity",function(d){return Math.abs(b(d)-a)<c?0:1})}})}var a=this,b=a.scale,d=d3.svg.axis().scale(b),e=a.step()<6e4?w:a.step()<864e5?x:y,f=e;return g.remove=function(b){function c(b){a.on("change.axis-"+b.id,null),a.on("focus.axis-"+b.id,null)}b.selectAll("svg").each(c).remove()},g.focusFormat=function(a){return arguments.length?(f=a==null?e:a,g):f==e?null:a},d3.rebind(g,d,"orient","ticks","tickSubdivide","tickSize","tickPadding","tickFormat")};var w=d3.time.format("%I:%M:%S %p"),x=d3.time.format("%I:%M %p"),y=d3.time.format("%B %d");f.rule=function(){function e(d){var e=++c,f=d.append("div").datum({id:e}).attr("class","line").call(z);d.each(function(e,f){function j(b,c){var e=[];for(var f=0,g=a.size();f<g;++f)i.valueAt(f)&&e.push(f);var h=d.selectAll(".metric").data(e);h.exit().remove(),h.enter().append("div").attr("class","metric line").call(z),h.style("left",A)}var g=this,h=++c,i=typeof b=="function"?b.call(g,e,f):b;if(!i)return;a.on("change.rule-"+h,j),i.on("change.rule-"+h,j)}),a.on("focus.rule-"+e,function(a){f.datum(a).style("display",a==null?"none":null).style("left",a==null?null:A)})}var a=this,b=d;return e.remove=function(b){function c(b){a.on("focus.rule-"+b.id,null)}b.selectAll(".line").each(c).remove()},e.metric=function(a){return arguments.length?(b=a,e):b},e}})(this);
|
metadata
CHANGED
@@ -1,46 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cubism-rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.5.0.1
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Vlad Gorodetsky
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2014-03-10 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: railties
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '3.0'
|
22
|
-
- - <
|
20
|
+
- - "<"
|
23
21
|
- !ruby/object:Gem::Version
|
24
22
|
version: '5.0'
|
25
23
|
type: :runtime
|
26
24
|
prerelease: false
|
27
25
|
version_requirements: !ruby/object:Gem::Requirement
|
28
|
-
none: false
|
29
26
|
requirements:
|
30
|
-
- -
|
27
|
+
- - ">="
|
31
28
|
- !ruby/object:Gem::Version
|
32
29
|
version: '3.0'
|
33
|
-
- - <
|
30
|
+
- - "<"
|
34
31
|
- !ruby/object:Gem::Version
|
35
32
|
version: '5.0'
|
36
|
-
description:
|
33
|
+
description: 'Cubism.js: A JavaScript library for time series visualization.'
|
37
34
|
email:
|
38
35
|
- v@gor.io
|
39
36
|
executables: []
|
40
37
|
extensions: []
|
41
38
|
extra_rdoc_files: []
|
42
39
|
files:
|
43
|
-
- .gitignore
|
40
|
+
- ".gitignore"
|
44
41
|
- Gemfile
|
45
42
|
- LICENSE
|
46
43
|
- README.md
|
@@ -52,26 +49,25 @@ files:
|
|
52
49
|
- vendor/assets/javascripts/cubism.min.js
|
53
50
|
homepage: http://github.com/bai/cubism-rails
|
54
51
|
licenses: []
|
52
|
+
metadata: {}
|
55
53
|
post_install_message:
|
56
54
|
rdoc_options: []
|
57
55
|
require_paths:
|
58
56
|
- lib
|
59
57
|
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
-
none: false
|
61
58
|
requirements:
|
62
|
-
- -
|
59
|
+
- - ">="
|
63
60
|
- !ruby/object:Gem::Version
|
64
61
|
version: '0'
|
65
62
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
63
|
requirements:
|
68
|
-
- -
|
64
|
+
- - ">="
|
69
65
|
- !ruby/object:Gem::Version
|
70
66
|
version: '0'
|
71
67
|
requirements: []
|
72
68
|
rubyforge_project:
|
73
|
-
rubygems_version:
|
69
|
+
rubygems_version: 2.2.2
|
74
70
|
signing_key:
|
75
|
-
specification_version:
|
71
|
+
specification_version: 4
|
76
72
|
summary: Gemified cubism.js asset for Rails
|
77
73
|
test_files: []
|