chartkick 1.3.2 → 1.4.0
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.
Potentially problematic release.
This version of chartkick might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/CHANGELOG.md +5 -0
- data/Gemfile +1 -1
- data/README.md +13 -1
- data/Rakefile +1 -1
- data/app/assets/javascripts/chartkick.js +116 -30
- data/chartkick.gemspec +6 -6
- data/lib/chartkick.rb +3 -3
- data/lib/chartkick/engine.rb +3 -5
- data/lib/chartkick/helper.rb +8 -6
- data/lib/chartkick/sinatra.rb +2 -0
- data/lib/chartkick/version.rb +1 -1
- data/test/chartkick_test.rb +5 -0
- metadata +5 -4
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 9e4271e7d959b8fcad6ab2a8265231d64f16c3c8
         | 
| 4 | 
            +
              data.tar.gz: 96e3d4ef110a67385e2973357cf390ec334db12b
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 5811e2cd0fc00aaa8f49686d001f965283296a6e75ebd3ec80251c9b67063ffd79b8e08e57474bec3924518fec3570a73da3663b8ec54c9b14e42605f976b2ab
         | 
| 7 | 
            +
              data.tar.gz: 17f0605334a89a8a29bf16f3ea5534806d2b6eb6ede00bffc577f1e785764984fe32f391595fb62a283dd897155d29d2ec4f502fe9481b6377263fd9dfc4805a
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    
    
        data/Gemfile
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -8,7 +8,7 @@ Works with Rails, Sinatra and most browsers (including IE 6) | |
| 8 8 |  | 
| 9 9 | 
             
            :two_hearts: A perfect companion to [groupdate](https://github.com/ankane/groupdate), [hightop](https://github.com/ankane/hightop), and [active_median](https://github.com/ankane/active_median)
         | 
| 10 10 |  | 
| 11 | 
            -
            :speech_balloon: Get [handcrafted updates](http://chartkick.us7.list-manage.com/subscribe?u=952c861f99eb43084e0a49f98&id=6ea6541e8e&group[0][ | 
| 11 | 
            +
            :speech_balloon: Get [handcrafted updates](http://chartkick.us7.list-manage.com/subscribe?u=952c861f99eb43084e0a49f98&id=6ea6541e8e&group[0][2]=true) for new features
         | 
| 12 12 |  | 
| 13 13 | 
             
            ## Charts
         | 
| 14 14 |  | 
| @@ -42,6 +42,12 @@ Area chart | |
| 42 42 | 
             
            <%= area_chart Visit.group_by_minute(:created_at).maximum(:load_time) %>
         | 
| 43 43 | 
             
            ```
         | 
| 44 44 |  | 
| 45 | 
            +
            Scatter chart
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            ```erb
         | 
| 48 | 
            +
            <%= scatter_chart City.pluck(:size, :population) %>
         | 
| 49 | 
            +
            ```
         | 
| 50 | 
            +
             | 
| 45 51 | 
             
            Geo chart
         | 
| 46 52 |  | 
| 47 53 | 
             
            ```erb
         | 
| @@ -132,6 +138,12 @@ Discrete axis | |
| 132 138 | 
             
            <%= line_chart data, discrete: true %>
         | 
| 133 139 | 
             
            ```
         | 
| 134 140 |  | 
| 141 | 
            +
            Axis titles
         | 
| 142 | 
            +
             | 
| 143 | 
            +
            ```erb
         | 
| 144 | 
            +
            <%= line_chart data, xtitle: "Time", ytitle: "Population" %>
         | 
| 145 | 
            +
            ```
         | 
| 146 | 
            +
             | 
| 135 147 | 
             
            You can pass options directly to the charting library with:
         | 
| 136 148 |  | 
| 137 149 | 
             
            ```erb
         | 
    
        data/Rakefile
    CHANGED
    
    
| @@ -2,7 +2,7 @@ | |
| 2 2 | 
             
             * Chartkick.js
         | 
| 3 3 | 
             
             * Create beautiful Javascript charts with minimal code
         | 
| 4 4 | 
             
             * https://github.com/ankane/chartkick.js
         | 
| 5 | 
            -
             * v1. | 
| 5 | 
            +
             * v1.4.0
         | 
| 6 6 | 
             
             * MIT License
         | 
| 7 7 | 
             
             */
         | 
| 8 8 |  | 
| @@ -101,7 +101,7 @@ | |
| 101 101 | 
             
                return false;
         | 
| 102 102 | 
             
              }
         | 
| 103 103 |  | 
| 104 | 
            -
              function jsOptionsFunc(defaultOptions, hideLegend, setMin, setMax, setStacked) {
         | 
| 104 | 
            +
              function jsOptionsFunc(defaultOptions, hideLegend, setMin, setMax, setStacked, setXtitle, setYtitle) {
         | 
| 105 105 | 
             
                return function (series, opts, chartOptions) {
         | 
| 106 106 | 
             
                  var options = merge({}, defaultOptions);
         | 
| 107 107 | 
             
                  options = merge(options, chartOptions || {});
         | 
| @@ -113,14 +113,14 @@ | |
| 113 113 | 
             
                  }
         | 
| 114 114 |  | 
| 115 115 | 
             
                  // min
         | 
| 116 | 
            -
                  if ( | 
| 116 | 
            +
                  if (opts.min) {
         | 
| 117 117 | 
             
                    setMin(options, opts.min);
         | 
| 118 118 | 
             
                  } else if (!negativeValues(series)) {
         | 
| 119 119 | 
             
                    setMin(options, 0);
         | 
| 120 120 | 
             
                  }
         | 
| 121 121 |  | 
| 122 122 | 
             
                  // max
         | 
| 123 | 
            -
                  if ( | 
| 123 | 
            +
                  if (opts.max) {
         | 
| 124 124 | 
             
                    setMax(options, opts.max);
         | 
| 125 125 | 
             
                  }
         | 
| 126 126 |  | 
| @@ -132,6 +132,14 @@ | |
| 132 132 | 
             
                    options.colors = opts.colors;
         | 
| 133 133 | 
             
                  }
         | 
| 134 134 |  | 
| 135 | 
            +
                  if (opts.xtitle) {
         | 
| 136 | 
            +
                    setXtitle(options, opts.xtitle);
         | 
| 137 | 
            +
                  }
         | 
| 138 | 
            +
             | 
| 139 | 
            +
                  if (opts.ytitle) {
         | 
| 140 | 
            +
                    setYtitle(options, opts.ytitle);
         | 
| 141 | 
            +
                  }
         | 
| 142 | 
            +
             | 
| 135 143 | 
             
                  // merge library last
         | 
| 136 144 | 
             
                  options = merge(options, opts.library || {});
         | 
| 137 145 |  | 
| @@ -231,9 +239,14 @@ | |
| 231 239 | 
             
                var HighchartsAdapter = new function () {
         | 
| 232 240 | 
             
                  var Highcharts = window.Highcharts;
         | 
| 233 241 |  | 
| 242 | 
            +
                  this.name = "highcharts";
         | 
| 243 | 
            +
             | 
| 234 244 | 
             
                  var defaultOptions = {
         | 
| 235 245 | 
             
                    chart: {},
         | 
| 236 246 | 
             
                    xAxis: {
         | 
| 247 | 
            +
                      title: {
         | 
| 248 | 
            +
                        text: null
         | 
| 249 | 
            +
                      },
         | 
| 237 250 | 
             
                      labels: {
         | 
| 238 251 | 
             
                        style: {
         | 
| 239 252 | 
             
                          fontSize: "12px"
         | 
| @@ -288,7 +301,15 @@ | |
| 288 301 | 
             
                    options.plotOptions.series.stacking = "normal";
         | 
| 289 302 | 
             
                  };
         | 
| 290 303 |  | 
| 291 | 
            -
                  var  | 
| 304 | 
            +
                  var setXtitle = function (options, title) {
         | 
| 305 | 
            +
                    options.xAxis.title.text = title;
         | 
| 306 | 
            +
                  };
         | 
| 307 | 
            +
             | 
| 308 | 
            +
                  var setYtitle = function (options, title) {
         | 
| 309 | 
            +
                    options.yAxis.title.text = title;
         | 
| 310 | 
            +
                  };
         | 
| 311 | 
            +
             | 
| 312 | 
            +
                  var jsOptions = jsOptionsFunc(defaultOptions, hideLegend, setMin, setMax, setStacked, setXtitle, setYtitle);
         | 
| 292 313 |  | 
| 293 314 | 
             
                  this.renderLineChart = function (chart, chartType) {
         | 
| 294 315 | 
             
                    chartType = chartType || "spline";
         | 
| @@ -326,6 +347,15 @@ | |
| 326 347 | 
             
                    new Highcharts.Chart(options);
         | 
| 327 348 | 
             
                  };
         | 
| 328 349 |  | 
| 350 | 
            +
                  this.renderScatterChart = function (chart) {
         | 
| 351 | 
            +
                    var chartOptions = {};
         | 
| 352 | 
            +
                    var options = jsOptions(chart.data, chart.options, chartOptions);
         | 
| 353 | 
            +
                    options.chart.type = 'scatter';
         | 
| 354 | 
            +
                    options.chart.renderTo = chart.element.id;
         | 
| 355 | 
            +
                    options.series = chart.data;
         | 
| 356 | 
            +
                    new Highcharts.Chart(options);
         | 
| 357 | 
            +
                  };
         | 
| 358 | 
            +
             | 
| 329 359 | 
             
                  this.renderPieChart = function (chart) {
         | 
| 330 360 | 
             
                    var chartOptions = {};
         | 
| 331 361 | 
             
                    if (chart.options.colors) {
         | 
| @@ -401,6 +431,8 @@ | |
| 401 431 | 
             
                var GoogleChartsAdapter = new function () {
         | 
| 402 432 | 
             
                  var google = window.google;
         | 
| 403 433 |  | 
| 434 | 
            +
                  this.name = "google";
         | 
| 435 | 
            +
             | 
| 404 436 | 
             
                  var loaded = {};
         | 
| 405 437 | 
             
                  var callbacks = [];
         | 
| 406 438 |  | 
| @@ -408,7 +440,7 @@ | |
| 408 440 | 
             
                    var cb, call;
         | 
| 409 441 | 
             
                    for (var i = 0; i < callbacks.length; i++) {
         | 
| 410 442 | 
             
                      cb = callbacks[i];
         | 
| 411 | 
            -
                      call = google.visualization && ((cb.pack  | 
| 443 | 
            +
                      call = google.visualization && ((cb.pack === "corechart" && google.visualization.LineChart) || (cb.pack === "timeline" && google.visualization.Timeline))
         | 
| 412 444 | 
             
                      if (call) {
         | 
| 413 445 | 
             
                        cb.callback();
         | 
| 414 446 | 
             
                        callbacks.splice(i, 1);
         | 
| @@ -461,6 +493,7 @@ | |
| 461 493 | 
             
                        color: "#666",
         | 
| 462 494 | 
             
                        fontSize: 12
         | 
| 463 495 | 
             
                      },
         | 
| 496 | 
            +
                      titleTextStyle: {},
         | 
| 464 497 | 
             
                      gridlines: {
         | 
| 465 498 | 
             
                        color: "transparent"
         | 
| 466 499 | 
             
                      },
         | 
| @@ -472,6 +505,7 @@ | |
| 472 505 | 
             
                        color: "#666",
         | 
| 473 506 | 
             
                        fontSize: 12
         | 
| 474 507 | 
             
                      },
         | 
| 508 | 
            +
                      titleTextStyle: {},
         | 
| 475 509 | 
             
                      baselineColor: "#ccc",
         | 
| 476 510 | 
             
                      viewWindow: {}
         | 
| 477 511 | 
             
                    },
         | 
| @@ -507,7 +541,17 @@ | |
| 507 541 | 
             
                    options.isStacked = true;
         | 
| 508 542 | 
             
                  };
         | 
| 509 543 |  | 
| 510 | 
            -
                  var  | 
| 544 | 
            +
                  var setXtitle = function (options, title) {
         | 
| 545 | 
            +
                    options.hAxis.title = title;
         | 
| 546 | 
            +
                    options.hAxis.titleTextStyle.italic = false;
         | 
| 547 | 
            +
                  }
         | 
| 548 | 
            +
             | 
| 549 | 
            +
                  var setYtitle = function (options, title) {
         | 
| 550 | 
            +
                    options.vAxis.title = title;
         | 
| 551 | 
            +
                    options.vAxis.titleTextStyle.italic = false;
         | 
| 552 | 
            +
                  };
         | 
| 553 | 
            +
             | 
| 554 | 
            +
                  var jsOptions = jsOptionsFunc(defaultOptions, hideLegend, setMin, setMax, setStacked, setXtitle, setYtitle);
         | 
| 511 555 |  | 
| 512 556 | 
             
                  // cant use object as key
         | 
| 513 557 | 
             
                  var createDataTable = function (series, columnType) {
         | 
| @@ -530,9 +574,17 @@ | |
| 530 574 | 
             
                    }
         | 
| 531 575 |  | 
| 532 576 | 
             
                    var rows2 = [];
         | 
| 577 | 
            +
                    var value;
         | 
| 533 578 | 
             
                    for (i in rows) {
         | 
| 534 579 | 
             
                      if (rows.hasOwnProperty(i)) {
         | 
| 535 | 
            -
                         | 
| 580 | 
            +
                        if (columnType === "datetime") {
         | 
| 581 | 
            +
                          value = new Date(toFloat(i));
         | 
| 582 | 
            +
                        } else if (columnType === "number") {
         | 
| 583 | 
            +
                          value = toFloat(i);
         | 
| 584 | 
            +
                        } else {
         | 
| 585 | 
            +
                          value = i;
         | 
| 586 | 
            +
                        }
         | 
| 587 | 
            +
                        rows2.push([value].concat(rows[i]));
         | 
| 536 588 | 
             
                      }
         | 
| 537 589 | 
             
                    }
         | 
| 538 590 | 
             
                    if (columnType === "datetime") {
         | 
| @@ -655,6 +707,19 @@ | |
| 655 707 | 
             
                    });
         | 
| 656 708 | 
             
                  };
         | 
| 657 709 |  | 
| 710 | 
            +
                  this.renderScatterChart = function (chart) {
         | 
| 711 | 
            +
                    waitForLoaded(function () {
         | 
| 712 | 
            +
                      var chartOptions = {};
         | 
| 713 | 
            +
                      var options = jsOptions(chart.data, chart.options, chartOptions);
         | 
| 714 | 
            +
                      var data = createDataTable(chart.data, "number");
         | 
| 715 | 
            +
             | 
| 716 | 
            +
                      chart.chart = new google.visualization.ScatterChart(chart.element);
         | 
| 717 | 
            +
                      resize(function () {
         | 
| 718 | 
            +
                        chart.chart.draw(data, options);
         | 
| 719 | 
            +
                      });
         | 
| 720 | 
            +
                    });
         | 
| 721 | 
            +
                  };
         | 
| 722 | 
            +
             | 
| 658 723 | 
             
                  this.renderTimeline = function (chart) {
         | 
| 659 724 | 
             
                    waitForLoaded("timeline", function () {
         | 
| 660 725 | 
             
                      var chartOptions = {
         | 
| @@ -662,7 +727,7 @@ | |
| 662 727 | 
             
                      };
         | 
| 663 728 |  | 
| 664 729 | 
             
                      if (chart.options.colors) {
         | 
| 665 | 
            -
                        chartOptions. | 
| 730 | 
            +
                        chartOptions.colors = chart.options.colors;
         | 
| 666 731 | 
             
                      }
         | 
| 667 732 | 
             
                      var options = merge(merge(defaultOptions, chartOptions), chart.options.library || {});
         | 
| 668 733 |  | 
| @@ -684,16 +749,16 @@ | |
| 684 749 | 
             
                adapters.push(GoogleChartsAdapter);
         | 
| 685 750 | 
             
              }
         | 
| 686 751 |  | 
| 687 | 
            -
              // TODO add adapter option
         | 
| 688 752 | 
             
              // TODO remove chartType if cross-browser way
         | 
| 689 753 | 
             
              // to get the name of the chart class
         | 
| 690 754 | 
             
              function renderChart(chartType, chart) {
         | 
| 691 | 
            -
                var i, adapter, fnName;
         | 
| 755 | 
            +
                var i, adapter, fnName, adapterName;
         | 
| 692 756 | 
             
                fnName = "render" + chartType;
         | 
| 757 | 
            +
                adapterName = chart.options.adapter;
         | 
| 693 758 |  | 
| 694 759 | 
             
                for (i = 0; i < adapters.length; i++) {
         | 
| 695 760 | 
             
                  adapter = adapters[i];
         | 
| 696 | 
            -
                  if (isFunction(adapter[fnName])) {
         | 
| 761 | 
            +
                  if ((!adapterName || adapterName === adapter.name) && isFunction(adapter[fnName])) {
         | 
| 697 762 | 
             
                    return adapter[fnName](chart);
         | 
| 698 763 | 
             
                  }
         | 
| 699 764 | 
             
                }
         | 
| @@ -702,8 +767,31 @@ | |
| 702 767 |  | 
| 703 768 | 
             
              // process data
         | 
| 704 769 |  | 
| 705 | 
            -
              function  | 
| 706 | 
            -
                 | 
| 770 | 
            +
              var toFormattedKey = function (key, keyType) {
         | 
| 771 | 
            +
                if (keyType === "number") {
         | 
| 772 | 
            +
                  key = toFloat(key);
         | 
| 773 | 
            +
                } else if (keyType === "datetime") {
         | 
| 774 | 
            +
                  key = toDate(key);
         | 
| 775 | 
            +
                } else {
         | 
| 776 | 
            +
                  key = toStr(key);
         | 
| 777 | 
            +
                }
         | 
| 778 | 
            +
                return key;
         | 
| 779 | 
            +
              };
         | 
| 780 | 
            +
             | 
| 781 | 
            +
              var formatSeriesData = function (data, keyType) {
         | 
| 782 | 
            +
                var r = [], key, j;
         | 
| 783 | 
            +
                for (j = 0; j < data.length; j++) {
         | 
| 784 | 
            +
                  key = toFormattedKey(data[j][0], keyType);
         | 
| 785 | 
            +
                  r.push([key, toFloat(data[j][1])]);
         | 
| 786 | 
            +
                }
         | 
| 787 | 
            +
                if (keyType === "datetime") {
         | 
| 788 | 
            +
                  r.sort(sortByTime);
         | 
| 789 | 
            +
                }
         | 
| 790 | 
            +
                return r;
         | 
| 791 | 
            +
              };
         | 
| 792 | 
            +
             | 
| 793 | 
            +
              function processSeries(series, opts, keyType) {
         | 
| 794 | 
            +
                var i;
         | 
| 707 795 |  | 
| 708 796 | 
             
                // see if one series or multiple
         | 
| 709 797 | 
             
                if (!isArray(series) || typeof series[0] !== "object" || isArray(series[0])) {
         | 
| @@ -713,22 +801,12 @@ | |
| 713 801 | 
             
                  opts.hideLegend = false;
         | 
| 714 802 | 
             
                }
         | 
| 715 803 | 
             
                if (opts.discrete) {
         | 
| 716 | 
            -
                   | 
| 804 | 
            +
                  keyType = "string";
         | 
| 717 805 | 
             
                }
         | 
| 718 806 |  | 
| 719 807 | 
             
                // right format
         | 
| 720 808 | 
             
                for (i = 0; i < series.length; i++) {
         | 
| 721 | 
            -
                  data = toArr(series[i].data);
         | 
| 722 | 
            -
                  r = [];
         | 
| 723 | 
            -
                  for (j = 0; j < data.length; j++) {
         | 
| 724 | 
            -
                    key = data[j][0];
         | 
| 725 | 
            -
                    key = time ? toDate(key) : toStr(key);
         | 
| 726 | 
            -
                    r.push([key, toFloat(data[j][1])]);
         | 
| 727 | 
            -
                  }
         | 
| 728 | 
            -
                  if (time) {
         | 
| 729 | 
            -
                    r.sort(sortByTime);
         | 
| 730 | 
            -
                  }
         | 
| 731 | 
            -
                  series[i].data = r;
         | 
| 809 | 
            +
                  series[i].data = formatSeriesData(toArr(series[i].data), keyType);
         | 
| 732 810 | 
             
                }
         | 
| 733 811 |  | 
| 734 812 | 
             
                return series;
         | 
| @@ -753,12 +831,12 @@ | |
| 753 831 | 
             
              }
         | 
| 754 832 |  | 
| 755 833 | 
             
              function processLineData(chart) {
         | 
| 756 | 
            -
                chart.data = processSeries(chart.data, chart.options,  | 
| 834 | 
            +
                chart.data = processSeries(chart.data, chart.options, "datetime");
         | 
| 757 835 | 
             
                renderChart("LineChart", chart);
         | 
| 758 836 | 
             
              }
         | 
| 759 837 |  | 
| 760 838 | 
             
              function processColumnData(chart) {
         | 
| 761 | 
            -
                chart.data = processSeries(chart.data, chart.options,  | 
| 839 | 
            +
                chart.data = processSeries(chart.data, chart.options, "string");
         | 
| 762 840 | 
             
                renderChart("ColumnChart", chart);
         | 
| 763 841 | 
             
              }
         | 
| 764 842 |  | 
| @@ -768,12 +846,12 @@ | |
| 768 846 | 
             
              }
         | 
| 769 847 |  | 
| 770 848 | 
             
              function processBarData(chart) {
         | 
| 771 | 
            -
                chart.data = processSeries(chart.data, chart.options,  | 
| 849 | 
            +
                chart.data = processSeries(chart.data, chart.options, "string");
         | 
| 772 850 | 
             
                renderChart("BarChart", chart);
         | 
| 773 851 | 
             
              }
         | 
| 774 852 |  | 
| 775 853 | 
             
              function processAreaData(chart) {
         | 
| 776 | 
            -
                chart.data = processSeries(chart.data, chart.options,  | 
| 854 | 
            +
                chart.data = processSeries(chart.data, chart.options, "datetime");
         | 
| 777 855 | 
             
                renderChart("AreaChart", chart);
         | 
| 778 856 | 
             
              }
         | 
| 779 857 |  | 
| @@ -782,6 +860,11 @@ | |
| 782 860 | 
             
                renderChart("GeoChart", chart);
         | 
| 783 861 | 
             
              }
         | 
| 784 862 |  | 
| 863 | 
            +
              function processScatterData(chart) {
         | 
| 864 | 
            +
                chart.data = processSeries(chart.data, chart.options, "number");
         | 
| 865 | 
            +
                renderChart("ScatterChart", chart);
         | 
| 866 | 
            +
              }
         | 
| 867 | 
            +
             | 
| 785 868 | 
             
              function processTimelineData(chart) {
         | 
| 786 869 | 
             
                chart.data = processTime(chart.data);
         | 
| 787 870 | 
             
                renderChart("Timeline", chart);
         | 
| @@ -819,6 +902,9 @@ | |
| 819 902 | 
             
                GeoChart: function (element, dataSource, opts) {
         | 
| 820 903 | 
             
                  setElement(this, element, dataSource, opts, processGeoData);
         | 
| 821 904 | 
             
                },
         | 
| 905 | 
            +
                ScatterChart: function (element, dataSource, opts) {
         | 
| 906 | 
            +
                  setElement(this, element, dataSource, opts, processScatterData);
         | 
| 907 | 
            +
                },
         | 
| 822 908 | 
             
                Timeline: function (element, dataSource, opts) {
         | 
| 823 909 | 
             
                  setElement(this, element, dataSource, opts, processTimelineData);
         | 
| 824 910 | 
             
                },
         | 
    
        data/chartkick.gemspec
    CHANGED
    
    | @@ -1,19 +1,19 @@ | |
| 1 1 | 
             
            # coding: utf-8
         | 
| 2 | 
            -
            lib = File.expand_path( | 
| 2 | 
            +
            lib = File.expand_path("../lib", __FILE__)
         | 
| 3 3 | 
             
            $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
         | 
| 4 | 
            -
            require  | 
| 4 | 
            +
            require "chartkick/version"
         | 
| 5 5 |  | 
| 6 6 | 
             
            Gem::Specification.new do |spec|
         | 
| 7 7 | 
             
              spec.name          = "chartkick"
         | 
| 8 8 | 
             
              spec.version       = Chartkick::VERSION
         | 
| 9 9 | 
             
              spec.authors       = ["Andrew Kane"]
         | 
| 10 10 | 
             
              spec.email         = ["acekane1@gmail.com"]
         | 
| 11 | 
            -
              spec.description   =  | 
| 12 | 
            -
              spec.summary       =  | 
| 13 | 
            -
              spec.homepage      = ""
         | 
| 11 | 
            +
              spec.description   = "Create beautiful Javascript charts with one line of Ruby"
         | 
| 12 | 
            +
              spec.summary       = "Create beautiful Javascript charts with one line of Ruby"
         | 
| 13 | 
            +
              spec.homepage      = "http://chartkick.com"
         | 
| 14 14 | 
             
              spec.license       = "MIT"
         | 
| 15 15 |  | 
| 16 | 
            -
              spec.files         = `git ls-files`.split( | 
| 16 | 
            +
              spec.files         = `git ls-files`.split($INPUT_RECORD_SEPARATOR)
         | 
| 17 17 | 
             
              spec.executables   = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
         | 
| 18 18 | 
             
              spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
         | 
| 19 19 | 
             
              spec.require_paths = ["lib"]
         | 
    
        data/lib/chartkick.rb
    CHANGED
    
    | @@ -15,9 +15,9 @@ end | |
| 15 15 | 
             
            # use Enumerable so it can be called on arrays
         | 
| 16 16 | 
             
            module Enumerable
         | 
| 17 17 | 
             
              def chart_json
         | 
| 18 | 
            -
                if is_a?(Hash)  | 
| 19 | 
            -
                  group_by{|k,  | 
| 20 | 
            -
                    {name: name, data: data.map{|k, v| [k[1], v] }}
         | 
| 18 | 
            +
                if is_a?(Hash) && (key = keys.first) && key.is_a?(Array) && key.size == 2
         | 
| 19 | 
            +
                  group_by { |k, _v| k[0] }.map do |name, data|
         | 
| 20 | 
            +
                    {name: name, data: data.map { |k, v| [k[1], v] }}
         | 
| 21 21 | 
             
                  end
         | 
| 22 22 | 
             
                else
         | 
| 23 23 | 
             
                  self
         | 
    
        data/lib/chartkick/engine.rb
    CHANGED
    
    | @@ -1,16 +1,14 @@ | |
| 1 1 | 
             
            module Chartkick
         | 
| 2 2 | 
             
              class Engine < ::Rails::Engine
         | 
| 3 | 
            -
             | 
| 4 | 
            -
                initializer "precompile", :group => :all do |app|
         | 
| 3 | 
            +
                initializer "precompile", group: :all do |app|
         | 
| 5 4 | 
             
                  # use a proc instead of a string
         | 
| 6 | 
            -
                  app.config.assets.precompile <<  | 
| 5 | 
            +
                  app.config.assets.precompile << proc { |path| path == "chartkick.js" }
         | 
| 7 6 | 
             
                end
         | 
| 8 7 |  | 
| 9 | 
            -
                initializer "helper" do | 
| 8 | 
            +
                initializer "helper" do
         | 
| 10 9 | 
             
                  ActiveSupport.on_load(:action_view) do
         | 
| 11 10 | 
             
                    include Helper
         | 
| 12 11 | 
             
                  end
         | 
| 13 12 | 
             
                end
         | 
| 14 | 
            -
             | 
| 15 13 | 
             
              end
         | 
| 16 14 | 
             
            end
         | 
    
        data/lib/chartkick/helper.rb
    CHANGED
    
    | @@ -3,7 +3,6 @@ require "erb" | |
| 3 3 |  | 
| 4 4 | 
             
            module Chartkick
         | 
| 5 5 | 
             
              module Helper
         | 
| 6 | 
            -
             | 
| 7 6 | 
             
                def line_chart(data_source, options = {})
         | 
| 8 7 | 
             
                  chartkick_chart "LineChart", data_source, options
         | 
| 9 8 | 
             
                end
         | 
| @@ -24,6 +23,10 @@ module Chartkick | |
| 24 23 | 
             
                  chartkick_chart "AreaChart", data_source, options
         | 
| 25 24 | 
             
                end
         | 
| 26 25 |  | 
| 26 | 
            +
                def scatter_chart(data_source, options = {})
         | 
| 27 | 
            +
                  chartkick_chart "ScatterChart", data_source, options
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 27 30 | 
             
                def geo_chart(data_source, options = {})
         | 
| 28 31 | 
             
                  chartkick_chart "GeoChart", data_source, options
         | 
| 29 32 | 
             
                end
         | 
| @@ -34,15 +37,15 @@ module Chartkick | |
| 34 37 |  | 
| 35 38 | 
             
                private
         | 
| 36 39 |  | 
| 37 | 
            -
                def chartkick_chart(klass, data_source, options | 
| 40 | 
            +
                def chartkick_chart(klass, data_source, options)
         | 
| 38 41 | 
             
                  @chartkick_chart_id ||= 0
         | 
| 39 42 | 
             
                  options = chartkick_deep_merge(Chartkick.options, options)
         | 
| 40 43 | 
             
                  element_id = options.delete(:id) || "chart-#{@chartkick_chart_id += 1}"
         | 
| 41 44 | 
             
                  height = options.delete(:height) || "300px"
         | 
| 42 45 | 
             
                  # content_for: nil must override default
         | 
| 43 | 
            -
                  content_for = options. | 
| 46 | 
            +
                  content_for = options.key?(:content_for) ? options.delete(:content_for) : Chartkick.content_for
         | 
| 44 47 |  | 
| 45 | 
            -
                  html = (options.delete(:html) || % | 
| 48 | 
            +
                  html = (options.delete(:html) || %(<div id="%{id}" style="height: %{height}; text-align: center; color: #999; line-height: %{height}; font-size: 14px; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Verdana, Arial, Helvetica, sans-serif;">Loading...</div>)) % {id: ERB::Util.html_escape(element_id), height: ERB::Util.html_escape(height)}
         | 
| 46 49 |  | 
| 47 50 | 
             
                  js = <<JS
         | 
| 48 51 | 
             
            <script type="text/javascript">
         | 
| @@ -61,12 +64,11 @@ JS | |
| 61 64 | 
             
                # https://github.com/rails/rails/blob/master/activesupport/lib/active_support/core_ext/hash/deep_merge.rb
         | 
| 62 65 | 
             
                def chartkick_deep_merge(hash_a, hash_b)
         | 
| 63 66 | 
             
                  hash_a = hash_a.dup
         | 
| 64 | 
            -
                  hash_b.each_pair do |k,v|
         | 
| 67 | 
            +
                  hash_b.each_pair do |k, v|
         | 
| 65 68 | 
             
                    tv = hash_a[k]
         | 
| 66 69 | 
             
                    hash_a[k] = tv.is_a?(Hash) && v.is_a?(Hash) ? tv.deep_merge(v) : v
         | 
| 67 70 | 
             
                  end
         | 
| 68 71 | 
             
                  hash_a
         | 
| 69 72 | 
             
                end
         | 
| 70 | 
            -
             | 
| 71 73 | 
             
              end
         | 
| 72 74 | 
             
            end
         | 
    
        data/lib/chartkick/sinatra.rb
    CHANGED
    
    
    
        data/lib/chartkick/version.rb
    CHANGED
    
    
    
        data/test/chartkick_test.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: chartkick
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1. | 
| 4 | 
            +
              version: 1.4.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Andrew Kane
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2015-09-01 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -75,7 +75,7 @@ files: | |
| 75 75 | 
             
            - lib/chartkick/version.rb
         | 
| 76 76 | 
             
            - test/chartkick_test.rb
         | 
| 77 77 | 
             
            - test/test_helper.rb
         | 
| 78 | 
            -
            homepage:  | 
| 78 | 
            +
            homepage: http://chartkick.com
         | 
| 79 79 | 
             
            licenses:
         | 
| 80 80 | 
             
            - MIT
         | 
| 81 81 | 
             
            metadata: {}
         | 
| @@ -95,10 +95,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement | |
| 95 95 | 
             
                  version: '0'
         | 
| 96 96 | 
             
            requirements: []
         | 
| 97 97 | 
             
            rubyforge_project: 
         | 
| 98 | 
            -
            rubygems_version: 2. | 
| 98 | 
            +
            rubygems_version: 2.4.5
         | 
| 99 99 | 
             
            signing_key: 
         | 
| 100 100 | 
             
            specification_version: 4
         | 
| 101 101 | 
             
            summary: Create beautiful Javascript charts with one line of Ruby
         | 
| 102 102 | 
             
            test_files:
         | 
| 103 103 | 
             
            - test/chartkick_test.rb
         | 
| 104 104 | 
             
            - test/test_helper.rb
         | 
| 105 | 
            +
            has_rdoc: 
         |