a_la_chart 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt ADDED
@@ -0,0 +1,4 @@
1
+ === 0.0.1 2009-12-11
2
+
3
+ * 1 major enhancement:
4
+ * Initial release
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 Mobi
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Manifest.txt ADDED
@@ -0,0 +1,28 @@
1
+ History.txt
2
+ MIT-LICENSE
3
+ Manifest.txt
4
+ README.rdoc
5
+ Rakefile
6
+ configs/fusion/3.0/angular.xml.builder
7
+ configs/fusion/3.0/bar.xml.builder
8
+ configs/fusion/3.0/column.xml.builder
9
+ configs/fusion/3.0/inline.html.erb
10
+ configs/fusion/3.0/line.xml.builder
11
+ configs/fusion/3.0/pie.xml.builder
12
+ configs/fusion/config.yml
13
+ configs/google/1.0/pie.html.erb
14
+ configs/google/config.yml
15
+ configs/raphael/1.2/dot.html.erb
16
+ configs/raphael/1.2/impact.js.erb
17
+ configs/raphael/1.2/inline.html.erb
18
+ configs/raphael/config.yml
19
+ init.rb
20
+ lib/a_la_chart.rb
21
+ lib/a_la_chart/a_la_chart_helper.rb
22
+ lib/a_la_chart/a_la_chart.rb
23
+ script/console
24
+ script/destroy
25
+ script/generate
26
+ test/a_la_chart_test.rb
27
+ test/test_a_la_chart.rb
28
+ test/test_helper.rb
data/README.rdoc ADDED
@@ -0,0 +1,25 @@
1
+ = a_la_chart
2
+
3
+ * http://github.com/coderoshi/a_la_chart
4
+
5
+ == DESCRIPTION:
6
+
7
+ This is a general framework for inserting various type of charting implementations - from grabbing the data, to declaring how those values are mapped to the desired type of chart (pie, line, bar, etc).
8
+
9
+ == SUPPORT:
10
+
11
+ Note: very much in development
12
+
13
+ * Fusion Charts (partial)
14
+ * Google Charts (partial)
15
+ * gRaphaël (partial)
16
+
17
+ == INSTALL:
18
+
19
+ To install this plugin:
20
+
21
+ script/plugin install git://github.com/coderoshi/a_la_chart.git
22
+
23
+ == LICENSE:
24
+
25
+ Copyright (c) 2009 Mobi, released under the MIT license
data/Rakefile ADDED
@@ -0,0 +1,25 @@
1
+ require 'rubygems'
2
+ gem 'hoe', '>= 2.1.0'
3
+ require 'hoe'
4
+ require 'fileutils'
5
+ # require './lib/a_la_chart'
6
+
7
+ Hoe.plugin :newgem
8
+ # Hoe.plugin :website
9
+ # Hoe.plugin :cucumberfeatures
10
+
11
+ # Generate all the Rake tasks
12
+ # Run 'rake -T' to see list of generated tasks (from gem root directory)
13
+ $hoe = Hoe.spec 'a_la_chart' do
14
+ self.developer 'Eric Redmond', 'eric.redmond@gmail.com'
15
+ self.rubyforge_name = self.name # TODO this is default value
16
+ # self.extra_deps = [['activesupport','>= 2.0.2']]
17
+
18
+ end
19
+
20
+ require 'newgem/tasks'
21
+ Dir['tasks/**/*.rake'].each { |t| load t }
22
+
23
+ # TODO - want other tests/tasks run by default? Add them to the list
24
+ # remove_task :default
25
+ # task :default => [:spec, :features]
@@ -0,0 +1,11 @@
1
+ xml.instruct!
2
+ xml.chart(chart_options.merge(:upperLimit => params[:upperLimit] || 100, :caption => params[:title])) do
3
+ xml.colorRange do
4
+ xml.color :minValue => '0', :maxValue => '2', :code => 'FF654F'
5
+ xml.color :minValue => '2', :maxValue => '4', :code => 'F6BD0F'
6
+ xml.color :minValue => '4', :maxValue => '5', :code => '8BBA00'
7
+ end
8
+ xml.dials do
9
+ xml.dial :value => value(data, :value)
10
+ end
11
+ end
@@ -0,0 +1,6 @@
1
+ xml.instruct!
2
+ xml.chart(chart_options.merge(:caption => params[:title])) do
3
+ data.each do |record|
4
+ xml.set :value => value(record, :value), :label => value(record, :label), :color => next_color
5
+ end
6
+ end
@@ -0,0 +1,6 @@
1
+ xml.instruct!
2
+ xml.chart(chart_options.merge(:caption => params[:title])) do
3
+ data.each do |record|
4
+ xml.set :value => value(record, :value), :label => value(record, :label), :link => value(record, :link), :color => next_color
5
+ end
6
+ end
@@ -0,0 +1,11 @@
1
+ <div>
2
+ <fusioncharts id="<%= div_id %>"
3
+ chartType="<%= chart_type %>"
4
+ swfPath="/FusionCharts/"
5
+ dataUrl="<%= CGI::escape(url) %>"
6
+ width="<%= width %>"
7
+ height="<%= height %>"
8
+ registerWithJS="1"
9
+ debugMode="0">
10
+ </fusioncharts>
11
+ </div>
@@ -0,0 +1,8 @@
1
+ xml.instruct!
2
+ xml.chart(chart_options.merge(:caption => params[:title])) do
3
+ xml.dataset do |dataset|
4
+ data.each do |set|
5
+ xml.set :value => set
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,6 @@
1
+ xml.instruct!
2
+ xml.chart(chart_options.merge(:caption => params[:title])) do
3
+ data.each do |record|
4
+ xml.set :value => value(record, :value), :label => value(record, :label), :color => next_color
5
+ end
6
+ end
@@ -0,0 +1,22 @@
1
+ default: 3.0
2
+ 3.0:
3
+ angular:
4
+ data: 'angular.xml.builder'
5
+ chart_type: AngularGauge
6
+ inline: 'inline.html.erb'
7
+ bar:
8
+ data: 'bar.xml.builder'
9
+ chart_type: Bar2D
10
+ inline: 'inline.html.erb'
11
+ column:
12
+ data: 'column.xml.builder'
13
+ chart_type: Column2D
14
+ inline: 'inline.html.erb'
15
+ line:
16
+ data: 'line.xml.builder'
17
+ chart_type: Line2D
18
+ inline: 'inline.html.erb'
19
+ pie:
20
+ data: 'pie.xml.builder'
21
+ chart_type: Pie2D
22
+ inline: 'inline.html.erb'
@@ -0,0 +1,2 @@
1
+ <% set_chart(:pie) %>
2
+ <img src="http://chart.apis.google.com/chart?cht=p&chd=t:<%= data.map{|r| value(r, :value) }.join(',') %>&chs=<%= width %>x<%= height %>&chl=<%= data.map{|r| value(r, :label) }.join('|') %>" width="<%= width %>" height="<%= height %>" />
@@ -0,0 +1,4 @@
1
+ default: 1.0
2
+ 1.0:
3
+ pie:
4
+ inline: 'pie.html.erb'
@@ -0,0 +1,20 @@
1
+ <div id="<%= div_id %>" class='dot_chart'></div>
2
+ <script type="text/javascript" charset="utf-8">
3
+ <% set_chart(:dot) %>
4
+ window.onload = function () {
5
+ var r = Raphael("<%= div_id %>"),
6
+ xs = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23],
7
+ ys = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7],
8
+ data = <%= data.inspect %>,
9
+ axisy = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
10
+ axisx = ["12a", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12p", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"];
11
+ r.g.txtattr.font = "11px 'Fontin Sans', Fontin-Sans, sans-serif";
12
+
13
+ r.g.dotchart(10, 10, 620, 260, xs, ys, data, {symbol: "o", max: 10, heat: true, axis: "0 0 1 1", axisxstep: 23, axisystep: 6, axisxlabels: axisx, axisxtype: " ", axisytype: " ", axisylabels: axisy}).hover(function () {
14
+ this.tag = this.tag || r.g.tag(this.x, this.y, this.value, 0, this.r + 2).insertBefore(this);
15
+ this.tag.show();
16
+ }, function () {
17
+ this.tag && this.tag.hide();
18
+ });
19
+ };
20
+ </script>
@@ -0,0 +1,437 @@
1
+ var json =
2
+ {
3
+ "max":196419,
4
+ "buckets":
5
+ [
6
+ {
7
+ "d":1195372800,
8
+ "i":
9
+ [
10
+ [
11
+ 0,
12
+ 196419
13
+ ]
14
+ ]
15
+ },
16
+ {
17
+ "d":1195977600,
18
+ "i":
19
+ [
20
+ [
21
+ 0,
22
+ 10
23
+ ]
24
+ ]
25
+ },
26
+ {
27
+ "d":1197187200
28
+
29
+ ,
30
+ "i":
31
+ [
32
+ [
33
+ 0,
34
+ 1148
35
+ ],
36
+ [
37
+ 1,
38
+ 97
39
+ ]
40
+ ]
41
+ },
42
+ {
43
+ "d":1197792000,
44
+ "i":
45
+ [
46
+ [
47
+ 1,
48
+ 156
49
+ ],
50
+ [
51
+ 0,
52
+ 76
53
+ ]
54
+ ]
55
+ },
56
+ {
57
+ "d":1199606400,
58
+ "i":
59
+ [
60
+ [
61
+ 0,
62
+ 619
63
+ ],
64
+ [
65
+ 1,
66
+ 120
67
+ ]
68
+ ]
69
+ }
70
+
71
+
72
+ ,
73
+ {
74
+ "d":1200816000,
75
+ "i":
76
+ [
77
+ [
78
+ 1,
79
+ 157
80
+ ],
81
+ [
82
+ 0,
83
+ 85
84
+ ]
85
+ ]
86
+ },
87
+ {
88
+ "d":1201420800,
89
+ "i":
90
+ [
91
+ [
92
+ 1,
93
+ 30
94
+ ]
95
+ ]
96
+ },
97
+ {
98
+ "d":1202025600,
99
+ "i":
100
+ [
101
+ [
102
+ 1,
103
+ 54
104
+ ],
105
+ [
106
+ 0,
107
+ 2
108
+
109
+
110
+ ]
111
+ ]
112
+ },
113
+ {
114
+ "d":1206255600,
115
+ "i":
116
+ [
117
+ [
118
+ 8,
119
+ 6
120
+ ]
121
+ ]
122
+ },
123
+ {
124
+ "d":1206860400,
125
+ "i":
126
+ [
127
+ [
128
+ 8,
129
+ 175
130
+ ],
131
+ [
132
+ 1,
133
+ 40
134
+ ]
135
+ ]
136
+ },
137
+ {
138
+ "d":1207465200,
139
+ "i":
140
+ [
141
+ [
142
+ 1,
143
+ 114
144
+ ]
145
+ ]
146
+
147
+
148
+
149
+ },
150
+ {
151
+ "d":1208070000,
152
+ "i":
153
+ [
154
+ [
155
+ 0,
156
+ 125
157
+ ],
158
+ [
159
+ 1,
160
+ 2
161
+ ]
162
+ ]
163
+ },
164
+ {
165
+ "d":1208674800,
166
+ "i":
167
+ [
168
+ [
169
+ 1,
170
+ 41
171
+ ],
172
+ [
173
+ 0,
174
+ 12
175
+ ]
176
+ ]
177
+ },
178
+ {
179
+ "d":1213513200,
180
+ "i":
181
+ [
182
+ [
183
+ 0,
184
+ 4954
185
+
186
+
187
+ ],
188
+ [
189
+ 1,
190
+ 14
191
+ ]
192
+ ]
193
+ },
194
+ {
195
+ "d":1214118000,
196
+ "i":
197
+ [
198
+ [
199
+ 0,
200
+ 14032
201
+ ],
202
+ [
203
+ 1,
204
+ 11599
205
+ ],
206
+ [
207
+ 6,
208
+ 3601
209
+ ],
210
+ [
211
+ 3,
212
+ 250
213
+ ],
214
+ [
215
+ 5,
216
+ 201
217
+ ],
218
+ [
219
+ 7,
220
+ 123
221
+ ]
222
+ ]
223
+ },
224
+ {
225
+ "d":1214722800
226
+
227
+ ,
228
+ "i":
229
+ [
230
+ [
231
+ 1,
232
+ 52
233
+ ]
234
+ ]
235
+ },
236
+ {
237
+ "d":1215327600,
238
+ "i":
239
+ [
240
+ [
241
+ 1,
242
+ 230
243
+ ]
244
+ ]
245
+ },
246
+ {
247
+ "d":1216537200,
248
+ "i":
249
+ [
250
+ [
251
+ 0,
252
+ 185
253
+ ],
254
+ [
255
+ 1,
256
+ 75
257
+ ]
258
+ ]
259
+ },
260
+ {
261
+ "d":1217746800,
262
+ "i"
263
+
264
+ :
265
+ [
266
+ [
267
+ 1,
268
+ 131
269
+ ]
270
+ ]
271
+ },
272
+ {
273
+ "d":1218351600,
274
+ "i":
275
+ [
276
+ [
277
+ 0,
278
+ 44515
279
+ ],
280
+ [
281
+ 1,
282
+ 8041
283
+ ],
284
+ [
285
+ 4,
286
+ 3813
287
+ ],
288
+ [
289
+ 3,
290
+ 146
291
+ ],
292
+ [
293
+ 5,
294
+ 127
295
+ ]
296
+ ]
297
+ },
298
+ {
299
+ "d":1218956400,
300
+ "i":
301
+ [
302
+
303
+
304
+
305
+ [
306
+ 2,
307
+ 34
308
+ ]
309
+ ]
310
+ },
311
+ {
312
+ "d":1219561200,
313
+ "i":
314
+ [
315
+ [
316
+ 1,
317
+ 110
318
+ ]
319
+ ]
320
+ },
321
+ {
322
+ "d":1220166000,
323
+ "i":
324
+ [
325
+ [
326
+ 1,
327
+ 333
328
+ ],
329
+ [
330
+ 0,
331
+ 252
332
+ ],
333
+ [
334
+ 3,
335
+ 103
336
+ ]
337
+ ]
338
+ },
339
+ {
340
+ "d":1220770800,
341
+ "i":
342
+ [
343
+ [
344
+ 0,
345
+ 2890
346
+ ],
347
+ [
348
+ 1,
349
+ 462
350
+ ],
351
+ [
352
+ 3,
353
+ 339
354
+ ],
355
+ [
356
+ 2,
357
+ 81
358
+ ]
359
+ ]
360
+ }
361
+ ],
362
+ "authors":
363
+ {
364
+ "5":
365
+ {
366
+ "a":262,
367
+ "c":35,
368
+ "n":"degan@engineyard.com",
369
+ "d":66,
370
+ "u":null
371
+ },
372
+ "0":
373
+ {
374
+ "a":264862,
375
+ "c":154,
376
+ "n":"toolmantim",
377
+ "d":462,
378
+ "u":153
379
+ },
380
+ "6":
381
+ {
382
+ "a":3581,
383
+ "c":5,
384
+ "n":"philoye",
385
+ "d":20,
386
+ "u":15246
387
+ },
388
+ "1":
389
+ {
390
+ "a":21317,
391
+ "c":164,
392
+ "n":"lachlanhardy",
393
+ "d":541,
394
+ "u":3682
395
+ },
396
+ "7":
397
+ {
398
+ "a":89,
399
+ "c":6,
400
+ "n":"joho",
401
+ "d":34,
402
+ "u":4092
403
+ },
404
+ "2":
405
+ {
406
+ "a":89,
407
+ "c":14,
408
+ "n":"DylanFM",
409
+ "d":26,
410
+ "u":14375
411
+ },
412
+ "8":
413
+ {
414
+ "a":163,
415
+ "c":4,
416
+ "n":"tlucas@tim.local",
417
+ "d":18,
418
+ "u":null
419
+ },
420
+ "3":
421
+ {
422
+ "a":777,
423
+ "c":22,
424
+ "n":"lstoll",
425
+ "d":61,
426
+ "u":694
427
+ },
428
+ "4":
429
+ {
430
+ "a":3761,
431
+ "c":13,
432
+ "n":"lachie",
433
+ "d":52,
434
+ "u":265
435
+ }
436
+ }
437
+ };
@@ -0,0 +1,7 @@
1
+ <div id="name2" class="hidden">
2
+ <div id="legend2">&nbsp;</div>
3
+ <div id="username2">legend</div>
4
+ </div>
5
+ <div id="placeholder">mouse over the graph for more details</div>
6
+ <div id="bound-chart"></div>
7
+ <script src="<%= url %>" type="text/javascript" charset="utf-8"></script>
@@ -0,0 +1,8 @@
1
+ default: 1.2
2
+ 1.2:
3
+ impact:
4
+ data: 'impact.js.erb'
5
+ inline: 'inline.html.erb'
6
+ url: 'impact.js'
7
+ dot:
8
+ inline: 'dot.html.erb'
data/init.rb ADDED
@@ -0,0 +1 @@
1
+ require File.join(File.dirname(__FILE__), 'lib', 'a_la_chart')
@@ -0,0 +1,171 @@
1
+ module ALaChart
2
+
3
+ module HelperMethods
4
+ def meta
5
+ @metadata ||= defined?(get_meta) ? get_meta : {}
6
+ end
7
+
8
+ def fields
9
+ @fields ||= defined?(get_fields) ? get_fields : []
10
+ end
11
+
12
+ def data
13
+ @data ||= defined?(get_data) ? get_data : []
14
+ end
15
+
16
+ def value(object, key)
17
+ return '' if object.blank?
18
+
19
+ # if there is a meta map, use it. else try the key itself
20
+ key_field = meta[key] || key
21
+
22
+ if key_field.class == Proc
23
+ val = key_field.call(object)
24
+ else
25
+ val = object.respond_to?(key_field) ? object.send(key_field) : nil
26
+ val = object[key_field] if object.respond_to?('[]')
27
+ val
28
+ end
29
+ end
30
+
31
+ def set_chart(chart_type)
32
+ send "set_chart_#{chart_type}"
33
+ end
34
+
35
+ def a_la_chart_config
36
+ unless defined?(@@alachart_config)
37
+ require 'yaml'
38
+
39
+ @@alachart_config = {}
40
+ Dir.foreach(File.join(File.dirname(__FILE__), '..', '..', 'configs')) do |dir|
41
+ config_path = File.join(File.dirname(__FILE__), '..', '..', 'configs', dir, 'config.yml')
42
+ if File.exists?(config_path)
43
+ @@alachart_config[dir.to_sym] = YAML.load_file(config_path)
44
+ end
45
+ end
46
+ end
47
+ @@alachart_config
48
+ end
49
+ end
50
+
51
+ module InstanceMethods
52
+ include HelperMethods
53
+
54
+ def provide_chart_data
55
+ chart_make = params[:chart_make]
56
+ chart_type = params[:id]
57
+
58
+ chart_type_config, chart_make_version = nil, nil
59
+ if !chart_make.nil? && (chart_make_config = a_la_chart_config[chart_make.to_sym])
60
+ chart_make_version = chart_make_version || chart_make_config['default']
61
+ chart_make_config = chart_make_config[chart_make_version]
62
+ chart_type_config = chart_make_config[chart_type.to_s]
63
+ end
64
+
65
+ return if chart_type_config.nil? || !respond_to?("set_chart_#{chart_type}")
66
+
67
+ respond_to do |format|
68
+ # format.html # index.html.erb
69
+ format.xml { render_style chart_make, chart_type, chart_make_version, chart_type_config }
70
+ format.js { render_style chart_make, chart_type, chart_make_version, chart_type_config }
71
+ end
72
+ end
73
+
74
+ protected
75
+
76
+ def render_style(chart_make, chart_type, chart_make_version=nil, chart_type_config=nil)
77
+ if chart_type_config.nil?
78
+ unless !chart_make.nil? && (chart_make_config = a_la_chart_config[chart_make.to_sym])
79
+ raise "Unknown chart_make. Valid type are: #{a_la_chart_config.keys.map{|v|v.to_sym.inspect}.join(', ')}"
80
+ end
81
+
82
+ chart_make_version = chart_make_version || chart_make_config['default']
83
+ chart_make_config = chart_make_config[chart_make_version]
84
+ chart_type_config = chart_make_config[chart_type.to_s]
85
+ end
86
+
87
+ data_template = chart_type_config['data']
88
+
89
+ send "set_chart_#{chart_type}"
90
+ render File.join(File.dirname(__FILE__), '..', '..', 'configs', chart_make.to_s, chart_make_version.to_s, data_template)
91
+ end
92
+ end
93
+
94
+ def self.included(base)
95
+ base.extend(ClassMethods)
96
+ end
97
+
98
+ module ClassMethods
99
+
100
+ def a_la_chart
101
+ include ALaChart::InstanceMethods
102
+
103
+ self.before_filter(:provide_chart_data, :only => [:show])
104
+
105
+ # Namespace this stuff??
106
+ [:data, :fields, :meta, :value, :a_la_chart_config, :set_chart].each do |method|
107
+ master_helper_module.module_eval <<-end_eval
108
+ def #{method}(*args, &block) # def current_user(*args, &block)
109
+ controller.send(%(#{method}), *args, &block) # controller.send(%(current_user), *args, &block)
110
+ end # end
111
+ end_eval
112
+ end
113
+ end
114
+
115
+ def chart(*types, &block)
116
+ for type in types
117
+ define_method("set_chart_#{type}") do
118
+ block.call if block
119
+ end
120
+ end
121
+ end
122
+
123
+ def data(&block)
124
+ define_method("get_data") do
125
+ # note: instance_eval binds scope variables, call does not
126
+ instance_eval(&block) || []
127
+ # block.call(binding)
128
+ end
129
+ end
130
+
131
+ def fields(*attrs)
132
+ field_ary = attrs.map{|d| d.to_sym }
133
+
134
+ define_method("get_fields") do
135
+ field_ary
136
+ end
137
+ end
138
+
139
+ def meta(*attrs)
140
+ if attrs.size == 1
141
+ attrs = attrs[0]
142
+ if attrs.class == Array
143
+ descriptions = attrs
144
+ elsif attrs.class == Hash
145
+ options = attrs
146
+ elsif attrs.class == Symbol || attrs.class == String
147
+ descriptions = [attrs]
148
+ end
149
+ elsif attrs.size == 2
150
+ descriptions = attrs[0]
151
+ if descriptions.class == Symbol || descriptions.class == String
152
+ descriptions = [descriptions]
153
+ end
154
+ options = attrs[1]
155
+ elsif attrs.size > 2
156
+ descriptions = attrs[0...-1]
157
+ options = attrs[-1]
158
+ end
159
+
160
+ descriptions ||= []
161
+ options ||= {}
162
+
163
+ # descriptions = descriptions.map{|d| d.to_sym }
164
+
165
+ define_method("get_meta") do
166
+ # descriptions
167
+ options
168
+ end
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,83 @@
1
+ module ALaChartHelper
2
+ require "erb"
3
+
4
+ def chart_tag(chart_make, chart_style, args={})
5
+ width = args[:width] || 400
6
+ height = args[:height] || 300
7
+ chart_make_version = args[:version]
8
+ name = args[:name] || args[:case] || 'chart'
9
+ url = base_url = args[:base_url] || url_for
10
+
11
+ chart_make = chart_make.to_sym
12
+
13
+ chart_make_config = a_la_chart_config[chart_make]
14
+ chart_make_version = chart_make_version || chart_make_config['default']
15
+ chart_make_config = chart_make_config[chart_make_version]
16
+
17
+ chart_type_config = chart_make_config[chart_style.to_s]
18
+ raise "#{chart_style.to_s} is an unsupported chart style" if chart_type_config.blank?
19
+ chart_type = chart_type_config['chart_type']
20
+ chart_type = chart_style.to_s if chart_type.blank?
21
+ inline_template = chart_type_config['inline']
22
+
23
+ append_url = chart_type_config['url']
24
+ append_url = "#{chart_style.to_s}.xml" if append_url.blank?
25
+ url += "/#{append_url}?"
26
+
27
+ explicit_args = args[:args].present? ? params.merge(args[:args]) : params
28
+ args.reject!{ |k,v| [:name,:width,:height,:base_url].include?(k) }
29
+ args.merge!(explicit_args)
30
+ # Can I do this? Or does it make me look like...
31
+ args.reject!{ |k,v| ['action','controller'].include?(k) }
32
+ args[:chart_make] = chart_make
33
+
34
+ url += args.to_param
35
+
36
+ div_id = "#{name}_#{Time.now.to_f.to_s.gsub('.','_')}"
37
+
38
+ inline = ERB.new(File.read(File.join(File.dirname(__FILE__), '..', '..', 'configs', chart_make.to_s, chart_make_version.to_s, inline_template)))
39
+ inline.result(binding)
40
+ end
41
+
42
+ def color_palette
43
+ ["7BB465","B2B4B6","FEC35A","65A4B5","9E65B5","B57765","F7DF65","8F866C","B6A65F","C99D60","C1727A","8AABB9","65B584"]
44
+ end
45
+
46
+ def next_color
47
+ @colors ||= color_palette
48
+ @colors.pop
49
+ end
50
+
51
+ def chart_options
52
+ {
53
+ :animation => '1',
54
+ :showBorder => '0',
55
+ :canvasBorderThickness => '1',
56
+ :canvasBorderColor => 'eeeeee',
57
+ :divLineThickness => '1',
58
+ :bgAlpha => '0',
59
+ :useRoundEdges => '0',
60
+ :alpha => '100',
61
+ :bgColor => 'ffffff',
62
+ :shadowXShift=>"1",
63
+ :shadowYShift=>"1",
64
+ :shadowAlpha=>"75",
65
+ # :numberprefix => '$',
66
+ :showValues => '0',
67
+ :showSum => '1',
68
+ :enableSmartLabels => '1',
69
+ :skipOverlapLabels => '1',
70
+ :decimalPrecision => "2",
71
+ :captionPadding => '3',
72
+ :chartLeftMargin => '0',
73
+ :formatNumber => '1',
74
+ :formatNumberScale => '0',
75
+ :baseFont => 'Helvetica, Arial, sans-serif',
76
+ :baseFontSize => '11',
77
+ :baseFontColor => '515151',
78
+ :showToolTip => '1',
79
+ :toolTipBgColor => 'ffffff'
80
+ }
81
+ end
82
+
83
+ end
data/lib/a_la_chart.rb ADDED
@@ -0,0 +1,13 @@
1
+ # module ALaChart
2
+ # VERSION = '0.0.1'
3
+ # end
4
+ # $:.unshift(File.dirname(__FILE__)) unless
5
+ # $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
6
+
7
+ require File.join(File.dirname(__FILE__), 'a_la_chart', 'a_la_chart')
8
+ require File.join(File.dirname(__FILE__), 'a_la_chart', 'a_la_chart_helper')
9
+
10
+ ActionController::Base.class_eval do
11
+ include ALaChart
12
+ end
13
+ ActionView::Base.send :include, ALaChartHelper
data/script/console ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env ruby
2
+ # File: script/console
3
+ irb = RUBY_PLATFORM =~ /(:?mswin|mingw)/ ? 'irb.bat' : 'irb'
4
+
5
+ libs = " -r irb/completion"
6
+ # Perhaps use a console_lib to store any extra methods I may want available in the cosole
7
+ # libs << " -r #{File.dirname(__FILE__) + '/../lib/console_lib/console_logger.rb'}"
8
+ libs << " -r #{File.dirname(__FILE__) + '/../lib/a_la_chart.rb'}"
9
+ puts "Loading a_la_chart gem"
10
+ exec "#{irb} #{libs} --simple-prompt"
data/script/destroy ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/destroy'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Destroy.new.run(ARGV)
data/script/generate ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..'))
3
+
4
+ begin
5
+ require 'rubigen'
6
+ rescue LoadError
7
+ require 'rubygems'
8
+ require 'rubigen'
9
+ end
10
+ require 'rubigen/scripts/generate'
11
+
12
+ ARGV.shift if ['--help', '-h'].include?(ARGV[0])
13
+ RubiGen::Base.use_component_sources! [:rubygems, :newgem, :newgem_theme, :test_unit]
14
+ RubiGen::Scripts::Generate.new.run(ARGV)
@@ -0,0 +1,8 @@
1
+ require 'test_helper'
2
+
3
+ class ALaChartTest < ActiveSupport::TestCase
4
+ # Replace this with your real tests.
5
+ test "the truth" do
6
+ assert true
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ require File.dirname(__FILE__) + '/test_helper.rb'
2
+
3
+ class TestALaChart < Test::Unit::TestCase
4
+
5
+ def setup
6
+ end
7
+
8
+ def test_truth
9
+ assert true
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ require 'stringio'
2
+ require 'test/unit'
3
+ require File.dirname(__FILE__) + '/../lib/a_la_chart'
metadata ADDED
@@ -0,0 +1,95 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: a_la_chart
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Eric Redmond
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-12-11 00:00:00 -05:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hoe
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 2.3.3
24
+ version:
25
+ description: This is a general framework for inserting various type of charting implementations - from grabbing the data, to declaring how those values are mapped to the desired type of chart (pie, line, bar, etc).
26
+ email:
27
+ - eric.redmond@gmail.com
28
+ executables: []
29
+
30
+ extensions: []
31
+
32
+ extra_rdoc_files:
33
+ - History.txt
34
+ - Manifest.txt
35
+ files:
36
+ - History.txt
37
+ - MIT-LICENSE
38
+ - Manifest.txt
39
+ - README.rdoc
40
+ - Rakefile
41
+ - configs/fusion/3.0/angular.xml.builder
42
+ - configs/fusion/3.0/bar.xml.builder
43
+ - configs/fusion/3.0/column.xml.builder
44
+ - configs/fusion/3.0/inline.html.erb
45
+ - configs/fusion/3.0/line.xml.builder
46
+ - configs/fusion/3.0/pie.xml.builder
47
+ - configs/fusion/config.yml
48
+ - configs/google/1.0/pie.html.erb
49
+ - configs/google/config.yml
50
+ - configs/raphael/1.2/dot.html.erb
51
+ - configs/raphael/1.2/impact.js.erb
52
+ - configs/raphael/1.2/inline.html.erb
53
+ - configs/raphael/config.yml
54
+ - init.rb
55
+ - lib/a_la_chart.rb
56
+ - lib/a_la_chart/a_la_chart_helper.rb
57
+ - lib/a_la_chart/a_la_chart.rb
58
+ - script/console
59
+ - script/destroy
60
+ - script/generate
61
+ - test/a_la_chart_test.rb
62
+ - test/test_a_la_chart.rb
63
+ - test/test_helper.rb
64
+ has_rdoc: true
65
+ homepage: http://github.com/coderoshi/a_la_chart
66
+ licenses: []
67
+
68
+ post_install_message:
69
+ rdoc_options:
70
+ - --main
71
+ - README.rdoc
72
+ require_paths:
73
+ - lib
74
+ required_ruby_version: !ruby/object:Gem::Requirement
75
+ requirements:
76
+ - - ">="
77
+ - !ruby/object:Gem::Version
78
+ version: "0"
79
+ version:
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: "0"
85
+ version:
86
+ requirements: []
87
+
88
+ rubyforge_project: a_la_chart
89
+ rubygems_version: 1.3.5
90
+ signing_key:
91
+ specification_version: 3
92
+ summary: This is a general framework for inserting various type of charting implementations - from grabbing the data, to declaring how those values are mapped to the desired type of chart (pie, line, bar, etc).
93
+ test_files:
94
+ - test/test_a_la_chart.rb
95
+ - test/test_helper.rb