rails_highcharts 0.0.1.beta1 → 0.0.1.beta2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  Highcharts for Rails 3
2
2
  =========================================================================
3
3
 
4
- __modify from: [highcharts-rails](https://github.com/loudpixel/highcharts-rails "highcharts-rails")__
4
+ __modify from: [lazy-high-charts](https://github.com/michelson/lazy_high_charts "lazy-high-charts"), with Highcharts v2.1.5 and Rails 3__
5
5
 
6
6
  __use: [Highcharts](http://highcharts.com/ "Highcharts")__
7
7
 
@@ -16,91 +16,53 @@ Rails3.0.8+/Ruby1.8.7+
16
16
  gem 'rails_highcharts'
17
17
 
18
18
  rails g rails_highcharts:install
19
-
20
- in footer layout
21
-
22
- $(document).ready(function(){
23
- <%= javascript_include_tag :highcharts %>
24
- <%= yield :javascript %>
25
- });
26
-
27
- in our controller:
28
-
29
- # Create a pie chart
30
- browser_data = [
31
- {:name => 'Safari', :y => 3.57, :identifier => 'applewebkit'},
32
- {:name => 'Firefox', :y => 22.32, :identifier => 'gecko'},
33
- {:name => 'Internet Explorer', :y => 56.9, :identifier => 'msie'},
34
- {:name => 'Other', :y => 17.21}
35
- ]
36
19
 
37
- user_agent = request.env['HTTP_USER_AGENT'].downcase
20
+ Usage in Controller:
38
21
 
39
- # determine the users browser and pull that piece of the pie chart
40
- browser_data.each do |browser|
41
- if user_agent.index(browser[:identifier].to_s)
42
- browser[:sliced] = true
43
-
44
- # some browsers will match more than one identifier, stop looking as soon as one is found
45
- break;
22
+ @h = HighChart.new('graph') do |f|
23
+ f.series(:name=>'John', :data=>[3, 20, 3, 5, 4, 10, 12 ,3, 5,6,7,7,80,9,9])
24
+ f.series(:name=>'Jane', :data=> [1, 3, 4, 3, 3, 5, 4,-46,7,8,8,9,9,0,0,9] )
46
25
  end
47
- end
26
+
27
+ Without overriding entire option , (only change a specific option index):
48
28
 
49
- # format the labels that show up on the chart
50
- pie_label_formatter = '
51
- function() {
52
- if (this.y > 15) return this.point.name;
53
- }'
29
+ @h = HighChart.new('graph') do |f|
30
+ .....
31
+ f.options[:chart][:defaultSeriesType] = "area"
32
+ f.options[:chart][:inverted] = true
33
+ f.options[:legend][:layout] = "horizontal"
34
+ f.options[:x_axis][:categories] = ["uno" ,"dos" , "tres" , "cuatro"]
35
+ ......
36
+
37
+ Overriding entire option:
54
38
 
55
- # format the tooltips
56
- pie_tooltip_formatter = '
57
- function() {
58
- return "<strong>" + this.point.name + "</strong>: " + this.y + " %";
59
- }'
39
+ @h = HighChart.new('graph') do |f|
40
+ .....
41
+ f.x_axis(:categories => @days.reverse! , :labels=>{:rotation=>-45 , :align => 'right'})
42
+ f.chart({:defaultSeriesType=>"spline" , :renderTo => "myRenderArea" , :inverted => true})
43
+ .....
44
+
45
+ Usage in layout:
46
+
47
+ <%= javascript_include_tag :highcharts %>
48
+ <!--[if IE]> <%= javascript_include_tag :ie_high_charts %> <![endif]-->
49
+
50
+ Usage in view:
60
51
 
61
- @pie_chart =
62
- RailsHighcharts.pie({
63
- :chart => {
64
- :renderTo => "pie-chart-container",
65
- :margin => [50, 30, 0, 30]
66
- },
67
- :credits => {
68
- :enabled => true,
69
- :href => 'http://marketshare.hitslink.com/browser-market-share.aspx?qprid=3',
70
- :text => 'Data provided by NETMARKETSHARE'
71
- },
72
- :plotOptions => {
73
- :pie => {
74
- :dataLabels => {
75
- :formatter => pie_label_formatter,
76
- :style => {
77
- :textShadow => '#000000 1px 1px 2px'
78
- }
79
- }
80
- }
81
- },
82
- :series => [
83
- {
84
- :type => 'pie',
85
- :data => browser_data
86
- }
87
- ],
88
- :subtitle => {
89
- :text => 'January 2010'
90
- },
91
- :title => {
92
- :text => 'Browser Market Share'
93
- },
94
- :tooltip => {
95
- :formatter => pie_tooltip_formatter
96
- },
97
- })
52
+ <%= high_chart("my_id", @h) %>
53
+
54
+ Passing formatting options in the view to the helper block , because all the helper options declared in the controller are converted in strict/valid json (quoted key); so we need to extend the json object with some js.
98
55
 
99
- in your views:
56
+ <% high_chart("my_id", @h) do |c| %>
57
+ <%= "options.tooltip.formatter = function() { return '<b>HEY!!!'+ this.series.name +'</b><br/>'+ this.x +': '+ this.y +' units';}" %>
58
+ <%= "options.xAxis.labels.formatter = function() { return 'ho';}" %>
59
+ <%= "options.yAxis.labels.formatter = function() { return 'hey';}" %>
60
+ <%end %>
61
+
62
+ Option reference:
100
63
 
101
- <!-- container to hold the pie chart -->
102
- <div id="pie-chart-container" class="chart-container"></div>
64
+ http://www.highcharts.com/ref/
65
+
66
+ HighCharts License:
103
67
 
104
- <% content_for :javascript do %>
105
- <%= @pie_chart %>
106
- <% end %>
68
+ http://www.highcharts.com/license
@@ -0,0 +1,41 @@
1
+ module RailsHighchartsHelper
2
+ # ActiveSupport::JSON.unquote_hash_key_identifiers = false
3
+ def high_chart(placeholder, object , &block)
4
+ object.html_options.merge!({:id=>placeholder})
5
+ object.options[:chart][:renderTo] = placeholder
6
+ high_graph(placeholder, object, &block).concat(content_tag("div", "", object.html_options))
7
+ end
8
+
9
+ def high_graph(placeholder, object, &block)
10
+ graph =<<-EOJS
11
+ <script type="text/javascript">
12
+ jQuery(function() {
13
+ // 1. Define JSON options
14
+ var options = { chart: #{object.options[:chart].to_json},
15
+ title: #{object.options[:title].to_json},
16
+ legend: #{object.options[:legend].to_json},
17
+ xAxis: #{object.options[:x_axis].to_json},
18
+ yAxis: #{object.options[:y_axis].to_json},
19
+ tooltip: #{object.options[:tooltip].to_json},
20
+ credits: #{object.options[:credits].to_json},
21
+ plotOptions: #{object.options[:plot_options].to_json},
22
+ series: #{object.data.to_json},
23
+ subtitle: #{object.options[:subtitle].to_json}
24
+ };
25
+
26
+ // 2. Add callbacks (non-JSON compliant)
27
+ #{capture(&block) if block_given?}
28
+ // 3. Build the chart
29
+ var chart = new Highcharts.Chart(options);
30
+ });
31
+ </script>
32
+ EOJS
33
+ if defined?(raw) && Rails.version.to_i >= 3
34
+ return raw(graph)
35
+ else
36
+ return graph unless block_given?
37
+ concat graph
38
+ end
39
+ end
40
+
41
+ end #RailsHighchartsHelper
@@ -13,7 +13,11 @@ module RailsHighcharts
13
13
  source_root File.expand_path('../media', __FILE__)
14
14
  desc "Copies media files to main project"
15
15
  def copy_media_files
16
- copy_file "../media/javascripts/highcharts.js", "public/javascripts/highcharts/highcharts.js"
16
+ js_files = %w|highcharts.js excanvas.compiled.js|
17
+
18
+ js_files.each do |js|
19
+ copy_file "../media/javascripts/#{js}", "public/javascripts/highcharts/#{js}"
20
+ end
17
21
  end
18
22
  end
19
23
 
@@ -0,0 +1,35 @@
1
+ // Copyright 2006 Google Inc.
2
+ //
3
+ // Licensed under the Apache License, Version 2.0 (the "License");
4
+ // you may not use this file except in compliance with the License.
5
+ // You may obtain a copy of the License at
6
+ //
7
+ // http://www.apache.org/licenses/LICENSE-2.0
8
+ //
9
+ // Unless required by applicable law or agreed to in writing, software
10
+ // distributed under the License is distributed on an "AS IS" BASIS,
11
+ // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ // See the License for the specific language governing permissions and
13
+ // limitations under the License.
14
+ document.createElement("canvas").getContext||(function(){var s=Math,j=s.round,F=s.sin,G=s.cos,V=s.abs,W=s.sqrt,k=10,v=k/2;function X(){return this.context_||(this.context_=new H(this))}var L=Array.prototype.slice;function Y(b,a){var c=L.call(arguments,2);return function(){return b.apply(a,c.concat(L.call(arguments)))}}var M={init:function(b){if(/MSIE/.test(navigator.userAgent)&&!window.opera){var a=b||document;a.createElement("canvas");a.attachEvent("onreadystatechange",Y(this.init_,this,a))}},init_:function(b){b.namespaces.g_vml_||
15
+ b.namespaces.add("g_vml_","urn:schemas-microsoft-com:vml","#default#VML");b.namespaces.g_o_||b.namespaces.add("g_o_","urn:schemas-microsoft-com:office:office","#default#VML");if(!b.styleSheets.ex_canvas_){var a=b.createStyleSheet();a.owningElement.id="ex_canvas_";a.cssText="canvas{display:inline-block;overflow:hidden;text-align:left;width:300px;height:150px}g_vml_\\:*{behavior:url(#default#VML)}g_o_\\:*{behavior:url(#default#VML)}"}var c=b.getElementsByTagName("canvas"),d=0;for(;d<c.length;d++)this.initElement(c[d])},
16
+ initElement:function(b){if(!b.getContext){b.getContext=X;b.innerHTML="";b.attachEvent("onpropertychange",Z);b.attachEvent("onresize",$);var a=b.attributes;if(a.width&&a.width.specified)b.style.width=a.width.nodeValue+"px";else b.width=b.clientWidth;if(a.height&&a.height.specified)b.style.height=a.height.nodeValue+"px";else b.height=b.clientHeight}return b}};function Z(b){var a=b.srcElement;switch(b.propertyName){case "width":a.style.width=a.attributes.width.nodeValue+"px";a.getContext().clearRect();
17
+ break;case "height":a.style.height=a.attributes.height.nodeValue+"px";a.getContext().clearRect();break}}function $(b){var a=b.srcElement;if(a.firstChild){a.firstChild.style.width=a.clientWidth+"px";a.firstChild.style.height=a.clientHeight+"px"}}M.init();var N=[],B=0;for(;B<16;B++){var C=0;for(;C<16;C++)N[B*16+C]=B.toString(16)+C.toString(16)}function I(){return[[1,0,0],[0,1,0],[0,0,1]]}function y(b,a){var c=I(),d=0;for(;d<3;d++){var f=0;for(;f<3;f++){var h=0,g=0;for(;g<3;g++)h+=b[d][g]*a[g][f];c[d][f]=
18
+ h}}return c}function O(b,a){a.fillStyle=b.fillStyle;a.lineCap=b.lineCap;a.lineJoin=b.lineJoin;a.lineWidth=b.lineWidth;a.miterLimit=b.miterLimit;a.shadowBlur=b.shadowBlur;a.shadowColor=b.shadowColor;a.shadowOffsetX=b.shadowOffsetX;a.shadowOffsetY=b.shadowOffsetY;a.strokeStyle=b.strokeStyle;a.globalAlpha=b.globalAlpha;a.arcScaleX_=b.arcScaleX_;a.arcScaleY_=b.arcScaleY_;a.lineScale_=b.lineScale_}function P(b){var a,c=1;b=String(b);if(b.substring(0,3)=="rgb"){var d=b.indexOf("(",3),f=b.indexOf(")",d+
19
+ 1),h=b.substring(d+1,f).split(",");a="#";var g=0;for(;g<3;g++)a+=N[Number(h[g])];if(h.length==4&&b.substr(3,1)=="a")c=h[3]}else a=b;return{color:a,alpha:c}}function aa(b){switch(b){case "butt":return"flat";case "round":return"round";case "square":default:return"square"}}function H(b){this.m_=I();this.mStack_=[];this.aStack_=[];this.currentPath_=[];this.fillStyle=this.strokeStyle="#000";this.lineWidth=1;this.lineJoin="miter";this.lineCap="butt";this.miterLimit=k*1;this.globalAlpha=1;this.canvas=b;
20
+ var a=b.ownerDocument.createElement("div");a.style.width=b.clientWidth+"px";a.style.height=b.clientHeight+"px";a.style.overflow="hidden";a.style.position="absolute";b.appendChild(a);this.element_=a;this.lineScale_=this.arcScaleY_=this.arcScaleX_=1}var i=H.prototype;i.clearRect=function(){this.element_.innerHTML=""};i.beginPath=function(){this.currentPath_=[]};i.moveTo=function(b,a){var c=this.getCoords_(b,a);this.currentPath_.push({type:"moveTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};
21
+ i.lineTo=function(b,a){var c=this.getCoords_(b,a);this.currentPath_.push({type:"lineTo",x:c.x,y:c.y});this.currentX_=c.x;this.currentY_=c.y};i.bezierCurveTo=function(b,a,c,d,f,h){var g=this.getCoords_(f,h),l=this.getCoords_(b,a),e=this.getCoords_(c,d);Q(this,l,e,g)};function Q(b,a,c,d){b.currentPath_.push({type:"bezierCurveTo",cp1x:a.x,cp1y:a.y,cp2x:c.x,cp2y:c.y,x:d.x,y:d.y});b.currentX_=d.x;b.currentY_=d.y}i.quadraticCurveTo=function(b,a,c,d){var f=this.getCoords_(b,a),h=this.getCoords_(c,d),g={x:this.currentX_+
22
+ 0.6666666666666666*(f.x-this.currentX_),y:this.currentY_+0.6666666666666666*(f.y-this.currentY_)};Q(this,g,{x:g.x+(h.x-this.currentX_)/3,y:g.y+(h.y-this.currentY_)/3},h)};i.arc=function(b,a,c,d,f,h){c*=k;var g=h?"at":"wa",l=b+G(d)*c-v,e=a+F(d)*c-v,m=b+G(f)*c-v,r=a+F(f)*c-v;if(l==m&&!h)l+=0.125;var n=this.getCoords_(b,a),o=this.getCoords_(l,e),q=this.getCoords_(m,r);this.currentPath_.push({type:g,x:n.x,y:n.y,radius:c,xStart:o.x,yStart:o.y,xEnd:q.x,yEnd:q.y})};i.rect=function(b,a,c,d){this.moveTo(b,
23
+ a);this.lineTo(b+c,a);this.lineTo(b+c,a+d);this.lineTo(b,a+d);this.closePath()};i.strokeRect=function(b,a,c,d){var f=this.currentPath_;this.beginPath();this.moveTo(b,a);this.lineTo(b+c,a);this.lineTo(b+c,a+d);this.lineTo(b,a+d);this.closePath();this.stroke();this.currentPath_=f};i.fillRect=function(b,a,c,d){var f=this.currentPath_;this.beginPath();this.moveTo(b,a);this.lineTo(b+c,a);this.lineTo(b+c,a+d);this.lineTo(b,a+d);this.closePath();this.fill();this.currentPath_=f};i.createLinearGradient=function(b,
24
+ a,c,d){var f=new D("gradient");f.x0_=b;f.y0_=a;f.x1_=c;f.y1_=d;return f};i.createRadialGradient=function(b,a,c,d,f,h){var g=new D("gradientradial");g.x0_=b;g.y0_=a;g.r0_=c;g.x1_=d;g.y1_=f;g.r1_=h;return g};i.drawImage=function(b){var a,c,d,f,h,g,l,e,m=b.runtimeStyle.width,r=b.runtimeStyle.height;b.runtimeStyle.width="auto";b.runtimeStyle.height="auto";var n=b.width,o=b.height;b.runtimeStyle.width=m;b.runtimeStyle.height=r;if(arguments.length==3){a=arguments[1];c=arguments[2];h=g=0;l=d=n;e=f=o}else if(arguments.length==
25
+ 5){a=arguments[1];c=arguments[2];d=arguments[3];f=arguments[4];h=g=0;l=n;e=o}else if(arguments.length==9){h=arguments[1];g=arguments[2];l=arguments[3];e=arguments[4];a=arguments[5];c=arguments[6];d=arguments[7];f=arguments[8]}else throw Error("Invalid number of arguments");var q=this.getCoords_(a,c),t=[];t.push(" <g_vml_:group",' coordsize="',k*10,",",k*10,'"',' coordorigin="0,0"',' style="width:',10,"px;height:",10,"px;position:absolute;");if(this.m_[0][0]!=1||this.m_[0][1]){var E=[];E.push("M11=",
26
+ this.m_[0][0],",","M12=",this.m_[1][0],",","M21=",this.m_[0][1],",","M22=",this.m_[1][1],",","Dx=",j(q.x/k),",","Dy=",j(q.y/k),"");var p=q,z=this.getCoords_(a+d,c),w=this.getCoords_(a,c+f),x=this.getCoords_(a+d,c+f);p.x=s.max(p.x,z.x,w.x,x.x);p.y=s.max(p.y,z.y,w.y,x.y);t.push("padding:0 ",j(p.x/k),"px ",j(p.y/k),"px 0;filter:progid:DXImageTransform.Microsoft.Matrix(",E.join(""),", sizingmethod='clip');")}else t.push("top:",j(q.y/k),"px;left:",j(q.x/k),"px;");t.push(' ">','<g_vml_:image src="',b.src,
27
+ '"',' style="width:',k*d,"px;"," height:",k*f,'px;"',' cropleft="',h/n,'"',' croptop="',g/o,'"',' cropright="',(n-h-l)/n,'"',' cropbottom="',(o-g-e)/o,'"'," />","</g_vml_:group>");this.element_.insertAdjacentHTML("BeforeEnd",t.join(""))};i.stroke=function(b){var a=[],c=P(b?this.fillStyle:this.strokeStyle),d=c.color,f=c.alpha*this.globalAlpha;a.push("<g_vml_:shape",' filled="',!!b,'"',' style="position:absolute;width:',10,"px;height:",10,'px;"',' coordorigin="0 0" coordsize="',k*10," ",k*10,'"',' stroked="',
28
+ !b,'"',' path="');var h={x:null,y:null},g={x:null,y:null},l=0;for(;l<this.currentPath_.length;l++){var e=this.currentPath_[l];switch(e.type){case "moveTo":a.push(" m ",j(e.x),",",j(e.y));break;case "lineTo":a.push(" l ",j(e.x),",",j(e.y));break;case "close":a.push(" x ");e=null;break;case "bezierCurveTo":a.push(" c ",j(e.cp1x),",",j(e.cp1y),",",j(e.cp2x),",",j(e.cp2y),",",j(e.x),",",j(e.y));break;case "at":case "wa":a.push(" ",e.type," ",j(e.x-this.arcScaleX_*e.radius),",",j(e.y-this.arcScaleY_*e.radius),
29
+ " ",j(e.x+this.arcScaleX_*e.radius),",",j(e.y+this.arcScaleY_*e.radius)," ",j(e.xStart),",",j(e.yStart)," ",j(e.xEnd),",",j(e.yEnd));break}if(e){if(h.x==null||e.x<h.x)h.x=e.x;if(g.x==null||e.x>g.x)g.x=e.x;if(h.y==null||e.y<h.y)h.y=e.y;if(g.y==null||e.y>g.y)g.y=e.y}}a.push(' ">');if(b)if(typeof this.fillStyle=="object"){var m=this.fillStyle,r=0,n={x:0,y:0},o=0,q=1;if(m.type_=="gradient"){var t=m.x1_/this.arcScaleX_,E=m.y1_/this.arcScaleY_,p=this.getCoords_(m.x0_/this.arcScaleX_,m.y0_/this.arcScaleY_),
30
+ z=this.getCoords_(t,E);r=Math.atan2(z.x-p.x,z.y-p.y)*180/Math.PI;if(r<0)r+=360;if(r<1.0E-6)r=0}else{var p=this.getCoords_(m.x0_,m.y0_),w=g.x-h.x,x=g.y-h.y;n={x:(p.x-h.x)/w,y:(p.y-h.y)/x};w/=this.arcScaleX_*k;x/=this.arcScaleY_*k;var R=s.max(w,x);o=2*m.r0_/R;q=2*m.r1_/R-o}var u=m.colors_;u.sort(function(ba,ca){return ba.offset-ca.offset});var J=u.length,da=u[0].color,ea=u[J-1].color,fa=u[0].alpha*this.globalAlpha,ga=u[J-1].alpha*this.globalAlpha,S=[],l=0;for(;l<J;l++){var T=u[l];S.push(T.offset*q+
31
+ o+" "+T.color)}a.push('<g_vml_:fill type="',m.type_,'"',' method="none" focus="100%"',' color="',da,'"',' color2="',ea,'"',' colors="',S.join(","),'"',' opacity="',ga,'"',' g_o_:opacity2="',fa,'"',' angle="',r,'"',' focusposition="',n.x,",",n.y,'" />')}else a.push('<g_vml_:fill color="',d,'" opacity="',f,'" />');else{var K=this.lineScale_*this.lineWidth;if(K<1)f*=K;a.push("<g_vml_:stroke",' opacity="',f,'"',' joinstyle="',this.lineJoin,'"',' miterlimit="',this.miterLimit,'"',' endcap="',aa(this.lineCap),
32
+ '"',' weight="',K,'px"',' color="',d,'" />')}a.push("</g_vml_:shape>");this.element_.insertAdjacentHTML("beforeEnd",a.join(""))};i.fill=function(){this.stroke(true)};i.closePath=function(){this.currentPath_.push({type:"close"})};i.getCoords_=function(b,a){var c=this.m_;return{x:k*(b*c[0][0]+a*c[1][0]+c[2][0])-v,y:k*(b*c[0][1]+a*c[1][1]+c[2][1])-v}};i.save=function(){var b={};O(this,b);this.aStack_.push(b);this.mStack_.push(this.m_);this.m_=y(I(),this.m_)};i.restore=function(){O(this.aStack_.pop(),
33
+ this);this.m_=this.mStack_.pop()};function ha(b){var a=0;for(;a<3;a++){var c=0;for(;c<2;c++)if(!isFinite(b[a][c])||isNaN(b[a][c]))return false}return true}function A(b,a,c){if(!!ha(a)){b.m_=a;if(c)b.lineScale_=W(V(a[0][0]*a[1][1]-a[0][1]*a[1][0]))}}i.translate=function(b,a){A(this,y([[1,0,0],[0,1,0],[b,a,1]],this.m_),false)};i.rotate=function(b){var a=G(b),c=F(b);A(this,y([[a,c,0],[-c,a,0],[0,0,1]],this.m_),false)};i.scale=function(b,a){this.arcScaleX_*=b;this.arcScaleY_*=a;A(this,y([[b,0,0],[0,a,
34
+ 0],[0,0,1]],this.m_),true)};i.transform=function(b,a,c,d,f,h){A(this,y([[b,a,0],[c,d,0],[f,h,1]],this.m_),true)};i.setTransform=function(b,a,c,d,f,h){A(this,[[b,a,0],[c,d,0],[f,h,1]],true)};i.clip=function(){};i.arcTo=function(){};i.createPattern=function(){return new U};function D(b){this.type_=b;this.r1_=this.y1_=this.x1_=this.r0_=this.y0_=this.x0_=0;this.colors_=[]}D.prototype.addColorStop=function(b,a){a=P(a);this.colors_.push({offset:b,color:a.color,alpha:a.alpha})};function U(){}G_vmlCanvasManager=
35
+ M;CanvasRenderingContext2D=H;CanvasGradient=D;CanvasPattern=U})();
@@ -1,13 +1,19 @@
1
1
  require 'rails'
2
+ require File.dirname(__FILE__) + "/../../app/helpers/rails_highcharts/rails_highcharts_helper"
2
3
 
3
4
  module RailsHighcharts
4
5
  class Engine < Rails::Engine
5
6
 
7
+ config.to_prepare do
8
+ ApplicationController.helper(RailsHighchartsHelper)
9
+ end
10
+
6
11
  # ========================================
7
12
  # = javascript_include_tag :highcharts =
8
13
  # ========================================
9
14
  config.before_initialize do
10
- config.action_view.javascript_expansions[:highcharts] = %w(highcharts/highcharts.js)
15
+ config.action_view.javascript_expansions[:highcharts] = %w|highcharts/highcharts.js|
16
+ config.action_view.javascript_expansions[:ie_high_charts] = %w|highcharts/excanvas.compiled.js|
11
17
  end
12
18
 
13
19
  end
@@ -0,0 +1,83 @@
1
+ class RailsHighcharts
2
+
3
+ CANVAS_DEFAULT_HTML_OPTIONS = {:style => "height: 300px, width:615px" }
4
+ SERIES_OPTIONS = %w(lines points bars shadowSize colors)
5
+
6
+ attr_accessor :data, :options, :placeholder, :html_options
7
+ alias :canvas :placeholder
8
+ alias :canvas= :placeholder=
9
+
10
+
11
+ def initialize(canvas = nil, html_opts = {})
12
+
13
+ @collection_filter = nil
14
+ self.tap do |high_chart|
15
+ high_chart.data ||= []
16
+ high_chart.options ||= {}
17
+ high_chart.defaults_options
18
+ high_chart.html_options = html_opts.reverse_merge(CANVAS_DEFAULT_HTML_OPTIONS)
19
+ high_chart.canvas = canvas if canvas
20
+ yield high_chart if block_given?
21
+ end
22
+ end
23
+
24
+ # title: legend: xAxis: yAxis: tooltip: credits: :plotOptions
25
+
26
+ def defaults_options
27
+ self.title({ :text=>"example test title from plugin"})
28
+ self.legend({:layout=>"vertical", :style=>{:position=>'absolute', :bottom=>'auto', :left=>'150px', :top=>'150px'}, :borderWidth=> 1, :backgroundColor=>'#FFFFFF'})
29
+ self.x_axis({:categories => ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],
30
+ :plotBands => [{ :from=> 6.0,:to=> 6.5,:color=> 'rgba(68, 170, 213, .2)'}],
31
+ :labels =>{ :align=>'right',:rotation=>45 }
32
+ })
33
+ self.y_axis({:title=> {:text=> 'Fruit units'}, :labels=>{:align=>'right'} })
34
+ self.tooltip({ :enabled=>true })
35
+ self.credits({:enabled => false})
36
+ self.plot_options({ :areaspline => {:fillOpacity => 0.5}})
37
+ self.chart({:defaultSeriesType=>"areaspline" , :renderTo => nil})
38
+ self.subtitle({})
39
+ end
40
+
41
+
42
+ # Pass other methods through to the javascript high_chart object.
43
+ #
44
+ # For instance: <tt>high_chart.grid(:color => "#699")</tt>
45
+ #
46
+ def method_missing(meth, opts = {})
47
+ merge_options meth, opts
48
+ end
49
+
50
+ # Add a simple series to the graph:
51
+ #
52
+ # data = [[0,5], [1,5], [2,5]]
53
+ # @high_chart.series :name=>'Updated', :data=>data
54
+ # @high_chart.series :name=>'Updated', :data=>[5, 1, 6, 1, 5, 4, 9]
55
+ #
56
+ def series(opts = {})
57
+ @data ||= []
58
+ if opts.blank?
59
+ @data << series_options.merge(:name => label, :data => d)
60
+ else
61
+ @data << opts.merge(:name => opts[:name], :data => opts[:data])
62
+ end
63
+ end
64
+
65
+ private
66
+ def series_options
67
+ @options.reject {|k,v| SERIES_OPTIONS.include?(k.to_s) == false}
68
+ end
69
+
70
+ def merge_options(name, opts)
71
+ @options.merge! name => opts
72
+ end
73
+
74
+ def arguments_to_options(args)
75
+ if args.blank?
76
+ {:show => true}
77
+ elsif args.is_a? Array
78
+ args.first
79
+ else
80
+ args
81
+ end
82
+ end
83
+ end #RailsHighcharts
@@ -1,3 +1,3 @@
1
1
  module RailsHighcharts
2
- VERSION = "0.0.1.beta1"
2
+ VERSION = "0.0.1.beta2"
3
3
  end
@@ -2,334 +2,8 @@ require "rails"
2
2
  require "rails_highcharts/engine"
3
3
  require "rails_highcharts/version"
4
4
  require "rails_highcharts/hash_extend"
5
+ require "rails_highcharts/rails_highcharts"
5
6
 
6
- class RailsHighcharts
7
-
8
- @@types = ['area', 'areaspline', 'bar', 'column', 'line', 'pie', 'scatter', 'spline']
9
- @@date_format = "<strong>%A</strong><br /> %m/%d/%Y"
10
-
11
- attr_accessor :chart, :colors, :credits, :labels, :lang, :legend, :plotOptions, :point,
12
- :series, :subtitle, :symbols, :title, :toolbar, :tooltip, :x_axis, :y_axis
13
-
14
- def self.method_missing(m, options={})
15
- format = options[:format] || 'jquery'
16
- options.delete(:format)
17
-
18
- # create the chart and return it in the format requested
19
- if @@types.include?(m.to_s)
20
- chart = new(options.merge!({:type => m}))
21
- chart.send(format)
22
- else
23
- "#{m} is not a supported chart format, please use one of the following: #{supported_types}."
24
- end
25
- end
26
-
27
- def initialize(options={})
28
- # override highcharts defaults
29
- @credits = {
30
- :enabled => false
31
- }
32
- @legend = {
33
- :layout => 'vertical',
34
- :style => {
35
- :left => 'auto',
36
- :bottom => 'auto',
37
- :right => '50px',
38
- :top => '75px'
39
- }
40
- }
41
-
42
- # IE7 displays 'null' without this
43
- @title = {
44
- :text => ""
45
- }
46
- @x_axis = {
47
- :title => {
48
- :text => ""
49
- }
50
- }
51
- @y_axis = {
52
- :title => {
53
- :text => ""
54
- }
55
- }
56
-
57
- # define defaults based on chart type
58
- case options[:type].to_s
59
- when 'area'
60
- @chart = {
61
- :defaultSeriesType => 'area',
62
- :margin => [50, 200, 60, 80]
63
- }
64
- when 'areaspline'
65
- @chart = {
66
- :defaultSeriesType => 'areaspline',
67
- :margin => [50, 200, 60, 80]
68
- }
69
- when 'bar'
70
- @chart = {
71
- :inverted => true,
72
- :defaultSeriesType => 'bar',
73
- :margin => [50, 50, 50, 100]
74
- }
75
- @plotOptions = {
76
- :bar => {
77
- :showInLegend => false,
78
- :dataLabels => {
79
- :y => -5,
80
- :enabled => true,
81
- :color => '#666666'
82
- }
83
- }
84
- }
85
- when 'column'
86
- @chart = {
87
- :defaultSeriesType => 'column',
88
- :margin => [50, 50, 50, 100]
89
- }
90
- @plotOptions = {
91
- :column => {
92
- :showInLegend => false
93
- }
94
- }
95
- when 'line'
96
- @chart = {
97
- :defaultSeriesType => 'line',
98
- :margin => [50, 200, 60, 80]
99
- }
100
- when 'pie'
101
- @chart = {
102
- :margin => [10, 10, 10, 10]
103
- }
104
- @plotOptions = {
105
- :pie => {
106
- :dataLabels => {
107
- :enabled => true,
108
- :color => 'white',
109
- :style => {:font => '10pt Helvetica'}
110
- }
111
- }
112
- }
113
- when 'scatter'
114
- @chart = {
115
- :defaultSeriesType => 'scatter',
116
- :margin => [50, 200, 60, 80]
117
- }
118
- @plotOptions = {
119
- :scatter => {
120
- :marker => {
121
- :radius => 5,
122
- :states => {
123
- :hover => {
124
- :enabled => true,
125
- :lineColor => '#666666'
126
- }
127
- }
128
- }
129
- }
130
- }
131
- when 'spline'
132
- @chart = {
133
- :defaultSeriesType => 'spline',
134
- :margin => [50, 200, 60, 80]
135
- }
136
- end
137
-
138
- # set the options from provided hash
139
- options.each do |attribute, value|
140
- if value.is_a?(Hash)
141
- # if provided a hash attempt to merge with defaults, otherwise just override defaults
142
- send("#{attribute}=", (send(attribute) || {}).merge_recursive(value)) if self.respond_to?("#{attribute}=")
143
- else
144
- send("#{attribute.to_s}=", value) if self.respond_to?("#{attribute}=")
145
- end
146
- end
147
- end
148
-
149
- def self.supported_types
150
- @@types.join(' ')
151
- end
152
-
153
- def jquery
154
- query_params = instance_variables.sort.map do |var|
155
- case var.to_s
156
-
157
- when '@chart'
158
- set_chart
159
- when '@colors'
160
- set_colors if @colors.is_a?(Array)
161
- when '@credits'
162
- set_credits
163
- when '@labels'
164
- set_labels
165
- when '@lang'
166
- set_lang
167
- when '@legend'
168
- set_legend
169
- when '@plotOptions'
170
- set_plotOptions
171
- when '@point'
172
- set_point
173
- when '@series'
174
- set_series
175
- when '@subtitle'
176
- set_subtitle
177
- when '@symbols'
178
- set_symbols
179
- when '@title'
180
- set_title
181
- when '@toolbar'
182
- set_toolbar
183
- when '@tooltip'
184
- set_tooltip
185
- when '@x_axis'
186
- set_x_axis
187
- when '@y_axis'
188
- set_y_axis
189
- end
190
- end.compact
191
-
192
- "var chart = new Highcharts.Chart({
193
- #{query_params.join(",\n")}
194
- });"
195
- end
196
-
197
- private
198
- def set_chart
199
- "chart: {
200
- #{concatenate_attributes(@chart)}
201
- }"
202
- end
203
-
204
- def set_colors
205
- "colors: [#{@colors.join(", ")}]"
206
- end
207
-
208
- def set_credits
209
- "credits: {
210
- #{concatenate_attributes(@credits)}
211
- }"
212
- end
213
-
214
- def set_labels
215
- "labels: {
216
- #{concatenate_attributes(@labels)}
217
- }"
218
- end
219
-
220
- def set_lang
221
- "lang: {
222
- #{concatenate_attributes(@lang)}
223
- }"
224
- end
225
-
226
- def set_legend
227
- "legend: {
228
- #{concatenate_attributes(@legend)}
229
- }"
230
- end
231
-
232
- def set_plotOptions
233
- "plotOptions: {
234
- #{concatenate_attributes(@plotOptions)}
235
- }"
236
- end
237
-
238
- def set_point
239
- "point: {
240
- #{concatenate_attributes(@point)}
241
- }"
242
- end
243
-
244
- def set_series
245
- attrs = Array.new
246
- @series.each do |series_hash|
247
- ser = Array.new
248
- series_hash.each do |key, value|
249
- if key == 'data'
250
- ser << "[#{concatenate_attributes(value)}]"
251
- else
252
- ser << "#{key}: #{typed_print(value)}"
253
- end
254
- end
255
-
256
- attrs << "{#{ser.join(",\n")}}";
257
- end
258
-
259
- "series: [
260
- #{attrs.join(",\n") + "\n"}
261
- ]"
262
- end
263
-
264
- def set_subtitle
265
- "subtitle: {
266
- #{concatenate_attributes(@subtitle)}
267
- }"
268
- end
269
-
270
- def set_symbols
271
- "symbols: [#{@symbols.join(", ")}]"
272
- end
273
-
274
- def set_title
275
- "title: {
276
- #{concatenate_attributes(@title)}
277
- }"
278
- end
279
-
280
- def set_toolbar
281
- "toolbar: {
282
- #{concatenate_attributes(@toolbar)}
283
- }"
284
- end
285
-
286
- def set_tooltip
287
- "tooltip: {
288
- #{concatenate_attributes(@tooltip)}
289
- }"
290
- end
291
-
292
- def set_x_axis
293
- "xAxis: {
294
- #{concatenate_attributes(@x_axis)}
295
- }"
296
- end
297
-
298
- def set_y_axis
299
- "yAxis: {
300
- #{concatenate_attributes(@y_axis)}
301
- }"
302
- end
303
-
304
- # generic method that accepts a hash and concatenates its key/value pairs
305
- def concatenate_attributes(attr)
306
- attrs = Array.new
307
- attr.each do |key, value|
308
- if value.is_a?(Hash)
309
- attrs << "#{key}: {#{concatenate_attributes(value)}}"
310
- else
311
- attrs << "#{key}: #{typed_print(value)}"
312
- end
313
- end
314
-
315
- attrs.join(",\n") + "\n"
316
- end
317
-
318
- # method determines if value needs to be surrounded in single quotes
319
- def typed_print(string)
320
- if string.is_a?(Hash)
321
- values = Array.new
322
- string.each { |key, value| values << "#{key}: #{typed_print(value)}"}
323
- "{" + values.join(", ") + "}"
324
- elsif string.is_a?(Array)
325
- "[" + string.map { |e| typed_print(e) } .join(", ") + "]"
326
- elsif string.is_a?(Date)
327
- "'#{string.strftime(@@date_format)}'"
328
- elsif string.is_a?(String) && string != 'null' && string.strip[0..7] != 'function'
329
- "'" + string.gsub(/['"\\\x0]/,'\\\\\0') + "'"
330
- else
331
- string
332
- end
333
- end
334
-
7
+ module RailsHighcharts
8
+ # ... ...
335
9
  end #RailsHighcharts
@@ -0,0 +1,51 @@
1
+ # coding: utf-8
2
+ require File.dirname(__FILE__) + '/spec_helper'
3
+ require 'pp'
4
+
5
+ describe RailsHighchartsHelper do
6
+ include RailsHighchartsHelper
7
+
8
+ before(:each) do
9
+ @class = "stylin"
10
+ @placeholder = "placeholder"
11
+ @chart = RailsHighcharts.new(@placeholder)
12
+ @data = "data"
13
+ @options = "options"
14
+ end
15
+
16
+ describe "high_chart_helper" do
17
+ it "should return a div with an id of high_chart object" do
18
+ hc = RailsHighcharts.new("placeholder", :class => 'stylin')
19
+ high_chart(hc.placeholder, hc).should have_selector('div', :id => hc.placeholder, :class => 'stylin')
20
+ end
21
+
22
+ it "should return a script" do
23
+ hc = RailsHighcharts.new("placeholder")
24
+ high_chart(hc.placeholder, hc).should have_selector('script')
25
+ end
26
+ end
27
+
28
+ describe "high_chart_graph" do
29
+ describe "ready function" do
30
+ it "should be a javascript script" do
31
+ high_chart(@placeholder, @chart).should have_selector('script', :type => 'text/javascript')
32
+ high_chart(@placeholder, @chart).should match(/\}\s*\)\s*;/)
33
+ end
34
+
35
+ it "should generate generate ready function (no conflict with prototype)" do
36
+ high_chart(@placeholder, @chart).should match(/jQuery\(function\(\)\s*\{/)
37
+ end
38
+ end
39
+ describe "initialize HighChart" do
40
+ it "should set Chart data" do
41
+ high_chart(@placeholder, @chart).should match(/var\s+chart\s+=\s+new\s+Highcharts.Chart/)
42
+ end
43
+
44
+ it "should set chart renderTo" do
45
+ high_chart(@placeholder, @chart).should match(/\"renderTo\":\"placeholder\"/)
46
+ end
47
+
48
+ end
49
+ end
50
+
51
+ end
@@ -0,0 +1,120 @@
1
+ require File.dirname(__FILE__) + '/spec_helper'
2
+
3
+ Record = Struct.new(:frequency, :amplitude)
4
+
5
+
6
+ describe "HighChart" do
7
+ before(:each) do
8
+ @collection = [Record.new(1,15), Record.new(2,30), Record.new(4,40)]
9
+ @data = [ [1,15], [2,30], [4,40]]
10
+
11
+ @placeholder = "placeholder"
12
+ @html_options = {:class => "stylin"}
13
+ @options = {:bars => {:show => true}}
14
+
15
+ @flot = RailsHighcharts.new(@placeholder, @html_options) {|chart| chart.options = @options }
16
+ end
17
+
18
+
19
+
20
+ # this is almost all flotomatic stuff
21
+ describe "initialization" do
22
+ it "should take an optional 'placeholder' argument" do
23
+ RailsHighcharts.new(@placeholder).placeholder.should == @placeholder
24
+ RailsHighcharts.new.placeholder.should == nil
25
+ end
26
+
27
+ it "should take an optional html_options argument (defaulting to 300px height)" do
28
+ RailsHighcharts.new(@html_options).placeholder.should == @html_options
29
+ end
30
+
31
+ it "should set options by default" do
32
+ RailsHighcharts.new.options.should == {
33
+ :subtitle=>{},
34
+ :chart=>{:renderTo=>nil, :defaultSeriesType=>"areaspline"},
35
+ :plot_options=>{:areaspline=>{:fillOpacity=>0.5}},
36
+ :legend=>{
37
+ :borderWidth=>1,
38
+ :backgroundColor=>"#FFFFFF",
39
+ :layout=>"vertical",
40
+ :style=>{:top=>"150px",
41
+ :left=>"150px", :position=>"absolute", :bottom=>"auto"}
42
+ },
43
+ :tooltip=>{:enabled=>true},
44
+ :x_axis=>{
45
+ :categories=>["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"],
46
+ :plotBands=>[{:to=>6.5, :from=>6.0, :color=>"rgba(68, 170, 213, .2)"}],
47
+ :labels=>{:align=>"right", :rotation=>45}},
48
+ :y_axis=>{:title=>{:text=>"Fruit units"},
49
+ :labels=>{:align=>"right"}},
50
+ :title=>{:text=>"example test title from plugin"},
51
+ :credits=>{:enabled=>false}
52
+ }
53
+
54
+ end
55
+
56
+ it "should set data empty by default" do
57
+ RailsHighcharts.new.data.should == []
58
+ end
59
+
60
+ it "should take a block setting attributes" do
61
+ chart = RailsHighcharts.new {|f| f.data = @data ; f.options = @options }
62
+ chart.data.should == @data
63
+ chart.options.should == @options
64
+ end
65
+
66
+ it "should take a block setting attributes" do
67
+ chart = RailsHighcharts.new {|f| f.options[:legend][:layout] = "horizontal" }
68
+ chart.options[:legend][:layout].should == "horizontal"
69
+ end
70
+
71
+ it "should change a block data without overriding options" do
72
+ chart = RailsHighcharts.new('graph') do |f|
73
+ f.series(:name=>'John', :data=>[3, 20])
74
+ f.series(:name=>'Jane',:data=> [1, 3] )
75
+ # without overriding
76
+ f.options[:chart][:defaultSeriesType] = "area"
77
+ f.options[:chart][:inverted] = true
78
+ f.options[:legend][:layout] = "horizontal"
79
+ f.options[:x_axis][:categories] = ["uno" ,"dos" , "tres" , "cuatro"]
80
+ end
81
+ chart.data.should == [{:name=>"John", :data=>[3, 20]}, {:name=>"Jane", :data=>[1, 3]}]
82
+ chart.options[:legend][:layout].should == "horizontal"
83
+ chart.options[:x_axis][:categories].should == ["uno" ,"dos" , "tres" , "cuatro"]
84
+ chart.options[:chart][:defaultSeriesType].should == "area"
85
+ chart.options[:chart][:inverted].should == true
86
+ end
87
+
88
+ it "should change a block data with overriding entire options" do
89
+ chart = RailsHighcharts.new('graph') do |f|
90
+ f.series(:name=>'John', :data=>[3, 20])
91
+ f.series(:name=>'Jane', :data=>[1, 3] )
92
+ f.title({ :text=>"example test title from controller"})
93
+ # without overriding
94
+ f.x_axis(:categories => ["uno" ,"dos" , "tres" , "cuatro"] , :labels=>{:rotation=>-45 , :align => 'right'})
95
+ f.chart({:defaultSeriesType=>"spline" , :renderTo => "myRenderArea" , :inverted => true})
96
+ end
97
+ chart.options[:x_axis][:categories].should == ["uno" ,"dos" , "tres" , "cuatro"]
98
+ chart.options[:x_axis][:labels][:rotation].should == -45
99
+ chart.options[:x_axis][:labels][:align].should == "right"
100
+ chart.options[:chart][:defaultSeriesType].should == "spline"
101
+ chart.options[:chart][:renderTo].should == "myRenderArea"
102
+ chart.options[:chart][:inverted].should == true
103
+ end
104
+
105
+ it "should have subtitles" do
106
+ chart = RailsHighcharts.new('graph') do |f|
107
+ f.series(:name=>'John',:data=> [3, 20])
108
+ f.series(:name=>'Jane', :data=>[1, 3] )
109
+ f.title({ :text=>"example test title from controller"})
110
+ # without overriding
111
+ f.x_axis(:categories => ["uno" ,"dos" , "tres" , "cuatro"] , :labels=>{:rotation=>-45 , :align => 'right'})
112
+ f.chart({:defaultSeriesType=>"spline" , :renderTo => "myRenderArea" , :inverted => true})
113
+ f.subtitle({:text=>"Bar"})
114
+ end
115
+ chart.options[:subtitle][:text].should == "Bar"
116
+ end
117
+
118
+ end
119
+
120
+ end
@@ -0,0 +1,21 @@
1
+ # coding: utf-8
2
+ require 'rubygems'
3
+ require 'rails'
4
+ require 'active_support'
5
+ require 'actionpack'
6
+ require 'activerecord'
7
+
8
+
9
+ require File.expand_path(File.join(File.dirname(__FILE__), '../lib/rails_highcharts/rails_highcharts'))
10
+ require File.dirname(__FILE__) + "/../app/helpers/rails_highcharts/rails_highcharts_helper"
11
+
12
+ require 'webrat'
13
+
14
+ Rspec.configure do |config|
15
+ config.include ActionView::Helpers
16
+ config.include Webrat::Matchers
17
+ end
18
+
19
+ module HighChartsHelper
20
+ include ActionView::Helpers::TagHelper
21
+ end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_highcharts
3
3
  version: !ruby/object:Gem::Version
4
- hash: 62196393
4
+ hash: 62196399
5
5
  prerelease: 6
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
9
  - 1
10
10
  - beta
11
- - 1
12
- version: 0.0.1.beta1
11
+ - 2
12
+ version: 0.0.1.beta2
13
13
  platform: ruby
14
14
  authors:
15
15
  - AlexZhang
@@ -36,6 +36,50 @@ dependencies:
36
36
  version: 3.0.8
37
37
  type: :runtime
38
38
  version_requirements: *id001
39
+ - !ruby/object:Gem::Dependency
40
+ name: rspec
41
+ prerelease: false
42
+ requirement: &id002 !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ hash: 3
48
+ segments:
49
+ - 2
50
+ - 0
51
+ version: "2.0"
52
+ type: :development
53
+ version_requirements: *id002
54
+ - !ruby/object:Gem::Dependency
55
+ name: rspec-rails
56
+ prerelease: false
57
+ requirement: &id003 !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ hash: 3
63
+ segments:
64
+ - 2
65
+ - 0
66
+ version: "2.0"
67
+ type: :development
68
+ version_requirements: *id003
69
+ - !ruby/object:Gem::Dependency
70
+ name: webrat
71
+ prerelease: false
72
+ requirement: &id004 !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ hash: 3
78
+ segments:
79
+ - 0
80
+ version: "0"
81
+ type: :development
82
+ version_requirements: *id004
39
83
  description: Highcharts for Rails 3
40
84
  email:
41
85
  - blackanger.z@gmail.com
@@ -49,12 +93,18 @@ files:
49
93
  - Gemfile
50
94
  - Rakefile
51
95
  - README.md
96
+ - app/helpers/rails_highcharts/rails_highcharts_helper.rb
52
97
  - lib/generators/rails_highcharts/install_generator.rb
98
+ - lib/generators/rails_highcharts/media/javascripts/excanvas.compiled.js
53
99
  - lib/generators/rails_highcharts/media/javascripts/highcharts.js
54
100
  - lib/rails_highcharts/engine.rb
55
101
  - lib/rails_highcharts/hash_extend.rb
102
+ - lib/rails_highcharts/rails_highcharts.rb
56
103
  - lib/rails_highcharts/version.rb
57
104
  - lib/rails_highcharts.rb
105
+ - spec/rails_highcharts_helper_spec.rb
106
+ - spec/rails_highcharts_spec.rb
107
+ - spec/spec_helper.rb
58
108
  has_rdoc: true
59
109
  homepage: ""
60
110
  licenses: []
@@ -91,5 +141,7 @@ rubygems_version: 1.6.2
91
141
  signing_key:
92
142
  specification_version: 3
93
143
  summary: Highcharts for Rails 3
94
- test_files: []
95
-
144
+ test_files:
145
+ - spec/rails_highcharts_helper_spec.rb
146
+ - spec/rails_highcharts_spec.rb
147
+ - spec/spec_helper.rb