googlecharts 1.6.0 → 1.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.markdown +33 -3
- data/VERSION +1 -1
- data/lib/gchart.rb +11 -17
- data/lib/gchart/aliases.rb +1 -0
- data/spec/gchart_spec.rb +38 -20
- data/spec/spec_helper.rb +3 -3
- data/tasks/rspec.rake +9 -8
- metadata +19 -8
- data/.gitignore +0 -4
data/README.markdown
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
The goal of this Gem is to make the creation of Google Charts a simple and easy task.
|
2
|
-
|
2
|
+
|
3
|
+
require 'googlecharts'
|
3
4
|
Gchart.line( :size => '200x300',
|
4
5
|
:title => "example title",
|
5
6
|
:bg => 'efefef',
|
@@ -175,13 +176,42 @@ Multiple axis labels are available for line charts, bar charts and scatter plots
|
|
175
176
|
* y = left y-axis
|
176
177
|
* r = right y-axis
|
177
178
|
|
178
|
-
Gchart.line(:
|
179
|
+
Gchart.line(:axis_with_label => 'x,y,r,t')
|
179
180
|
|
180
181
|
To add labels on these axis:
|
181
182
|
|
182
|
-
Gchart.line(:
|
183
|
+
Gchart.line(:axis_with_label => 'x,y,r,t',
|
184
|
+
:axis_labels => ['Jan|July|Jan|July|Jan', '0|100', 'A|B|C', '2005|2006|2007'])
|
185
|
+
|
186
|
+
Note that each array entry could also be an array but represent the
|
187
|
+
labels for the corresponding axis.
|
188
|
+
|
189
|
+
A question which comes back often is how do I only display the y axis
|
190
|
+
label? Solution:
|
191
|
+
|
192
|
+
Gchart.line(
|
193
|
+
:data => [0,20, 40, 60, 140, 230, 60],
|
194
|
+
:axis_with_labels => 'y')
|
195
|
+
|
196
|
+
Custom axis ranges
|
197
|
+
---------------
|
198
|
+
|
199
|
+
If you want to display a custom range for an axis, you need to set the
|
200
|
+
range as described in the Google charts documentation: min, max, step:
|
201
|
+
|
202
|
+
Gchart.line( :data => [17, 17, 11, 8, 2],
|
203
|
+
:axis_with_labels => ['x', 'y'],
|
204
|
+
:axis_labels => [['J', 'F', 'M', 'A', 'M']],
|
205
|
+
:axis_range => [nil, [2,17,5]])
|
183
206
|
|
207
|
+
|
208
|
+
In this case, the custom axis range is only defined for y (second
|
209
|
+
entry) with a minimum value of 2, max 17 and a step of 5.
|
210
|
+
|
211
|
+
This is also valid if you want to set a x axis and automatically define
|
212
|
+
the y labels.
|
184
213
|
|
214
|
+
|
185
215
|
Data options
|
186
216
|
-------------
|
187
217
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.6.
|
1
|
+
1.6.1
|
data/lib/gchart.rb
CHANGED
@@ -35,7 +35,7 @@ class Gchart
|
|
35
35
|
|
36
36
|
attr_accessor :title, :type, :width, :height, :curved, :horizontal, :grouped, :legend, :data, :encoding, :bar_colors,
|
37
37
|
:title_color, :title_size, :custom, :axis_with_labels, :axis_labels, :bar_width_and_spacing, :id, :alt, :klass,
|
38
|
-
:range_markers, :geographical_area, :map_colors, :country_codes, :axis_range, :filename, :min, :max, :colors
|
38
|
+
:range_markers, :geographical_area, :map_colors, :country_codes, :axis_range, :filename, :min, :max, :colors, :usemap
|
39
39
|
|
40
40
|
attr_accessor :bg_type, :bg_color, :bg_angle, :chart_type, :chart_color, :chart_angle, :axis_range, :thickness, :new_markers, :grid_lines
|
41
41
|
|
@@ -64,7 +64,7 @@ class Gchart
|
|
64
64
|
end
|
65
65
|
|
66
66
|
def self.method_missing(m, options={})
|
67
|
-
raise NoMethodError, "#{m} is not a supported chart format
|
67
|
+
raise NoMethodError, "#{m} is not a supported chart format. Please use one of the following: #{supported_types}."
|
68
68
|
end
|
69
69
|
|
70
70
|
def initialize(options={})
|
@@ -91,9 +91,8 @@ class Gchart
|
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
-
|
95
94
|
def self.supported_types
|
96
|
-
self.
|
95
|
+
self.types.join(' ')
|
97
96
|
end
|
98
97
|
|
99
98
|
# Defines the Graph size using the following format:
|
@@ -102,10 +101,6 @@ class Gchart
|
|
102
101
|
@width, @height = size.split("x").map { |dimension| dimension.to_i }
|
103
102
|
end
|
104
103
|
|
105
|
-
def size=(size='300x200')
|
106
|
-
@width, @height = size.split("x").map { |dimension| dimension.to_i }
|
107
|
-
end
|
108
|
-
|
109
104
|
def size
|
110
105
|
"#{width}x#{height}"
|
111
106
|
end
|
@@ -249,9 +244,11 @@ class Gchart
|
|
249
244
|
end
|
250
245
|
|
251
246
|
def self.jstize(string)
|
247
|
+
# See http://github.com/mattetti/googlecharts/issues#issue/27
|
248
|
+
#URI.escape( string ).gsub("%7C", "|")
|
252
249
|
# See discussion: http://github.com/mattetti/googlecharts/commit/9b5cfb93aa51aae06611057668e631cd515ec4f3#comment_51347
|
253
250
|
string.gsub(' ', '+').gsub(/\[|\{|\}|\\|\^|\[|\]|\`|\]/) {|c| "%#{c[0].to_s.upcase}"}
|
254
|
-
#
|
251
|
+
#string.gsub(' ', '+').gsub(/\[|\{|\}|\||\\|\^|\[|\]|\`|\]/) {|c| "%#{c[0].to_s.upcase}"}
|
255
252
|
end
|
256
253
|
# load all the custom aliases
|
257
254
|
require 'gchart/aliases'
|
@@ -283,6 +280,7 @@ class Gchart
|
|
283
280
|
image += " height=\"#{height}\""
|
284
281
|
image += " alt=\"#{alt}\""
|
285
282
|
image += " title=\"#{title}\"" if title
|
283
|
+
image += " usemap=\"#{usemap}\"" if usemap
|
286
284
|
image += " />"
|
287
285
|
end
|
288
286
|
|
@@ -451,8 +449,6 @@ class Gchart
|
|
451
449
|
"#{index}:|#{labels}"
|
452
450
|
end
|
453
451
|
end
|
454
|
-
count = labels_arr.length
|
455
|
-
|
456
452
|
"chxl=#{labels_arr.join('|')}"
|
457
453
|
end
|
458
454
|
|
@@ -466,16 +462,14 @@ class Gchart
|
|
466
462
|
|
467
463
|
return unless set && set.respond_to?(:each) && set.find {|o| o}.respond_to?(:each)
|
468
464
|
|
469
|
-
# in the case of a line graph, the first axis range should 1
|
470
|
-
index_increase = type.to_s == 'line' ? 1 : 0
|
471
465
|
'chxr=' + set.enum_for(:each_with_index).map do |axis_range, index|
|
472
466
|
next nil if axis_range.nil? # ignore this axis
|
473
467
|
min, max, step = axis_range
|
474
|
-
if axis_range.size > 3
|
475
|
-
max = axis_range.
|
468
|
+
if axis_range.size > 3 || step && max && step > max # this is a full series
|
469
|
+
max = axis_range.compact.max
|
476
470
|
step = nil
|
477
471
|
end
|
478
|
-
[
|
472
|
+
[index, (min_value || min || 0), (max_value || max), step].compact.join(',')
|
479
473
|
end.compact.join("|")
|
480
474
|
end
|
481
475
|
|
@@ -616,7 +610,7 @@ class Gchart
|
|
616
610
|
#
|
617
611
|
def text_encoding
|
618
612
|
chds = dataset.map{|ds| "#{ds[:min_value]},#{ds[:max_value]}" }.join(",")
|
619
|
-
"t" + number_visible + ":" + datasets.map{ |ds| ds.join(',') }.join('|') + "&chds=" + chds
|
613
|
+
"t" + number_visible + ":" + datasets.map{ |ds| ds.map{|e|e||'_'}.join(',') }.join('|') + "&chds=" + chds
|
620
614
|
end
|
621
615
|
|
622
616
|
# http://code.google.com/apis/chart/#extended
|
data/lib/gchart/aliases.rb
CHANGED
@@ -7,6 +7,7 @@ class Gchart
|
|
7
7
|
alias_method :bar_color=, :bar_colors=
|
8
8
|
alias_method :line_colors=, :bar_colors=
|
9
9
|
alias_method :line_color=, :bar_colors=
|
10
|
+
alias_method :slice_colors=, :bar_colors=
|
10
11
|
alias_method :labels=, :legend=
|
11
12
|
alias_method :horizontal?, :horizontal
|
12
13
|
alias_method :grouped?, :grouped
|
data/spec/gchart_spec.rb
CHANGED
@@ -5,6 +5,16 @@ Chart::Theme.add_theme_file("#{File.dirname(__FILE__)}/fixtures/test_theme.yml")
|
|
5
5
|
|
6
6
|
# Time to add your specs!
|
7
7
|
# http://rspec.rubyforge.org/
|
8
|
+
describe "The Gchart class" do
|
9
|
+
it "should show supported_types on error" do
|
10
|
+
Gchart.supported_types.should match(/line/)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "should return supported types" do
|
14
|
+
Gchart.types.include?('line').should be_true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
8
18
|
describe "generating a default Gchart" do
|
9
19
|
|
10
20
|
before(:each) do
|
@@ -44,7 +54,7 @@ describe "generating a default Gchart" do
|
|
44
54
|
it "should use the simple encoding by default with auto max value" do
|
45
55
|
# 9 is the max value in simple encoding, 26 being our max value the 2nd encoded value should be 9
|
46
56
|
Gchart.line(:data => [0, 26]).should include('chd=s:A9')
|
47
|
-
Gchart.line(:data => [0, 26], :max_value => 26).should include('chxr=
|
57
|
+
Gchart.line(:data => [0, 26], :max_value => 26, :axis_with_labels => 'y').should include('chxr=0,0,26')
|
48
58
|
end
|
49
59
|
|
50
60
|
it "should support simple encoding with and without max_value" do
|
@@ -70,6 +80,10 @@ describe "generating a default Gchart" do
|
|
70
80
|
Gchart.line(:data => [10, 5.2, 4, 45, 78], :encoding => 'text').should include('chd=t:10,5.2,4,45,78')
|
71
81
|
end
|
72
82
|
|
83
|
+
it "should be able to have missing data points with text encoding" do
|
84
|
+
Gchart.line(:data => [10, 5.2, nil, 45, 78], :encoding => 'text').should include('chd=t:10,5.2,_,45,78')
|
85
|
+
end
|
86
|
+
|
73
87
|
it "should handle max and min values with text encoding" do
|
74
88
|
Gchart.line(:data => [10, 5.2, 4, 45, 78], :encoding => 'text').should include('chds=0,78')
|
75
89
|
end
|
@@ -92,7 +106,7 @@ describe "generating a default Gchart" do
|
|
92
106
|
:bar_colors => ['FD9A3B', '4BC7DC']).should include("chxr=0,-20,100")
|
93
107
|
end
|
94
108
|
|
95
|
-
it "should be able to have
|
109
|
+
it "should be able to have multiple set of data with text encoding" do
|
96
110
|
Gchart.line(:data => [[10, 5.2, 4, 45, 78], [20, 40, 70, 15, 99]], :encoding => 'text').include?(Gchart.jstize('chd=t:10,5.2,4,45,78|20,40,70,15,99')).should be_true
|
97
111
|
end
|
98
112
|
|
@@ -113,19 +127,19 @@ describe "generating a default Gchart" do
|
|
113
127
|
end
|
114
128
|
|
115
129
|
def labeled_line(options = {})
|
116
|
-
Gchart.line({:data => @data, :axis_with_labels => 'x,y'}.merge
|
130
|
+
Gchart.line({:data => @data, :axis_with_labels => 'x,y'}.merge(options))
|
117
131
|
end
|
118
132
|
|
119
133
|
it "should display ranges properly" do
|
120
134
|
@data = [85,107,123,131,155,172,173,189,203,222,217,233,250,239,256,267,247,261,275,295,288,305,322,307,325,347,331,346,363,382,343,359,383,352,374,393,358,379,396,416,377,398,419,380,409,426,453,432,452,465,436,460,480,440,457,474,501,457,489,507,347,373,413,402,424,448,475,488,513,475,507,530,440,476,500,518,481,512,531,367,396,423,387,415,446,478,442,469,492,463,489,508,463,491,518,549,503,526,547,493,530,549,493,520,541,564,510,535,564,492,512,537,502,530,548,491,514,538,568,524,548,568,512,533,552,577,520,545,570,516,536,555,514,536,566,521,553,579,604,541,569,595,551,581,602,549,576,606,631,589,615,650,597,624,646,672,605,626,654,584,608,631,574,597,622,559,591,614,644,580,603,629,584,615,631,558,591,618,641,314,356,395,397,429,450,421,454,477,507,458,490,560,593]
|
121
|
-
labeled_line(:axis_labels => [(1
|
122
|
-
should include('chxr=
|
135
|
+
labeled_line(:axis_labels => [((1..24).to_a << 1)]).
|
136
|
+
should include('chxr=0,85,672')
|
123
137
|
end
|
124
138
|
|
125
139
|
def labeled_bar(options = {})
|
126
140
|
Gchart.bar({:data => @data,
|
127
141
|
:axis_with_labels => 'x,y',
|
128
|
-
:axis_labels => [1
|
142
|
+
:axis_labels => [(1..12).to_a],
|
129
143
|
:encoding => "text"
|
130
144
|
}.merge(options))
|
131
145
|
end
|
@@ -153,12 +167,16 @@ describe "generating a default Gchart" do
|
|
153
167
|
labeled_bar(
|
154
168
|
:axis_range => [[],[0,16]]
|
155
169
|
).should include('chxr=0,0|1,0,16')
|
170
|
+
|
171
|
+
Gchart.line(
|
172
|
+
:data => [0,20, 40, 60, 140, 230, 60],
|
173
|
+
:axis_with_labels => 'y').should include("chxr=0,0,230")
|
156
174
|
end
|
157
175
|
|
158
176
|
it "should take in consideration the max value when creating a range" do
|
159
177
|
data = [85,107,123,131,155,172,173,189,203,222,217,233,250,239,256,267,247,261,275,295,288,305,322,307,325,347,331,346,363,382,343,359,383,352,374,393,358,379,396,416,377,398,419,380,409,426,453,432,452,465,436,460,480,440,457,474,501,457,489,507,347,373,413,402,424,448,475,488,513,475,507,530,440,476,500,518,481,512,531,367,396,423,387,415,446,478,442,469,492,463,489,508,463,491,518,549,503,526,547,493,530,549,493,520,541,564,510,535,564,492,512,537,502,530,548,491,514,538,568,524,548,568,512,533,552,577,520,545,570,516,536,555,514,536,566,521,553,579,604,541,569,595,551,581,602,549,576,606,631,589,615,650,597,624,646,672,605,626,654,584,608,631,574,597,622,559,591,614,644,580,603,629,584,615,631,558,591,618,641,314,356,395,397,429,450,421,454,477,507,458,490,560,593]
|
160
|
-
url = Gchart.line(:data => data, :axis_with_labels => 'x,y', :axis_labels => [(1
|
161
|
-
url.should include('chxr=
|
178
|
+
url = Gchart.line(:data => data, :axis_with_labels => 'x,y', :axis_labels => [((1..24).to_a << 1)], :max_value => 700)
|
179
|
+
url.should include('chxr=0,85,700')
|
162
180
|
end
|
163
181
|
|
164
182
|
end
|
@@ -211,8 +229,8 @@ describe "generating different type of charts" do
|
|
211
229
|
end
|
212
230
|
|
213
231
|
it "should not support other types" do
|
214
|
-
|
215
|
-
|
232
|
+
msg = "sexy is not a supported chart format. Please use one of the following: #{Gchart.supported_types}."
|
233
|
+
lambda{Gchart.sexy}.should raise_error(NoMethodError)
|
216
234
|
end
|
217
235
|
|
218
236
|
end
|
@@ -239,25 +257,25 @@ describe "range markers" do
|
|
239
257
|
|
240
258
|
describe "when setting the orientation option" do
|
241
259
|
before(:each) do
|
242
|
-
options = {:start_position => 0.59, :stop_position => 0.61, :color => 'ff0000'}
|
260
|
+
@options = {:start_position => 0.59, :stop_position => 0.61, :color => 'ff0000'}
|
243
261
|
end
|
244
262
|
|
245
263
|
it "to vertical (R) if given a valid option" do
|
246
|
-
Gchart.line(:range_markers => options.merge(:orientation => 'v')).include?('chm=R').should be_true
|
247
|
-
Gchart.line(:range_markers => options.merge(:orientation => 'V')).include?('chm=R').should be_true
|
248
|
-
Gchart.line(:range_markers => options.merge(:orientation => 'R')).include?('chm=R').should be_true
|
249
|
-
Gchart.line(:range_markers => options.merge(:orientation => 'vertical')).include?('chm=R').should be_true
|
250
|
-
Gchart.line(:range_markers => options.merge(:orientation => 'Vertical')).include?('chm=R').should be_true
|
264
|
+
Gchart.line(:range_markers => @options.merge(:orientation => 'v')).include?('chm=R').should be_true
|
265
|
+
Gchart.line(:range_markers => @options.merge(:orientation => 'V')).include?('chm=R').should be_true
|
266
|
+
Gchart.line(:range_markers => @options.merge(:orientation => 'R')).include?('chm=R').should be_true
|
267
|
+
Gchart.line(:range_markers => @options.merge(:orientation => 'vertical')).include?('chm=R').should be_true
|
268
|
+
Gchart.line(:range_markers => @options.merge(:orientation => 'Vertical')).include?('chm=R').should be_true
|
251
269
|
end
|
252
270
|
|
253
271
|
it "to horizontal (r) if given a valid option (actually anything other than the vertical options)" do
|
254
|
-
Gchart.line(:range_markers => options.merge(:orientation => 'horizontal')).include?('chm=r').should be_true
|
255
|
-
Gchart.line(:range_markers => options.merge(:orientation => 'h')).include?('chm=r').should be_true
|
256
|
-
Gchart.line(:range_markers => options.merge(:orientation => 'etc')).include?('chm=r').should be_true
|
272
|
+
Gchart.line(:range_markers => @options.merge(:orientation => 'horizontal')).include?('chm=r').should be_true
|
273
|
+
Gchart.line(:range_markers => @options.merge(:orientation => 'h')).include?('chm=r').should be_true
|
274
|
+
Gchart.line(:range_markers => @options.merge(:orientation => 'etc')).include?('chm=r').should be_true
|
257
275
|
end
|
258
276
|
|
259
277
|
it "if left blank defaults to horizontal (r)" do
|
260
|
-
Gchart.line(:range_markers => options).include?('chm=r').should be_true
|
278
|
+
Gchart.line(:range_markers => @options).include?('chm=r').should be_true
|
261
279
|
end
|
262
280
|
end
|
263
281
|
|
data/spec/spec_helper.rb
CHANGED
data/tasks/rspec.rake
CHANGED
@@ -1,11 +1,17 @@
|
|
1
1
|
begin
|
2
|
-
require '
|
2
|
+
require 'rspec'
|
3
3
|
rescue LoadError
|
4
4
|
require 'rubygems'
|
5
|
-
require '
|
5
|
+
require 'rspec'
|
6
6
|
end
|
7
|
+
|
7
8
|
begin
|
8
|
-
require '
|
9
|
+
require 'rspec/core/rake_task'
|
10
|
+
|
11
|
+
desc "Run the specs under spec/models"
|
12
|
+
RSpec::Core::RakeTask.new do |t|
|
13
|
+
# t.rspec_opts = ['--options', "spec/spec.opts"]
|
14
|
+
end
|
9
15
|
rescue LoadError
|
10
16
|
puts <<-EOS
|
11
17
|
To use rspec for testing you must install rspec gem:
|
@@ -14,8 +20,3 @@ EOS
|
|
14
20
|
exit(0)
|
15
21
|
end
|
16
22
|
|
17
|
-
desc "Run the specs under spec/models"
|
18
|
-
Spec::Rake::SpecTask.new do |t|
|
19
|
-
t.spec_opts = ['--options', "spec/spec.opts"]
|
20
|
-
t.spec_files = FileList['spec/*_spec.rb']
|
21
|
-
end
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: googlecharts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 13
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 1
|
8
|
+
- 6
|
9
|
+
- 1
|
10
|
+
version: 1.6.1
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- Matt Aimonetti
|
@@ -9,7 +15,7 @@ autorequire:
|
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date:
|
18
|
+
date: 2011-02-06 00:00:00 -08:00
|
13
19
|
default_executable:
|
14
20
|
dependencies: []
|
15
21
|
|
@@ -24,7 +30,6 @@ extra_rdoc_files:
|
|
24
30
|
- README.markdown
|
25
31
|
- README.txt
|
26
32
|
files:
|
27
|
-
- .gitignore
|
28
33
|
- History.txt
|
29
34
|
- License.txt
|
30
35
|
- Manifest.txt
|
@@ -64,26 +69,32 @@ homepage: http://googlecharts.rubyforge.org/
|
|
64
69
|
licenses: []
|
65
70
|
|
66
71
|
post_install_message:
|
67
|
-
rdoc_options:
|
68
|
-
|
72
|
+
rdoc_options: []
|
73
|
+
|
69
74
|
require_paths:
|
70
75
|
- lib
|
71
76
|
required_ruby_version: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
72
78
|
requirements:
|
73
79
|
- - ">="
|
74
80
|
- !ruby/object:Gem::Version
|
81
|
+
hash: 3
|
82
|
+
segments:
|
83
|
+
- 0
|
75
84
|
version: "0"
|
76
|
-
version:
|
77
85
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
86
|
+
none: false
|
78
87
|
requirements:
|
79
88
|
- - ">="
|
80
89
|
- !ruby/object:Gem::Version
|
90
|
+
hash: 3
|
91
|
+
segments:
|
92
|
+
- 0
|
81
93
|
version: "0"
|
82
|
-
version:
|
83
94
|
requirements: []
|
84
95
|
|
85
96
|
rubyforge_project:
|
86
|
-
rubygems_version: 1.3.
|
97
|
+
rubygems_version: 1.3.7
|
87
98
|
signing_key:
|
88
99
|
specification_version: 3
|
89
100
|
summary: Generate charts using Google API & Ruby
|
data/.gitignore
DELETED