bpm 1.0.0.beta.5 → 1.0.0.beta.6

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.
Files changed (55) hide show
  1. data/CHANGELOG.md +5 -0
  2. data/TODO.md +18 -17
  3. data/lib/bpm/pipeline/generated_asset.rb +64 -41
  4. data/lib/bpm/pipeline/plugin_context.rb +24 -0
  5. data/lib/bpm/pipeline/transport_processor.rb +3 -3
  6. data/lib/bpm/pipeline.rb +2 -1
  7. data/lib/bpm/project.rb +7 -1
  8. data/lib/bpm/version.rb +1 -1
  9. data/lib/bpm.rb +1 -0
  10. data/spec/fixtures/projects/minitest/minitest.json +4 -2
  11. data/spec/fixtures/projects/minitest/packages/uglyduck/minifier/main.js +3 -2
  12. data/spec/fixtures/projects/minitrans/lib/main.js +3 -0
  13. data/spec/fixtures/projects/minitrans/minitrans.json +25 -0
  14. data/spec/fixtures/projects/minitrans/packages/transport/lib/main.js +1 -0
  15. data/spec/fixtures/projects/minitrans/packages/transport/package.json +21 -0
  16. data/spec/fixtures/projects/minitrans/packages/transport/transports/wrapper.js +6 -0
  17. data/spec/fixtures/projects/minitrans/packages/uglyduck/lib/main.js +3 -0
  18. data/spec/fixtures/projects/minitrans/packages/uglyduck/minifier/main.js +6 -0
  19. data/spec/fixtures/projects/minitrans/packages/uglyduck/package.json +21 -0
  20. data/spec/fixtures/projects/transporter/packages/transport/transports/wrapper.js +2 -2
  21. data/spec/plugins/minifier_spec.rb +2 -2
  22. data/spec/plugins/transport_spec.rb +38 -0
  23. metadata +41 -56
  24. data/backbone/LICENSE +0 -22
  25. data/backbone/README +0 -25
  26. data/backbone/Rakefile +0 -42
  27. data/backbone/backbone-0.5.1.bpkg +0 -0
  28. data/backbone/examples/backbone-localstorage.js +0 -84
  29. data/backbone/examples/todos/destroy.png +0 -0
  30. data/backbone/examples/todos/index.html +0 -87
  31. data/backbone/examples/todos/todos.css +0 -311
  32. data/backbone/examples/todos/todos.js +0 -258
  33. data/backbone/index.html +0 -2606
  34. data/backbone/index.js +0 -1
  35. data/backbone/lib/backbone.js +0 -1149
  36. data/backbone/lib/index.js +0 -1
  37. data/backbone/package.json +0 -14
  38. data/backbone/test/collection.js +0 -345
  39. data/backbone/test/events.js +0 -70
  40. data/backbone/test/model.coffee +0 -43
  41. data/backbone/test/model.js +0 -424
  42. data/backbone/test/noconflict.js +0 -12
  43. data/backbone/test/router.js +0 -116
  44. data/backbone/test/speed.js +0 -45
  45. data/backbone/test/sync.js +0 -133
  46. data/backbone/test/test-zepto.html +0 -30
  47. data/backbone/test/test.html +0 -31
  48. data/backbone/test/vendor/jquery-1.5.js +0 -8176
  49. data/backbone/test/vendor/jslitmus.js +0 -649
  50. data/backbone/test/vendor/json2.js +0 -481
  51. data/backbone/test/vendor/qunit.css +0 -196
  52. data/backbone/test/vendor/qunit.js +0 -1364
  53. data/backbone/test/vendor/underscore-1.1.6.js +0 -807
  54. data/backbone/test/vendor/zepto-0.6.js +0 -692
  55. data/backbone/test/view.js +0 -137
@@ -1,649 +0,0 @@
1
- // JSLitmus.js
2
- //
3
- // Copyright (c) 2010, Robert Kieffer, http://broofa.com
4
- // Available under MIT license (http://en.wikipedia.org/wiki/MIT_License)
5
-
6
- (function() {
7
- // Private methods and state
8
-
9
- // Get platform info but don't go crazy trying to recognize everything
10
- // that's out there. This is just for the major platforms and OSes.
11
- var platform = 'unknown platform', ua = navigator.userAgent;
12
-
13
- // Detect OS
14
- var oses = ['Windows','iPhone OS','(Intel |PPC )?Mac OS X','Linux'].join('|');
15
- var pOS = new RegExp('((' + oses + ') [^ \);]*)').test(ua) ? RegExp.$1 : null;
16
- if (!pOS) pOS = new RegExp('((' + oses + ')[^ \);]*)').test(ua) ? RegExp.$1 : null;
17
-
18
- // Detect browser
19
- var pName = /(Chrome|MSIE|Safari|Opera|Firefox)/.test(ua) ? RegExp.$1 : null;
20
-
21
- // Detect version
22
- var vre = new RegExp('(Version|' + pName + ')[ \/]([^ ;]*)');
23
- var pVersion = (pName && vre.test(ua)) ? RegExp.$2 : null;
24
- var platform = (pOS && pName && pVersion) ? pName + ' ' + pVersion + ' on ' + pOS : 'unknown platform';
25
-
26
- /**
27
- * A smattering of methods that are needed to implement the JSLitmus testbed.
28
- */
29
- var jsl = {
30
- /**
31
- * Enhanced version of escape()
32
- */
33
- escape: function(s) {
34
- s = s.replace(/,/g, '\\,');
35
- s = escape(s);
36
- s = s.replace(/\+/g, '%2b');
37
- s = s.replace(/ /g, '+');
38
- return s;
39
- },
40
-
41
- /**
42
- * Get an element by ID.
43
- */
44
- $: function(id) {
45
- return document.getElementById(id);
46
- },
47
-
48
- /**
49
- * Null function
50
- */
51
- F: function() {},
52
-
53
- /**
54
- * Set the status shown in the UI
55
- */
56
- status: function(msg) {
57
- var el = jsl.$('jsl_status');
58
- if (el) el.innerHTML = msg || '';
59
- },
60
-
61
- /**
62
- * Convert a number to an abbreviated string like, "15K" or "10M"
63
- */
64
- toLabel: function(n) {
65
- if (n == Infinity) {
66
- return 'Infinity';
67
- } else if (n > 1e9) {
68
- n = Math.round(n/1e8);
69
- return n/10 + 'B';
70
- } else if (n > 1e6) {
71
- n = Math.round(n/1e5);
72
- return n/10 + 'M';
73
- } else if (n > 1e3) {
74
- n = Math.round(n/1e2);
75
- return n/10 + 'K';
76
- }
77
- return n;
78
- },
79
-
80
- /**
81
- * Copy properties from src to dst
82
- */
83
- extend: function(dst, src) {
84
- for (var k in src) dst[k] = src[k]; return dst;
85
- },
86
-
87
- /**
88
- * Like Array.join(), but for the key-value pairs in an object
89
- */
90
- join: function(o, delimit1, delimit2) {
91
- if (o.join) return o.join(delimit1); // If it's an array
92
- var pairs = [];
93
- for (var k in o) pairs.push(k + delimit1 + o[k]);
94
- return pairs.join(delimit2);
95
- },
96
-
97
- /**
98
- * Array#indexOf isn't supported in IE, so we use this as a cross-browser solution
99
- */
100
- indexOf: function(arr, o) {
101
- if (arr.indexOf) return arr.indexOf(o);
102
- for (var i = 0; i < this.length; i++) if (arr[i] === o) return i;
103
- return -1;
104
- }
105
- };
106
-
107
- /**
108
- * Test manages a single test (created with
109
- * JSLitmus.test())
110
- *
111
- * @private
112
- */
113
- var Test = function (name, f) {
114
- if (!f) throw new Error('Undefined test function');
115
- if (!/function[^\(]*\(([^,\)]*)/.test(f.toString())) {
116
- throw new Error('"' + name + '" test: Test is not a valid Function object');
117
- }
118
- this.loopArg = RegExp.$1;
119
- this.name = name;
120
- this.f = f;
121
- };
122
-
123
- jsl.extend(Test, /** @lends Test */ {
124
- /** Calibration tests for establishing iteration loop overhead */
125
- CALIBRATIONS: [
126
- new Test('calibrating loop', function(count) {while (count--);}),
127
- new Test('calibrating function', jsl.F)
128
- ],
129
-
130
- /**
131
- * Run calibration tests. Returns true if calibrations are not yet
132
- * complete (in which case calling code should run the tests yet again).
133
- * onCalibrated - Callback to invoke when calibrations have finished
134
- */
135
- calibrate: function(onCalibrated) {
136
- for (var i = 0; i < Test.CALIBRATIONS.length; i++) {
137
- var cal = Test.CALIBRATIONS[i];
138
- if (cal.running) return true;
139
- if (!cal.count) {
140
- cal.isCalibration = true;
141
- cal.onStop = onCalibrated;
142
- //cal.MIN_TIME = .1; // Do calibrations quickly
143
- cal.run(2e4);
144
- return true;
145
- }
146
- }
147
- return false;
148
- }
149
- });
150
-
151
- jsl.extend(Test.prototype, {/** @lends Test.prototype */
152
- /** Initial number of iterations */
153
- INIT_COUNT: 10,
154
- /** Max iterations allowed (i.e. used to detect bad looping functions) */
155
- MAX_COUNT: 1e9,
156
- /** Minimum time a test should take to get valid results (secs) */
157
- MIN_TIME: .5,
158
-
159
- /** Callback invoked when test state changes */
160
- onChange: jsl.F,
161
-
162
- /** Callback invoked when test is finished */
163
- onStop: jsl.F,
164
-
165
- /**
166
- * Reset test state
167
- */
168
- reset: function() {
169
- delete this.count;
170
- delete this.time;
171
- delete this.running;
172
- delete this.error;
173
- },
174
-
175
- /**
176
- * Run the test (in a timeout). We use a timeout to make sure the browser
177
- * has a chance to finish rendering any UI changes we've made, like
178
- * updating the status message.
179
- */
180
- run: function(count) {
181
- count = count || this.INIT_COUNT;
182
- jsl.status(this.name + ' x ' + count);
183
- this.running = true;
184
- var me = this;
185
- setTimeout(function() {me._run(count);}, 200);
186
- },
187
-
188
- /**
189
- * The nuts and bolts code that actually runs a test
190
- */
191
- _run: function(count) {
192
- var me = this;
193
-
194
- // Make sure calibration tests have run
195
- if (!me.isCalibration && Test.calibrate(function() {me.run(count);})) return;
196
- this.error = null;
197
-
198
- try {
199
- var start, f = this.f, now, i = count;
200
-
201
- // Start the timer
202
- start = new Date();
203
-
204
- // Now for the money shot. If this is a looping function ...
205
- if (this.loopArg) {
206
- // ... let it do the iteration itself
207
- f(count);
208
- } else {
209
- // ... otherwise do the iteration for it
210
- while (i--) f();
211
- }
212
-
213
- // Get time test took (in secs)
214
- this.time = Math.max(1,new Date() - start)/1000;
215
-
216
- // Store iteration count and per-operation time taken
217
- this.count = count;
218
- this.period = this.time/count;
219
-
220
- // Do we need to do another run?
221
- this.running = this.time <= this.MIN_TIME;
222
-
223
- // ... if so, compute how many times we should iterate
224
- if (this.running) {
225
- // Bump the count to the nearest power of 2
226
- var x = this.MIN_TIME/this.time;
227
- var pow = Math.pow(2, Math.max(1, Math.ceil(Math.log(x)/Math.log(2))));
228
- count *= pow;
229
- if (count > this.MAX_COUNT) {
230
- throw new Error('Max count exceeded. If this test uses a looping function, make sure the iteration loop is working properly.');
231
- }
232
- }
233
- } catch (e) {
234
- // Exceptions are caught and displayed in the test UI
235
- this.reset();
236
- this.error = e;
237
- }
238
-
239
- // Figure out what to do next
240
- if (this.running) {
241
- me.run(count);
242
- } else {
243
- jsl.status('');
244
- me.onStop(me);
245
- }
246
-
247
- // Finish up
248
- this.onChange(this);
249
- },
250
-
251
- /**
252
- * Get the number of operations per second for this test.
253
- *
254
- * @param normalize if true, iteration loop overhead taken into account
255
- */
256
- getHz: function(/**Boolean*/ normalize) {
257
- var p = this.period;
258
-
259
- // Adjust period based on the calibration test time
260
- if (normalize && !this.isCalibration) {
261
- var cal = Test.CALIBRATIONS[this.loopArg ? 0 : 1];
262
-
263
- // If the period is within 20% of the calibration time, then zero the
264
- // it out
265
- p = p < cal.period*1.2 ? 0 : p - cal.period;
266
- }
267
-
268
- return Math.round(1/p);
269
- },
270
-
271
- /**
272
- * Get a friendly string describing the test
273
- */
274
- toString: function() {
275
- return this.name + ' - ' + this.time/this.count + ' secs';
276
- }
277
- });
278
-
279
- // CSS we need for the UI
280
- var STYLESHEET = '<style> \
281
- #jslitmus {font-family:sans-serif; font-size: 12px;} \
282
- #jslitmus a {text-decoration: none;} \
283
- #jslitmus a:hover {text-decoration: underline;} \
284
- #jsl_status { \
285
- margin-top: 10px; \
286
- font-size: 10px; \
287
- color: #888; \
288
- } \
289
- A IMG {border:none} \
290
- #test_results { \
291
- margin-top: 10px; \
292
- font-size: 12px; \
293
- font-family: sans-serif; \
294
- border-collapse: collapse; \
295
- border-spacing: 0px; \
296
- } \
297
- #test_results th, #test_results td { \
298
- border: solid 1px #ccc; \
299
- vertical-align: top; \
300
- padding: 3px; \
301
- } \
302
- #test_results th { \
303
- vertical-align: bottom; \
304
- background-color: #ccc; \
305
- padding: 1px; \
306
- font-size: 10px; \
307
- } \
308
- #test_results #test_platform { \
309
- color: #444; \
310
- text-align:center; \
311
- } \
312
- #test_results .test_row { \
313
- color: #006; \
314
- cursor: pointer; \
315
- } \
316
- #test_results .test_nonlooping { \
317
- border-left-style: dotted; \
318
- border-left-width: 2px; \
319
- } \
320
- #test_results .test_looping { \
321
- border-left-style: solid; \
322
- border-left-width: 2px; \
323
- } \
324
- #test_results .test_name {white-space: nowrap;} \
325
- #test_results .test_pending { \
326
- } \
327
- #test_results .test_running { \
328
- font-style: italic; \
329
- } \
330
- #test_results .test_done {} \
331
- #test_results .test_done { \
332
- text-align: right; \
333
- font-family: monospace; \
334
- } \
335
- #test_results .test_error {color: #600;} \
336
- #test_results .test_error .error_head {font-weight:bold;} \
337
- #test_results .test_error .error_body {font-size:85%;} \
338
- #test_results .test_row:hover td { \
339
- background-color: #ffc; \
340
- text-decoration: underline; \
341
- } \
342
- #chart { \
343
- margin: 10px 0px; \
344
- width: 250px; \
345
- } \
346
- #chart img { \
347
- border: solid 1px #ccc; \
348
- margin-bottom: 5px; \
349
- } \
350
- #chart #tiny_url { \
351
- height: 40px; \
352
- width: 250px; \
353
- } \
354
- #jslitmus_credit { \
355
- font-size: 10px; \
356
- color: #888; \
357
- margin-top: 8px; \
358
- } \
359
- </style>';
360
-
361
- // HTML markup for the UI
362
- var MARKUP = '<div id="jslitmus"> \
363
- <button onclick="JSLitmus.runAll(event)">Run Tests</button> \
364
- <button id="stop_button" disabled="disabled" onclick="JSLitmus.stop()">Stop Tests</button> \
365
- <br \> \
366
- <br \> \
367
- <input type="checkbox" style="vertical-align: middle" id="test_normalize" checked="checked" onchange="JSLitmus.renderAll()""> Normalize results \
368
- <table id="test_results"> \
369
- <colgroup> \
370
- <col /> \
371
- <col width="100" /> \
372
- </colgroup> \
373
- <tr><th id="test_platform" colspan="2">' + platform + '</th></tr> \
374
- <tr><th>Test</th><th>Ops/sec</th></tr> \
375
- <tr id="test_row_template" class="test_row" style="display:none"> \
376
- <td class="test_name"></td> \
377
- <td class="test_result">Ready</td> \
378
- </tr> \
379
- </table> \
380
- <div id="jsl_status"></div> \
381
- <div id="chart" style="display:none"> \
382
- <a id="chart_link" target="_blank"><img id="chart_image"></a> \
383
- TinyURL (for chart): \
384
- <iframe id="tiny_url" frameBorder="0" scrolling="no" src=""></iframe> \
385
- </div> \
386
- <a id="jslitmus_credit" title="JSLitmus home page" href="http://code.google.com/p/jslitmus" target="_blank">Powered by JSLitmus</a> \
387
- </div>';
388
-
389
- /**
390
- * The public API for creating and running tests
391
- */
392
- window.JSLitmus = {
393
- /** The list of all tests that have been registered with JSLitmus.test */
394
- _tests: [],
395
- /** The queue of tests that need to be run */
396
- _queue: [],
397
-
398
- /**
399
- * The parsed query parameters the current page URL. This is provided as a
400
- * convenience for test functions - it's not used by JSLitmus proper
401
- */
402
- params: {},
403
-
404
- /**
405
- * Initialize
406
- */
407
- _init: function() {
408
- // Parse query params into JSLitmus.params[] hash
409
- var match = (location + '').match(/([^?#]*)(#.*)?$/);
410
- if (match) {
411
- var pairs = match[1].split('&');
412
- for (var i = 0; i < pairs.length; i++) {
413
- var pair = pairs[i].split('=');
414
- if (pair.length > 1) {
415
- var key = pair.shift();
416
- var value = pair.length > 1 ? pair.join('=') : pair[0];
417
- this.params[key] = value;
418
- }
419
- }
420
- }
421
-
422
- // Write out the stylesheet. We have to do this here because IE
423
- // doesn't honor sheets written after the document has loaded.
424
- document.write(STYLESHEET);
425
-
426
- // Setup the rest of the UI once the document is loaded
427
- if (window.addEventListener) {
428
- window.addEventListener('load', this._setup, false);
429
- } else if (document.addEventListener) {
430
- document.addEventListener('load', this._setup, false);
431
- } else if (window.attachEvent) {
432
- window.attachEvent('onload', this._setup);
433
- }
434
-
435
- return this;
436
- },
437
-
438
- /**
439
- * Set up the UI
440
- */
441
- _setup: function() {
442
- var el = jsl.$('jslitmus_container');
443
- if (!el) document.body.appendChild(el = document.createElement('div'));
444
-
445
- el.innerHTML = MARKUP;
446
-
447
- // Render the UI for all our tests
448
- for (var i=0; i < JSLitmus._tests.length; i++)
449
- JSLitmus.renderTest(JSLitmus._tests[i]);
450
- },
451
-
452
- /**
453
- * (Re)render all the test results
454
- */
455
- renderAll: function() {
456
- for (var i = 0; i < JSLitmus._tests.length; i++)
457
- JSLitmus.renderTest(JSLitmus._tests[i]);
458
- JSLitmus.renderChart();
459
- },
460
-
461
- /**
462
- * (Re)render the chart graphics
463
- */
464
- renderChart: function() {
465
- var url = JSLitmus.chartUrl();
466
- jsl.$('chart_link').href = url;
467
- jsl.$('chart_image').src = url;
468
- jsl.$('chart').style.display = '';
469
-
470
- // Update the tiny URL
471
- jsl.$('tiny_url').src = 'http://tinyurl.com/api-create.php?url='+escape(url);
472
- },
473
-
474
- /**
475
- * (Re)render the results for a specific test
476
- */
477
- renderTest: function(test) {
478
- // Make a new row if needed
479
- if (!test._row) {
480
- var trow = jsl.$('test_row_template');
481
- if (!trow) return;
482
-
483
- test._row = trow.cloneNode(true);
484
- test._row.style.display = '';
485
- test._row.id = '';
486
- test._row.onclick = function() {JSLitmus._queueTest(test);};
487
- test._row.title = 'Run ' + test.name + ' test';
488
- trow.parentNode.appendChild(test._row);
489
- test._row.cells[0].innerHTML = test.name;
490
- }
491
-
492
- var cell = test._row.cells[1];
493
- var cns = [test.loopArg ? 'test_looping' : 'test_nonlooping'];
494
-
495
- if (test.error) {
496
- cns.push('test_error');
497
- cell.innerHTML =
498
- '<div class="error_head">' + test.error + '</div>' +
499
- '<ul class="error_body"><li>' +
500
- jsl.join(test.error, ': ', '</li><li>') +
501
- '</li></ul>';
502
- } else {
503
- if (test.running) {
504
- cns.push('test_running');
505
- cell.innerHTML = 'running';
506
- } else if (jsl.indexOf(JSLitmus._queue, test) >= 0) {
507
- cns.push('test_pending');
508
- cell.innerHTML = 'pending';
509
- } else if (test.count) {
510
- cns.push('test_done');
511
- var hz = test.getHz(jsl.$('test_normalize').checked);
512
- cell.innerHTML = hz != Infinity ? hz : '&infin;';
513
- cell.title = 'Looped ' + test.count + ' times in ' + test.time + ' seconds';
514
- } else {
515
- cell.innerHTML = 'ready';
516
- }
517
- }
518
- cell.className = cns.join(' ');
519
- },
520
-
521
- /**
522
- * Create a new test
523
- */
524
- test: function(name, f) {
525
- // Create the Test object
526
- var test = new Test(name, f);
527
- JSLitmus._tests.push(test);
528
-
529
- // Re-render if the test state changes
530
- test.onChange = JSLitmus.renderTest;
531
-
532
- // Run the next test if this one finished
533
- test.onStop = function(test) {
534
- if (JSLitmus.onTestFinish) JSLitmus.onTestFinish(test);
535
- JSLitmus.currentTest = null;
536
- JSLitmus._nextTest();
537
- };
538
-
539
- // Render the new test
540
- this.renderTest(test);
541
- },
542
-
543
- /**
544
- * Add all tests to the run queue
545
- */
546
- runAll: function(e) {
547
- e = e || window.event;
548
- var reverse = e && e.shiftKey, len = JSLitmus._tests.length;
549
- for (var i = 0; i < len; i++) {
550
- JSLitmus._queueTest(JSLitmus._tests[!reverse ? i : (len - i - 1)]);
551
- }
552
- },
553
-
554
- /**
555
- * Remove all tests from the run queue. The current test has to finish on
556
- * it's own though
557
- */
558
- stop: function() {
559
- while (JSLitmus._queue.length) {
560
- var test = JSLitmus._queue.shift();
561
- JSLitmus.renderTest(test);
562
- }
563
- },
564
-
565
- /**
566
- * Run the next test in the run queue
567
- */
568
- _nextTest: function() {
569
- if (!JSLitmus.currentTest) {
570
- var test = JSLitmus._queue.shift();
571
- if (test) {
572
- jsl.$('stop_button').disabled = false;
573
- JSLitmus.currentTest = test;
574
- test.run();
575
- JSLitmus.renderTest(test);
576
- if (JSLitmus.onTestStart) JSLitmus.onTestStart(test);
577
- } else {
578
- jsl.$('stop_button').disabled = true;
579
- JSLitmus.renderChart();
580
- }
581
- }
582
- },
583
-
584
- /**
585
- * Add a test to the run queue
586
- */
587
- _queueTest: function(test) {
588
- if (jsl.indexOf(JSLitmus._queue, test) >= 0) return;
589
- JSLitmus._queue.push(test);
590
- JSLitmus.renderTest(test);
591
- JSLitmus._nextTest();
592
- },
593
-
594
- /**
595
- * Generate a Google Chart URL that shows the data for all tests
596
- */
597
- chartUrl: function() {
598
- var n = JSLitmus._tests.length, markers = [], data = [];
599
- var d, min = 0, max = -1e10;
600
- var normalize = jsl.$('test_normalize').checked;
601
-
602
- // Gather test data
603
- for (var i=0; i < JSLitmus._tests.length; i++) {
604
- var test = JSLitmus._tests[i];
605
- if (test.count) {
606
- var hz = test.getHz(normalize);
607
- var v = hz != Infinity ? hz : 0;
608
- data.push(v);
609
- markers.push('t' + jsl.escape(test.name + '(' + jsl.toLabel(hz)+ ')') + ',000000,0,' +
610
- markers.length + ',10');
611
- max = Math.max(v, max);
612
- }
613
- }
614
- if (markers.length <= 0) return null;
615
-
616
- // Build chart title
617
- var title = document.getElementsByTagName('title');
618
- title = (title && title.length) ? title[0].innerHTML : null;
619
- var chart_title = [];
620
- if (title) chart_title.push(title);
621
- chart_title.push('Ops/sec (' + platform + ')');
622
-
623
- // Build labels
624
- var labels = [jsl.toLabel(min), jsl.toLabel(max)];
625
-
626
- var w = 250, bw = 15;
627
- var bs = 5;
628
- var h = markers.length*(bw + bs) + 30 + chart_title.length*20;
629
-
630
- var params = {
631
- chtt: escape(chart_title.join('|')),
632
- chts: '000000,10',
633
- cht: 'bhg', // chart type
634
- chd: 't:' + data.join(','), // data set
635
- chds: min + ',' + max, // max/min of data
636
- chxt: 'x', // label axes
637
- chxl: '0:|' + labels.join('|'), // labels
638
- chsp: '0,1',
639
- chm: markers.join('|'), // test names
640
- chbh: [bw, 0, bs].join(','), // bar widths
641
- // chf: 'bg,lg,0,eeeeee,0,eeeeee,.5,ffffff,1', // gradient
642
- chs: w + 'x' + h
643
- };
644
- return 'http://chart.apis.google.com/chart?' + jsl.join(params, '=', '&');
645
- }
646
- };
647
-
648
- JSLitmus._init();
649
- })();