gruff 0.7.0-java → 0.12.0-java

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 (113) hide show
  1. checksums.yaml +5 -5
  2. data/{History.txt → CHANGELOG.md} +81 -25
  3. data/Gemfile +3 -1
  4. data/README.md +51 -23
  5. data/assets/plastik/blue.png +0 -0
  6. data/assets/plastik/green.png +0 -0
  7. data/assets/plastik/red.png +0 -0
  8. data/gruff.gemspec +23 -13
  9. data/init.rb +2 -0
  10. data/lib/gruff.rb +33 -4
  11. data/lib/gruff/accumulator_bar.rb +17 -9
  12. data/lib/gruff/area.rb +31 -21
  13. data/lib/gruff/bar.rb +90 -46
  14. data/lib/gruff/base.rb +476 -710
  15. data/lib/gruff/bezier.rb +29 -18
  16. data/lib/gruff/bullet.rb +58 -71
  17. data/lib/gruff/dot.rb +35 -83
  18. data/lib/gruff/helper/bar_conversion.rb +47 -0
  19. data/lib/gruff/helper/bar_value_label_mixin.rb +33 -0
  20. data/lib/gruff/helper/stacked_mixin.rb +23 -0
  21. data/lib/gruff/histogram.rb +59 -0
  22. data/lib/gruff/line.rb +121 -199
  23. data/lib/gruff/mini/bar.rb +17 -10
  24. data/lib/gruff/mini/legend.rb +26 -38
  25. data/lib/gruff/mini/pie.rb +18 -13
  26. data/lib/gruff/mini/side_bar.rb +25 -12
  27. data/lib/gruff/net.rb +69 -83
  28. data/lib/gruff/patch/rmagick.rb +31 -0
  29. data/lib/gruff/patch/string.rb +13 -0
  30. data/lib/gruff/photo_bar.rb +36 -43
  31. data/lib/gruff/pie.rb +42 -103
  32. data/lib/gruff/renderer/bezier.rb +22 -0
  33. data/lib/gruff/renderer/circle.rb +22 -0
  34. data/lib/gruff/renderer/dash_line.rb +23 -0
  35. data/lib/gruff/renderer/dot.rb +40 -0
  36. data/lib/gruff/renderer/ellipse.rb +22 -0
  37. data/lib/gruff/renderer/line.rb +43 -0
  38. data/lib/gruff/renderer/polygon.rb +24 -0
  39. data/lib/gruff/renderer/polyline.rb +22 -0
  40. data/lib/gruff/renderer/rectangle.rb +20 -0
  41. data/lib/gruff/renderer/renderer.rb +120 -0
  42. data/lib/gruff/renderer/text.rb +57 -0
  43. data/lib/gruff/scatter.rb +128 -201
  44. data/lib/gruff/scene.rb +30 -41
  45. data/lib/gruff/side_bar.rb +100 -68
  46. data/lib/gruff/side_stacked_bar.rb +92 -63
  47. data/lib/gruff/spider.rb +47 -53
  48. data/lib/gruff/stacked_area.rb +37 -34
  49. data/lib/gruff/stacked_bar.rb +99 -54
  50. data/lib/gruff/store/basic_data.rb +36 -0
  51. data/lib/gruff/store/custom_data.rb +36 -0
  52. data/lib/gruff/store/store.rb +81 -0
  53. data/lib/gruff/store/xy_data.rb +58 -0
  54. data/lib/gruff/themes.rb +32 -33
  55. data/lib/gruff/version.rb +3 -1
  56. metadata +74 -102
  57. data/.gitignore +0 -7
  58. data/.travis.yml +0 -19
  59. data/Manifest.txt +0 -81
  60. data/RELEASE.md +0 -30
  61. data/Rakefile +0 -218
  62. data/assets/bubble.png +0 -0
  63. data/assets/city_scene/background/0000.png +0 -0
  64. data/assets/city_scene/background/0600.png +0 -0
  65. data/assets/city_scene/background/2000.png +0 -0
  66. data/assets/city_scene/clouds/cloudy.png +0 -0
  67. data/assets/city_scene/clouds/partly_cloudy.png +0 -0
  68. data/assets/city_scene/clouds/stormy.png +0 -0
  69. data/assets/city_scene/grass/default.png +0 -0
  70. data/assets/city_scene/haze/true.png +0 -0
  71. data/assets/city_scene/number_sample/1.png +0 -0
  72. data/assets/city_scene/number_sample/2.png +0 -0
  73. data/assets/city_scene/number_sample/default.png +0 -0
  74. data/assets/city_scene/sky/0000.png +0 -0
  75. data/assets/city_scene/sky/0200.png +0 -0
  76. data/assets/city_scene/sky/0400.png +0 -0
  77. data/assets/city_scene/sky/0600.png +0 -0
  78. data/assets/city_scene/sky/0800.png +0 -0
  79. data/assets/city_scene/sky/1000.png +0 -0
  80. data/assets/city_scene/sky/1200.png +0 -0
  81. data/assets/city_scene/sky/1400.png +0 -0
  82. data/assets/city_scene/sky/1500.png +0 -0
  83. data/assets/city_scene/sky/1700.png +0 -0
  84. data/assets/city_scene/sky/2000.png +0 -0
  85. data/assets/pc306715.jpg +0 -0
  86. data/lib/gruff/bar_conversion.rb +0 -46
  87. data/lib/gruff/deprecated.rb +0 -39
  88. data/lib/gruff/stacked_mixin.rb +0 -23
  89. data/test/gruff_test_case.rb +0 -152
  90. data/test/image_compare.rb +0 -58
  91. data/test/test_accumulator_bar.rb +0 -51
  92. data/test/test_area.rb +0 -134
  93. data/test/test_bar.rb +0 -505
  94. data/test/test_base.rb +0 -33
  95. data/test/test_bezier.rb +0 -33
  96. data/test/test_bullet.rb +0 -26
  97. data/test/test_dot.rb +0 -263
  98. data/test/test_labels_for_null_data.rb +0 -27
  99. data/test/test_legend.rb +0 -68
  100. data/test/test_line.rb +0 -674
  101. data/test/test_mini_bar.rb +0 -33
  102. data/test/test_mini_pie.rb +0 -25
  103. data/test/test_mini_side_bar.rb +0 -36
  104. data/test/test_net.rb +0 -231
  105. data/test/test_photo.rb +0 -41
  106. data/test/test_pie.rb +0 -194
  107. data/test/test_scatter.rb +0 -270
  108. data/test/test_scene.rb +0 -100
  109. data/test/test_side_bar.rb +0 -56
  110. data/test/test_sidestacked_bar.rb +0 -105
  111. data/test/test_spider.rb +0 -226
  112. data/test/test_stacked_area.rb +0 -52
  113. data/test/test_stacked_bar.rb +0 -68
@@ -1,505 +0,0 @@
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
- super
11
- @datasets = [
12
- [:Jimmy, [25, 36, 86, 39]],
13
- [:Charles, [80, 54, 67, 54]],
14
- [:Julie, [22, 29, 35, 38]],
15
- #[:Jane, [95, 95, 95, 90, 85, 80, 88, 100]],
16
- #[:Philip, [90, 34, 23, 12, 78, 89, 98, 88]],
17
- #["Arthur", [5, 10, 13, 11, 6, 16, 22, 32]],
18
- ]
19
- end
20
-
21
- def test_bar_graph
22
- g = setup_basic_graph
23
- g.title = 'Bar Chart'
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 = Gruff::Themes::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 = Gruff::Themes::ODEO
34
- g.write('test/output/bar_odeo.png')
35
- end
36
-
37
- def test_title_margin
38
- g = setup_basic_graph
39
- g.title = 'Bar Graph with Title Margin = 100'
40
- g.title_margin = 100
41
- g.write('test/output/bar_title_margin.png')
42
- end
43
-
44
- def test_thousand_separators
45
- g = Gruff::Bar.new(600)
46
- g.title = 'Formatted numbers'
47
- g.marker_count = 8
48
- g.data('data', [4025, 1024, 50257, 703672, 1580456])
49
- g.write('test/output/bar_formatted_numbers.png')
50
- end
51
-
52
- def test_bar_graph_set_colors
53
- g = Gruff::Bar.new
54
- g.title = 'Bar Graph With Manual Colors'
55
- g.legend_margin = 50
56
- g.labels = {
57
- 0 => '5/6',
58
- 1 => '5/15',
59
- 2 => '5/24',
60
- 3 => '5/30',
61
- }
62
- g.data(:Art, [0, 5, 8, 15], '#990000')
63
- g.data(:Philosophy, [10, 3, 2, 8], '#009900')
64
- g.data(:Science, [2, 15, 8, 11], '#990099')
65
-
66
- g.minimum_value = 0
67
-
68
- g.write('test/output/bar_manual_colors.png')
69
- end
70
-
71
- def test_bar_graph_small
72
- g = Gruff::Bar.new(400)
73
- g.title = 'Visual Multi-Line Bar Graph Test'
74
- g.labels = {
75
- 0 => '5/6',
76
- 1 => '5/15',
77
- 2 => '5/24',
78
- 3 => '5/30',
79
- }
80
- @datasets.each do |data|
81
- g.data(data[0], data[1])
82
- end
83
-
84
- g.write('test/output/bar_keynote_small.png')
85
- end
86
-
87
- # Somewhat worthless test. Should an error be thrown?
88
- # def test_nil_font
89
- # g = setup_basic_graph 400
90
- # g.title = "Nil Font"
91
- # g.font = nil
92
- # g.write "test/output/bar_nil_font.png"
93
- # end
94
-
95
-
96
- def test_no_line_markers
97
- g = setup_basic_graph(400)
98
- g.title = 'No Line Markers'
99
- g.hide_line_markers = true
100
- g.write('test/output/bar_no_line_markers.png')
101
- end
102
-
103
- def test_no_legend
104
- g = setup_basic_graph(400)
105
- g.title = 'No Legend'
106
- g.hide_legend = true
107
- g.write('test/output/bar_no_legend.png')
108
- end
109
-
110
- def test_no_title
111
- g = setup_basic_graph(400)
112
- g.title = 'No Title'
113
- g.hide_title = true
114
- g.write('test/output/bar_no_title.png')
115
- end
116
-
117
- def test_no_title_or_legend
118
- g = setup_basic_graph(400)
119
- g.title = 'No Title or Legend'
120
- g.hide_legend = true
121
- g.hide_title = true
122
- g.write('test/output/bar_no_title_or_legend.png')
123
- end
124
-
125
- def test_set_marker_count
126
- g = setup_basic_graph(400)
127
- g.title = 'Set marker'
128
- g.marker_count = 10
129
- g.write('test/output/bar_set_marker.png')
130
- end
131
-
132
- def test_set_legend_box_size
133
- g = setup_basic_graph(400)
134
- g.title = 'Set Small Legend Box Size'
135
- g.legend_box_size = 10.0
136
- g.write('test/output/bar_set_legend_box_size_sm.png')
137
-
138
- g = setup_basic_graph(400)
139
- g.title = 'Set Large Legend Box Size'
140
- g.legend_box_size = 50.0
141
- g.write('test/output/bar_set_legend_box_size_lg.png')
142
- end
143
-
144
- def test_x_y_labels
145
- g = setup_basic_graph(400)
146
- g.title = 'X Y Labels'
147
- g.x_axis_label = 'Score (%)'
148
- g.y_axis_label = 'Students'
149
- g.write('test/output/bar_x_y_labels.png')
150
- end
151
-
152
- def test_wide_graph
153
- g = setup_basic_graph('800x400')
154
- g.title = 'Wide Graph'
155
- g.write('test/output/bar_wide_graph.png')
156
-
157
- g = setup_basic_graph('400x200')
158
- g.title = 'Wide Graph Small'
159
- g.write('test/output/bar_wide_graph_small.png')
160
- end
161
-
162
-
163
- def test_tall_graph
164
- g = setup_basic_graph('400x600')
165
- g.title = 'Tall Graph'
166
- g.write('test/output/bar_tall_graph.png')
167
-
168
- g = setup_basic_graph('200x400')
169
- g.title = 'Tall Graph Small'
170
- g.write('test/output/bar_tall_graph_small.png')
171
- end
172
-
173
-
174
- def test_one_value
175
- g = Gruff::Bar.new
176
- g.title = 'One Value Graph Test'
177
- g.labels = {
178
- 0 => '1',
179
- 1 => '2'
180
- }
181
- g.data('one', [1, 1])
182
-
183
- g.write('test/output/bar_one_value.png')
184
- end
185
-
186
-
187
- def test_negative
188
- g = Gruff::Bar.new
189
- g.title = 'Pos/Neg Bar Graph Test'
190
- g.labels = {
191
- 0 => '5/6',
192
- 1 => '5/15',
193
- 2 => '5/24',
194
- 3 => '5/30',
195
- }
196
- g.data(:apples, [-1, 0, 4, -4])
197
- g.data(:peaches, [10, 8, 6, 3])
198
-
199
- g.write('test/output/bar_pos_neg.png')
200
- end
201
-
202
-
203
- def test_nearly_zero
204
- g = Gruff::Bar.new
205
- g.title = 'Nearly Zero Graph'
206
- g.labels = {
207
- 0 => '5/6',
208
- 1 => '5/15',
209
- 2 => '5/24',
210
- 3 => '5/30',
211
- }
212
- g.data(:apples, [1, 2, 3, 4])
213
- g.data(:peaches, [4, 3, 2, 1])
214
- g.minimum_value = 0
215
- g.maximum_value = 10
216
- g.write('test/output/bar_nearly_zero_max_10.png')
217
- end
218
-
219
- def test_y_axis_increment
220
- generate_with_y_axis_increment 2.0
221
- generate_with_y_axis_increment 1
222
- generate_with_y_axis_increment 5
223
- generate_with_y_axis_increment 20
224
- end
225
-
226
- def generate_with_y_axis_increment(increment)
227
- g = Gruff::Bar.new
228
- g.title = "Y Axis Set to #{increment}"
229
- g.labels = {
230
- 0 => '5/6',
231
- 1 => '5/15',
232
- 2 => '5/24',
233
- 3 => '5/30',
234
- }
235
- g.y_axis_increment = increment
236
- g.data(:apples, [1, 0.2, 0.5, 0.7])
237
- g.data(:peaches, [2.5, 2.3, 2, 6.1])
238
- g.write("test/output/bar_y_increment_#{increment}.png")
239
- end
240
-
241
- def test_custom_spacing
242
- g = Gruff::Bar.new
243
- g.spacing_factor = 0
244
- g.title = 'Zero spacing graff'
245
- g.labels = {
246
- 0 => '5/6',
247
- 1 => '5/15',
248
- 2 => '5/24',
249
- 3 => '5/30',
250
- }
251
-
252
- g.data(:apples, [1, 5, 8, 4])
253
- g.data(:peaches, [4, 1, 2, 10])
254
- g.minimum_value = 0
255
- g.maximum_value = 10
256
- g.write('test/output/bar_zero_spacing.png')
257
- end
258
-
259
- def test_spacing_factor_does_not_accept_values_lt_0_and_gt_1
260
- g = Gruff::Bar.new
261
-
262
- assert_raises ArgumentError do
263
- g.spacing_factor = 1.01
264
- end
265
-
266
- assert_raises ArgumentError do
267
- g.spacing_factor = -0.01
268
- end
269
- end
270
-
271
- def test_custom_theme
272
- g = Gruff::Bar.new
273
- g.title = 'Custom Theme'
274
- g.font = File.expand_path('CREABBRG.TTF', ENV['MAGICK_FONT_PATH'])
275
- g.title_font_size = 60
276
- g.legend_font_size = 32
277
- g.marker_font_size = 32
278
- g.theme = {
279
- :colors => %w(#efd250 #666699 #e5573f #9595e2),
280
- :marker_color => 'white',
281
- :font_color => 'blue',
282
- :background_image => 'assets/pc306715.jpg'
283
- }
284
- g.labels = {
285
- 0 => '5/6',
286
- 1 => '5/15',
287
- 2 => '5/24',
288
- 3 => '5/30',
289
- }
290
- g.data(:vancouver, [1, 2, 3, 4])
291
- g.data(:seattle, [2, 4, 6, 8])
292
- g.data(:portland, [3, 1, 7, 3])
293
- g.data(:victoria, [4, 3, 5, 7])
294
- g.minimum_value = 0
295
- g.write('test/output/bar_themed.png')
296
- end
297
-
298
- def test_background_gradient_top_bottom
299
- g = Gruff::Bar.new
300
- g.title = 'Background gradient top to bottom'
301
- g.theme = {
302
- :background_colors => %w(#ff0000 #00ff00),
303
- :background_direction => :top_bottom,
304
- }
305
- g.labels = @labels
306
- @datasets.each do |name, values|
307
- g.data(name, values)
308
- end
309
- g.minimum_value = 0
310
- write_test_file(g, 'bar_background_gradient_top_bottom.png')
311
- end
312
-
313
- def test_background_gradient_bottom_top
314
- g = Gruff::Bar.new
315
- g.title = 'Background gradient top to bottom'
316
- g.theme = {
317
- :background_colors => %w(#ff0000 #00ff00),
318
- :background_direction => :bottom_top,
319
- }
320
- g.labels = @labels
321
- @datasets.each do |name, values|
322
- g.data(name, values)
323
- end
324
- g.minimum_value = 0
325
- write_test_file(g, 'bar_background_gradient_bottom_top.png')
326
- end
327
-
328
- def test_background_gradient_left_right
329
- g = Gruff::Bar.new
330
- g.title = 'Background gradient left to right'
331
- g.theme = {
332
- :background_colors => %w(#ff0000 #00ff00),
333
- :background_direction => :left_right,
334
- }
335
- g.labels = @labels
336
- @datasets.each do |name, values|
337
- g.data(name, values)
338
- end
339
- g.minimum_value = 0
340
- write_test_file(g, 'bar_background_gradient_left_right.png')
341
- end
342
-
343
- def test_background_gradient_right_left
344
- g = Gruff::Bar.new
345
- g.title = 'Background gradient right to left'
346
- g.theme = {
347
- :background_colors => %w(#ff0000 #00ff00),
348
- :background_direction => :right_left,
349
- }
350
- g.labels = @labels
351
- @datasets.each do |name, values|
352
- g.data(name, values)
353
- end
354
- g.minimum_value = 0
355
- write_test_file(g, 'bar_background_gradient_right_left.png')
356
- end
357
-
358
- def test_background_gradient_topleft_bottomright
359
- g = Gruff::Bar.new
360
- g.title = 'Background gradient top left to bottom right'
361
- g.theme = {
362
- :background_colors => %w(#ff0000 #00ff00),
363
- :background_direction => :topleft_bottomright,
364
- }
365
- g.labels = @labels
366
- @datasets.each do |name, values|
367
- g.data(name, values)
368
- end
369
- g.minimum_value = 0
370
- write_test_file(g, 'bar_background_gradient_topleft_bottomright.png')
371
- end
372
-
373
- def test_background_gradient_topright_bottomleft
374
- g = Gruff::Bar.new
375
- g.title = 'Background gradient top right to bottom left'
376
- g.title_font_size = 30
377
- g.theme = {
378
- :background_colors => %w(#ff0000 #00ff00),
379
- :background_direction => :topright_bottomleft,
380
- }
381
- g.labels = @labels
382
- @datasets.each do |name, values|
383
- g.data(name, values)
384
- end
385
- g.minimum_value = 0
386
- write_test_file(g, 'bar_background_gradient_topright_bottomleft.png')
387
- end
388
-
389
- def test_legend_should_not_overlap
390
- g = Gruff::Bar.new(400)
391
- g.theme_37signals()
392
- g.title = 'My Graph'
393
- g.data('Apples Oranges Watermelon Apples Oranges', [1, 2, 3, 4, 4, 3])
394
- g.data('Oranges', [4, 8, 7, 9, 8, 9])
395
- g.data('Watermelon', [2, 3, 1, 5, 6, 8])
396
- g.data('Peaches', [9, 9, 10, 8, 7, 9])
397
- g.labels = {0 => '2003', 2 => '2004', 4 => '2005'}
398
- g.write('test/output/bar_long_legend_text.png')
399
- end
400
-
401
- def test_july_enhancements
402
- g = Gruff::Bar.new(600)
403
- g.hide_legend = true
404
- g.title = 'Full speed ahead'
405
- g.labels = (0..10).inject({}) { |memo, i| memo.merge({i => (i*10).to_s}) }
406
- g.data(:apples, (0..9).map { rand(20)/10.0 })
407
- g.y_axis_increment = 1.0
408
- g.x_axis_label = 'Score (%)'
409
- g.y_axis_label = 'Students'
410
- write_test_file g, 'enhancements.png'
411
- end
412
-
413
- def test_bar_spacing
414
- g = setup_basic_graph
415
- g.bar_spacing = 0
416
- g.title = '100% spacing between bars'
417
- g.write('test/output/bar_spacing_full.png')
418
-
419
- g = setup_basic_graph
420
- g.bar_spacing = 0.5
421
- g.title = '50% spacing between bars'
422
- g.write('test/output/bar_spacing_half.png')
423
-
424
- g = setup_basic_graph
425
- g.bar_spacing = 1
426
- g.title = '0% spacing between bars'
427
- g.write('test/output/bar_spacing_none.png')
428
- end
429
-
430
- def test_set_label_stagger_height
431
- g = setup_long_labelled_graph
432
- g.title = 'Staggered labels'
433
- g.label_stagger_height = 30
434
- g.write('test/output/bar_set_label_stagger_height.png')
435
- end
436
-
437
- def test_set_label_max_size_and_label_truncation_style
438
- # Absolute trunc
439
- g = setup_long_labelled_graph
440
- g.title = 'Absolute truncation (13 chars)'
441
- g.label_max_size = 13
442
- g.label_truncation_style = :absolute
443
- g.write('test/output/bar_set_absolute_trunc.png')
444
-
445
- # Trailing Dots trunc
446
- g = setup_long_labelled_graph
447
- g.title = 'Trailing dots truncation (6 chars inc dots)'
448
- g.label_max_size = 6
449
- g.label_truncation_style = :trailing_dots
450
- g.write('test/output/bar_set_trailing_dots_trunc.png')
451
- end
452
-
453
- def test_bar_value_labels
454
- g = setup_basic_graph
455
- g.show_labels_for_bar_values = true
456
- g.write('test/output/bar_value_labels.png')
457
- end
458
-
459
- def test_zero_marker_count
460
- g = setup_basic_graph
461
- g.marker_count = 0
462
- g.write('test/output/bar_zero_marker_count.png')
463
- end
464
-
465
- def test_zero_marker_shadow
466
- g = setup_basic_graph
467
- g.title = 'Bar Chart with Marker Shadow'
468
- g.marker_shadow_color = '#888888'
469
- g.write('test/output/bar_marker_shadow.png')
470
- end
471
-
472
- protected
473
-
474
- def setup_basic_graph(size=800)
475
- g = Gruff::Bar.new(size)
476
- g.title = 'My Bar Graph'
477
- g.labels = {
478
- 0 => '5/6',
479
- 1 => '5/15',
480
- 2 => '5/24',
481
- 3 => '5/30',
482
- }
483
- @datasets.each do |data|
484
- g.data(data[0], data[1])
485
- end
486
- g
487
- end
488
-
489
- def setup_long_labelled_graph(size=500)
490
- g = Gruff::Bar.new(size)
491
- g.title = 'A Graph for All Seasons'
492
- g.labels = {
493
- 0 => 'January was a cold one',
494
- 1 => 'February is little better',
495
- 2 => 'March will bring me hares',
496
- 3 => 'April and I\'m a fool'
497
- }
498
-
499
- @datasets.each do |data|
500
- g.data(data[0], data[1])
501
- end
502
- g
503
- end
504
- end
505
-