teejayvanslyke-gruff 0.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. data/History.txt +117 -0
  2. data/MIT-LICENSE +21 -0
  3. data/Manifest.txt +81 -0
  4. data/README.txt +40 -0
  5. data/Rakefile +55 -0
  6. data/assets/bubble.png +0 -0
  7. data/assets/city_scene/background/0000.png +0 -0
  8. data/assets/city_scene/background/0600.png +0 -0
  9. data/assets/city_scene/background/2000.png +0 -0
  10. data/assets/city_scene/clouds/cloudy.png +0 -0
  11. data/assets/city_scene/clouds/partly_cloudy.png +0 -0
  12. data/assets/city_scene/clouds/stormy.png +0 -0
  13. data/assets/city_scene/grass/default.png +0 -0
  14. data/assets/city_scene/haze/true.png +0 -0
  15. data/assets/city_scene/number_sample/1.png +0 -0
  16. data/assets/city_scene/number_sample/2.png +0 -0
  17. data/assets/city_scene/number_sample/default.png +0 -0
  18. data/assets/city_scene/sky/0000.png +0 -0
  19. data/assets/city_scene/sky/0200.png +0 -0
  20. data/assets/city_scene/sky/0400.png +0 -0
  21. data/assets/city_scene/sky/0600.png +0 -0
  22. data/assets/city_scene/sky/0800.png +0 -0
  23. data/assets/city_scene/sky/1000.png +0 -0
  24. data/assets/city_scene/sky/1200.png +0 -0
  25. data/assets/city_scene/sky/1400.png +0 -0
  26. data/assets/city_scene/sky/1500.png +0 -0
  27. data/assets/city_scene/sky/1700.png +0 -0
  28. data/assets/city_scene/sky/2000.png +0 -0
  29. data/assets/pc306715.jpg +0 -0
  30. data/assets/plastik/blue.png +0 -0
  31. data/assets/plastik/green.png +0 -0
  32. data/assets/plastik/red.png +0 -0
  33. data/init.rb +2 -0
  34. data/lib/gruff/accumulator_bar.rb +27 -0
  35. data/lib/gruff/area.rb +58 -0
  36. data/lib/gruff/bar.rb +87 -0
  37. data/lib/gruff/bar_conversion.rb +46 -0
  38. data/lib/gruff/base.rb +1123 -0
  39. data/lib/gruff/bullet.rb +109 -0
  40. data/lib/gruff/deprecated.rb +39 -0
  41. data/lib/gruff/dot.rb +113 -0
  42. data/lib/gruff/line.rb +135 -0
  43. data/lib/gruff/mini/bar.rb +37 -0
  44. data/lib/gruff/mini/legend.rb +82 -0
  45. data/lib/gruff/mini/pie.rb +36 -0
  46. data/lib/gruff/mini/side_bar.rb +35 -0
  47. data/lib/gruff/net.rb +140 -0
  48. data/lib/gruff/photo_bar.rb +100 -0
  49. data/lib/gruff/pie.rb +126 -0
  50. data/lib/gruff/scene.rb +209 -0
  51. data/lib/gruff/side_bar.rb +118 -0
  52. data/lib/gruff/side_stacked_bar.rb +77 -0
  53. data/lib/gruff/spider.rb +130 -0
  54. data/lib/gruff/stacked_area.rb +67 -0
  55. data/lib/gruff/stacked_bar.rb +57 -0
  56. data/lib/gruff/stacked_mixin.rb +23 -0
  57. data/lib/gruff.rb +28 -0
  58. data/rails_generators/gruff/gruff_generator.rb +63 -0
  59. data/rails_generators/gruff/templates/controller.rb +32 -0
  60. data/rails_generators/gruff/templates/functional_test.rb +24 -0
  61. data/test/gruff_test_case.rb +123 -0
  62. data/test/test_accumulator_bar.rb +50 -0
  63. data/test/test_area.rb +134 -0
  64. data/test/test_bar.rb +321 -0
  65. data/test/test_base.rb +8 -0
  66. data/test/test_bullet.rb +26 -0
  67. data/test/test_dot.rb +273 -0
  68. data/test/test_legend.rb +68 -0
  69. data/test/test_line.rb +556 -0
  70. data/test/test_mini_bar.rb +33 -0
  71. data/test/test_mini_pie.rb +20 -0
  72. data/test/test_mini_side_bar.rb +37 -0
  73. data/test/test_net.rb +230 -0
  74. data/test/test_photo.rb +41 -0
  75. data/test/test_pie.rb +154 -0
  76. data/test/test_scene.rb +100 -0
  77. data/test/test_side_bar.rb +12 -0
  78. data/test/test_sidestacked_bar.rb +89 -0
  79. data/test/test_sidestacked_bar_percentile.rb +29 -0
  80. data/test/test_spider.rb +216 -0
  81. data/test/test_stacked_area.rb +52 -0
  82. data/test/test_stacked_bar.rb +52 -0
  83. metadata +167 -0
data/test/test_area.rb ADDED
@@ -0,0 +1,134 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require File.dirname(__FILE__) + "/gruff_test_case"
4
+
5
+ class TestGruffArea < GruffTestCase
6
+
7
+ def setup
8
+ @datasets = [
9
+ [:Jimmy, [25, 36, 86, 39, 25, 31, 79, 88]],
10
+ [:Charles, [80, 54, 67, 54, 68, 70, 90, 95]],
11
+ [:Julie, [22, 29, 35, 38, 36, 40, 46, 57]],
12
+ [:Jane, [95, 95, 95, 90, 85, 80, 88, 100]],
13
+ [:Philip, [90, 34, 23, 12, 78, 89, 98, 88]],
14
+ ["Arthur", [5, 10, 13, 11, 6, 16, 22, 32]],
15
+ ]
16
+ @sample_labels = {
17
+ 0 => '5/6',
18
+ 1 => '5/15',
19
+ 2 => '5/24',
20
+ 3 => '5/30',
21
+ 4 => '6/4',
22
+ 5 => '6/12',
23
+ 6 => '6/21',
24
+ 7 => '6/28',
25
+ }
26
+
27
+ end
28
+
29
+ def test_area_graph
30
+ g = Gruff::Area.new
31
+ g.title = "Visual Multi-Area Graph Test"
32
+ g.labels = {
33
+ 0 => '5/6',
34
+ 2 => '5/15',
35
+ 4 => '5/24',
36
+ 6 => '5/30',
37
+ }
38
+ @datasets.each do |data|
39
+ g.data(data[0], data[1])
40
+ end
41
+
42
+ # Default theme
43
+ g.write("test/output/area_keynote.png")
44
+ end
45
+
46
+ def test_resize
47
+ g = Gruff::Area.new(400)
48
+ g.title = "Small Size Multi-Area Graph Test"
49
+ g.labels = {
50
+ 0 => '5/6',
51
+ 2 => '5/15',
52
+ 4 => '5/24',
53
+ 6 => '5/30',
54
+ }
55
+ @datasets.each do |data|
56
+ g.data(data[0], data[1])
57
+ end
58
+
59
+ # Default theme
60
+ g.write("test/output/area_keynote_small.png")
61
+ end
62
+
63
+ def test_many_datapoints
64
+ g = Gruff::Area.new
65
+ g.title = "Many Multi-Area Graph Test"
66
+ g.labels = {
67
+ 0 => 'June',
68
+ 10 => 'July',
69
+ 30 => 'August',
70
+ 50 => 'September',
71
+ }
72
+ g.data('many points', (0..50).collect {|i| rand(100) })
73
+
74
+ # Default theme
75
+ g.write("test/output/area_many.png")
76
+ end
77
+
78
+ def test_many_areas_graph_small
79
+ g = Gruff::Area.new(400)
80
+ g.title = "Many Values Area Test 400px"
81
+ g.labels = {
82
+ 0 => '5/6',
83
+ 10 => '5/15',
84
+ 20 => '5/24',
85
+ 30 => '5/30',
86
+ 40 => '6/4',
87
+ 50 => '6/16'
88
+ }
89
+ %w{jimmy jane philip arthur julie bert}.each do |student_name|
90
+ g.data(student_name, (0..50).collect { |i| rand 100 })
91
+ end
92
+
93
+ # Default theme
94
+ g.write("test/output/area_many_areas_small.png")
95
+ end
96
+
97
+ def test_area_graph_tiny
98
+ g = Gruff::Area.new(300)
99
+ g.title = "Area Test 300px"
100
+ g.labels = {
101
+ 0 => '5/6',
102
+ 10 => '5/15',
103
+ 20 => '5/24',
104
+ 30 => '5/30',
105
+ 40 => '6/4',
106
+ 50 => '6/16'
107
+ }
108
+ %w{jimmy jane philip arthur julie bert}.each do |student_name|
109
+ g.data(student_name, (0..50).collect { |i| rand 100 })
110
+ end
111
+
112
+ # Default theme
113
+ g.write("test/output/area_tiny.png")
114
+ end
115
+
116
+ def test_wide
117
+ g = setup_basic_graph('800x400')
118
+ g.title = "Area Wide"
119
+ g.write("test/output/area_wide.png")
120
+ end
121
+
122
+ protected
123
+
124
+ def setup_basic_graph(size=800)
125
+ g = Gruff::Area.new(size)
126
+ g.title = "My Graph Title"
127
+ g.labels = @sample_labels
128
+ @datasets.each do |data|
129
+ g.data(data[0], data[1])
130
+ end
131
+ return g
132
+ end
133
+
134
+ end
data/test/test_bar.rb ADDED
@@ -0,0 +1,321 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require File.dirname(__FILE__) + "/gruff_test_case"
4
+
5
+ class TestGruffBar < GruffTestCase
6
+
7
+ # TODO Delete old output files once when starting tests
8
+
9
+ def setup
10
+ @datasets = [
11
+ [:Jimmy, [25, 36, 86, 39]],
12
+ [:Charles, [80, 54, 67, 54]],
13
+ [:Julie, [22, 29, 35, 38]],
14
+ #[:Jane, [95, 95, 95, 90, 85, 80, 88, 100]],
15
+ #[:Philip, [90, 34, 23, 12, 78, 89, 98, 88]],
16
+ #["Arthur", [5, 10, 13, 11, 6, 16, 22, 32]],
17
+ ]
18
+ end
19
+
20
+ def test_bar_graph
21
+ g = setup_basic_graph
22
+ g.title = "Bar Graph Test"
23
+ g.title_margin = 100
24
+ g.write("test/output/bar_keynote.png")
25
+
26
+ g = setup_basic_graph
27
+ g.title = "Visual Multi-Line Bar Graph Test"
28
+ g.theme_rails_keynote
29
+ g.write("test/output/bar_rails_keynote.png")
30
+
31
+ g = setup_basic_graph
32
+ g.title = "Visual Multi-Line Bar Graph Test"
33
+ g.theme_odeo
34
+ g.write("test/output/bar_odeo.png")
35
+ end
36
+
37
+ def test_thousand_separators
38
+ g = Gruff::Bar.new(600)
39
+ g.title = "Formatted numbers"
40
+ g.marker_count = 8
41
+ g.data("data", [4025, 1024, 50257, 703672, 1580456])
42
+ g.write("test/output/bar_formatted_numbers.png")
43
+ end
44
+
45
+ def test_bar_graph_set_colors
46
+ g = Gruff::Bar.new
47
+ g.title = "Bar Graph With Manual Colors"
48
+ g.legend_margin = 50
49
+ g.labels = {
50
+ 0 => '5/6',
51
+ 1 => '5/15',
52
+ 2 => '5/24',
53
+ 3 => '5/30',
54
+ }
55
+ g.data(:Art, [0, 5, 8, 15], '#990000')
56
+ g.data(:Philosophy, [10, 3, 2, 8], '#009900')
57
+ g.data(:Science, [2, 15, 8, 11], '#990099')
58
+
59
+ g.minimum_value = 0
60
+
61
+ g.write("test/output/bar_manual_colors.png")
62
+ end
63
+
64
+ def test_bar_graph_small
65
+ g = Gruff::Bar.new(400)
66
+ g.title = "Visual Multi-Line Bar Graph Test"
67
+ g.labels = {
68
+ 0 => '5/6',
69
+ 1 => '5/15',
70
+ 2 => '5/24',
71
+ 3 => '5/30',
72
+ }
73
+ @datasets.each do |data|
74
+ g.data(data[0], data[1])
75
+ end
76
+
77
+ g.write("test/output/bar_keynote_small.png")
78
+ end
79
+
80
+ # Somewhat worthless test. Should an error be thrown?
81
+ # def test_nil_font
82
+ # g = setup_basic_graph 400
83
+ # g.title = "Nil Font"
84
+ # g.font = nil
85
+ # g.write "test/output/bar_nil_font.png"
86
+ # end
87
+
88
+
89
+ def test_no_line_markers
90
+ g = setup_basic_graph(400)
91
+ g.title = "No Line Markers"
92
+ g.hide_line_markers = true
93
+ g.write("test/output/bar_no_line_markers.png")
94
+ end
95
+
96
+ def test_no_legend
97
+ g = setup_basic_graph(400)
98
+ g.title = "No Legend"
99
+ g.hide_legend = true
100
+ g.write("test/output/bar_no_legend.png")
101
+ end
102
+
103
+ def test_no_title
104
+ g = setup_basic_graph(400)
105
+ g.title = "No Title"
106
+ g.hide_title = true
107
+ g.write("test/output/bar_no_title.png")
108
+ end
109
+
110
+ def test_no_title_or_legend
111
+ g = setup_basic_graph(400)
112
+ g.title = "No Title or Legend"
113
+ g.hide_legend = true
114
+ g.hide_title = true
115
+ g.write("test/output/bar_no_title_or_legend.png")
116
+ end
117
+
118
+ def test_set_marker_count
119
+ g = setup_basic_graph(400)
120
+ g.title = "Set marker"
121
+ g.marker_count = 10
122
+ g.write("test/output/bar_set_marker.png")
123
+ end
124
+
125
+ def test_set_legend_box_size
126
+ g = setup_basic_graph(400)
127
+ g.title = "Set Small Legend Box Size"
128
+ g.legend_box_size = 10.0
129
+ g.write("test/output/bar_set_legend_box_size_sm.png")
130
+
131
+ g = setup_basic_graph(400)
132
+ g.title = "Set Large Legend Box Size"
133
+ g.legend_box_size = 50.0
134
+ g.write("test/output/bar_set_legend_box_size_lg.png")
135
+ end
136
+
137
+ def test_x_y_labels
138
+ g = setup_basic_graph(400)
139
+ g.title = "X Y Labels"
140
+ g.x_axis_label = 'Score (%)'
141
+ g.y_axis_label = "Students"
142
+ g.write("test/output/bar_x_y_labels.png")
143
+ end
144
+
145
+ def test_wide_graph
146
+ g = setup_basic_graph('800x400')
147
+ g.title = "Wide Graph"
148
+ g.write("test/output/bar_wide_graph.png")
149
+
150
+ g = setup_basic_graph('400x200')
151
+ g.title = "Wide Graph Small"
152
+ g.write("test/output/bar_wide_graph_small.png")
153
+ end
154
+
155
+
156
+ def test_tall_graph
157
+ g = setup_basic_graph('400x600')
158
+ g.title = "Tall Graph"
159
+ g.write("test/output/bar_tall_graph.png")
160
+
161
+ g = setup_basic_graph('200x400')
162
+ g.title = "Tall Graph Small"
163
+ g.write("test/output/bar_tall_graph_small.png")
164
+ end
165
+
166
+
167
+ def test_one_value
168
+ g = Gruff::Bar.new
169
+ g.title = "One Value Graph Test"
170
+ g.labels = {
171
+ 0 => '1',
172
+ 1 => '2'
173
+ }
174
+ g.data('one', [1,1])
175
+
176
+ g.write("test/output/bar_one_value.png")
177
+ end
178
+
179
+
180
+ def test_negative
181
+ g = Gruff::Bar.new
182
+ g.title = "Pos/Neg Bar Graph Test"
183
+ g.labels = {
184
+ 0 => '5/6',
185
+ 1 => '5/15',
186
+ 2 => '5/24',
187
+ 3 => '5/30',
188
+ }
189
+ g.data(:apples, [-1, 0, 4, -4])
190
+ g.data(:peaches, [10, 8, 6, 3])
191
+
192
+ g.write("test/output/bar_pos_neg.png")
193
+ end
194
+
195
+
196
+ def test_nearly_zero
197
+ g = Gruff::Bar.new
198
+ g.title = "Nearly Zero Graph"
199
+ g.labels = {
200
+ 0 => '5/6',
201
+ 1 => '5/15',
202
+ 2 => '5/24',
203
+ 3 => '5/30',
204
+ }
205
+ g.data(:apples, [1, 2, 3, 4])
206
+ g.data(:peaches, [4, 3, 2, 1])
207
+ g.minimum_value = 0
208
+ g.maximum_value = 10
209
+ g.write("test/output/bar_nearly_zero_max_10.png")
210
+ end
211
+
212
+ def test_y_axis_increment
213
+ generate_with_y_axis_increment 2.0
214
+ generate_with_y_axis_increment 1
215
+ generate_with_y_axis_increment 5
216
+ generate_with_y_axis_increment 20
217
+ end
218
+
219
+ def generate_with_y_axis_increment(increment)
220
+ g = Gruff::Bar.new
221
+ g.title = "Y Axis Set to #{increment}"
222
+ g.labels = {
223
+ 0 => '5/6',
224
+ 1 => '5/15',
225
+ 2 => '5/24',
226
+ 3 => '5/30',
227
+ }
228
+ g.y_axis_increment = increment
229
+ g.data(:apples, [1, 0.2, 0.5, 0.7])
230
+ g.data(:peaches, [2.5, 2.3, 2, 6.1])
231
+ g.write("test/output/bar_y_increment_#{increment}.png")
232
+ end
233
+
234
+
235
+ def test_custom_theme
236
+ g = Gruff::Bar.new
237
+ g.title = "Custom Theme"
238
+ g.font = File.expand_path('CREABBRG.TTF', ENV['MAGICK_FONT_PATH'])
239
+ g.title_font_size = 60
240
+ g.legend_font_size = 32
241
+ g.marker_font_size = 32
242
+ g.theme = {
243
+ :colors => %w(#efd250 #666699 #e5573f #9595e2),
244
+ :marker_color => 'white',
245
+ :font_color => 'blue',
246
+ :background_image => "assets/pc306715.jpg"
247
+ }
248
+ g.labels = {
249
+ 0 => '5/6',
250
+ 1 => '5/15',
251
+ 2 => '5/24',
252
+ 3 => '5/30',
253
+ }
254
+ g.data(:vancouver, [1, 2, 3, 4])
255
+ g.data(:seattle, [2, 4, 6, 8])
256
+ g.data(:portland, [3, 1, 7, 3])
257
+ g.data(:victoria, [4, 3, 5, 7])
258
+ g.minimum_value = 0
259
+ g.write("test/output/bar_themed.png")
260
+ end
261
+
262
+ def test_legend_should_not_overlap
263
+ g = Gruff::Bar.new(400)
264
+ g.theme_37signals()
265
+ g.title = 'My Graph'
266
+ g.data("Apples Oranges Watermelon Apples Oranges", [1, 2, 3, 4, 4, 3])
267
+ g.data('Oranges', [4, 8, 7, 9, 8, 9])
268
+ g.data('Watermelon', [2, 3, 1, 5, 6, 8])
269
+ g.data('Peaches', [9, 9, 10, 8, 7, 9])
270
+ g.labels = {0 => '2003', 2 => '2004', 4 => '2005'}
271
+ g.write("test/output/bar_long_legend_text.png")
272
+ end
273
+
274
+ def test_july_enhancements
275
+ g = Gruff::Bar.new(600)
276
+ g.hide_legend = true
277
+ g.title = "Full speed ahead"
278
+ g.labels = (0..10).inject({}) { |memo, i| memo.merge({ i => (i*10).to_s}) }
279
+ g.data(:apples, (0..9).map { rand(20)/10.0 })
280
+ g.y_axis_increment = 1.0
281
+ g.x_axis_label = 'Score (%)'
282
+ g.y_axis_label = 'Students'
283
+ write_test_file g, 'enhancements.png'
284
+ end
285
+
286
+ def test_bar_spacing
287
+ g = setup_basic_graph
288
+ g.bar_spacing = 0
289
+ g.title = "100% spacing between bars"
290
+ g.write("test/output/bar_spacing_full.png")
291
+
292
+ g = setup_basic_graph
293
+ g.bar_spacing = 0.5
294
+ g.title = "50% spacing between bars"
295
+ g.write("test/output/bar_spacing_half.png")
296
+
297
+ g = setup_basic_graph
298
+ g.bar_spacing = 1
299
+ g.title = "0% spacing between bars"
300
+ g.write("test/output/bar_spacing_none.png")
301
+ end
302
+
303
+ protected
304
+
305
+ def setup_basic_graph(size=800)
306
+ g = Gruff::Bar.new(size)
307
+ g.title = "My Bar Graph"
308
+ g.labels = {
309
+ 0 => '5/6',
310
+ 1 => '5/15',
311
+ 2 => '5/24',
312
+ 3 => '5/30',
313
+ }
314
+ @datasets.each do |data|
315
+ g.data(data[0], data[1])
316
+ end
317
+ g
318
+ end
319
+
320
+ end
321
+
data/test/test_base.rb ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require File.dirname(__FILE__) + "/gruff_test_case"
4
+
5
+ class TestGruffBase < GruffTestCase
6
+
7
+
8
+ end
@@ -0,0 +1,26 @@
1
+ # require File.dirname(__FILE__) + "/gruff_test_case"
2
+ #
3
+ # class TestGruffBullet < GruffTestCase
4
+ #
5
+ # def setup
6
+ # @data_args = [75, 100, {
7
+ # :target => 80,
8
+ # :low => 50,
9
+ # :high => 90
10
+ # }]
11
+ # end
12
+ #
13
+ # def test_bullet_graph
14
+ # g = Gruff::Bullet.new
15
+ # g.title = "Monthly Revenue"
16
+ # g.data *@data_args
17
+ # g.write("test/output/bullet_greyscale.png")
18
+ # end
19
+ #
20
+ # def test_no_options
21
+ # g = Gruff::Bullet.new
22
+ # g.data 127, 150
23
+ # g.write("test/output/bullet_no_options.png")
24
+ # end
25
+ #
26
+ # end