gruff 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +5 -5
  2. data/.editorconfig +14 -0
  3. data/.rubocop.yml +16 -0
  4. data/.rubocop_todo.yml +923 -0
  5. data/.travis.yml +21 -14
  6. data/{History.txt → CHANGELOG.md} +32 -25
  7. data/README.md +3 -2
  8. data/Rakefile +27 -18
  9. data/assets/bubble.png +0 -0
  10. data/assets/city_scene/background/0000.png +0 -0
  11. data/assets/city_scene/background/0600.png +0 -0
  12. data/assets/city_scene/background/2000.png +0 -0
  13. data/assets/city_scene/clouds/cloudy.png +0 -0
  14. data/assets/city_scene/clouds/partly_cloudy.png +0 -0
  15. data/assets/city_scene/clouds/stormy.png +0 -0
  16. data/assets/city_scene/grass/default.png +0 -0
  17. data/assets/city_scene/haze/true.png +0 -0
  18. data/assets/city_scene/number_sample/1.png +0 -0
  19. data/assets/city_scene/number_sample/2.png +0 -0
  20. data/assets/city_scene/number_sample/default.png +0 -0
  21. data/assets/city_scene/sky/0000.png +0 -0
  22. data/assets/city_scene/sky/0200.png +0 -0
  23. data/assets/city_scene/sky/0400.png +0 -0
  24. data/assets/city_scene/sky/0600.png +0 -0
  25. data/assets/city_scene/sky/0800.png +0 -0
  26. data/assets/city_scene/sky/1000.png +0 -0
  27. data/assets/city_scene/sky/1200.png +0 -0
  28. data/assets/city_scene/sky/1400.png +0 -0
  29. data/assets/city_scene/sky/1500.png +0 -0
  30. data/assets/city_scene/sky/1700.png +0 -0
  31. data/assets/city_scene/sky/2000.png +0 -0
  32. data/assets/pc306715.jpg +0 -0
  33. data/assets/plastik/blue.png +0 -0
  34. data/assets/plastik/green.png +0 -0
  35. data/assets/plastik/red.png +0 -0
  36. data/gruff.gemspec +12 -10
  37. data/lib/gruff.rb +2 -2
  38. data/lib/gruff/accumulator_bar.rb +2 -2
  39. data/lib/gruff/area.rb +1 -4
  40. data/lib/gruff/bar.rb +12 -13
  41. data/lib/gruff/bar_conversion.rb +11 -11
  42. data/lib/gruff/base.rb +36 -36
  43. data/lib/gruff/bezier.rb +1 -2
  44. data/lib/gruff/bullet.rb +7 -10
  45. data/lib/gruff/deprecated.rb +10 -11
  46. data/lib/gruff/dot.rb +3 -4
  47. data/lib/gruff/line.rb +13 -14
  48. data/lib/gruff/mini/bar.rb +3 -3
  49. data/lib/gruff/mini/legend.rb +7 -8
  50. data/lib/gruff/mini/pie.rb +6 -6
  51. data/lib/gruff/mini/side_bar.rb +7 -7
  52. data/lib/gruff/net.rb +2 -8
  53. data/lib/gruff/photo_bar.rb +9 -12
  54. data/lib/gruff/pie.rb +6 -6
  55. data/lib/gruff/scatter.rb +47 -51
  56. data/lib/gruff/scene.rb +17 -19
  57. data/lib/gruff/side_bar.rb +5 -8
  58. data/lib/gruff/side_stacked_bar.rb +24 -26
  59. data/lib/gruff/spider.rb +14 -15
  60. data/lib/gruff/stacked_area.rb +12 -16
  61. data/lib/gruff/stacked_bar.rb +50 -52
  62. data/lib/gruff/stacked_mixin.rb +2 -3
  63. data/lib/gruff/themes.rb +32 -33
  64. data/lib/gruff/version.rb +1 -1
  65. metadata +23 -67
  66. data/RELEASE.md +0 -30
  67. data/test/gruff_test_case.rb +0 -152
  68. data/test/image_compare.rb +0 -58
  69. data/test/test_accumulator_bar.rb +0 -51
  70. data/test/test_area.rb +0 -134
  71. data/test/test_bar.rb +0 -505
  72. data/test/test_base.rb +0 -33
  73. data/test/test_bezier.rb +0 -33
  74. data/test/test_bullet.rb +0 -26
  75. data/test/test_dot.rb +0 -263
  76. data/test/test_labels_for_null_data.rb +0 -27
  77. data/test/test_legend.rb +0 -68
  78. data/test/test_line.rb +0 -674
  79. data/test/test_mini_bar.rb +0 -33
  80. data/test/test_mini_pie.rb +0 -25
  81. data/test/test_mini_side_bar.rb +0 -36
  82. data/test/test_net.rb +0 -231
  83. data/test/test_photo.rb +0 -41
  84. data/test/test_pie.rb +0 -194
  85. data/test/test_scatter.rb +0 -270
  86. data/test/test_scene.rb +0 -100
  87. data/test/test_side_bar.rb +0 -56
  88. data/test/test_sidestacked_bar.rb +0 -105
  89. data/test/test_spider.rb +0 -226
  90. data/test/test_stacked_area.rb +0 -52
  91. data/test/test_stacked_bar.rb +0 -68
@@ -1,270 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- require File.dirname(__FILE__) + '/gruff_test_case'
4
-
5
- class TestGruffScatter < Minitest::Test
6
-
7
- def setup
8
- @datasets = [
9
- [:Chuck, [20, 10, 5, 12, 11, 6, 10, 7], [5, 10, 19, 6, 9, 1, 14, 8]],
10
- [:Brown, [5, 10, 20, 6, 9, 12, 14, 8], [20, 10, 5, 12, 11, 6, 10, 7]],
11
- [:Lucy, [19, 9, 6, 11, 12, 7, 15, 8], [6, 11, 18, 8, 12, 8, 10, 6]]
12
- ]
13
- end
14
-
15
- # Done
16
- def test_scatter_graph
17
- g = setup_basic_graph
18
- g.title = 'Basic Scatter Plot Test'
19
- g.write('test/output/scatter_basic.png')
20
- end
21
-
22
- #~ # Done
23
- def test_many_datapoints
24
- g = Gruff::Scatter.new
25
- g.title = 'Many Datapoint Graph Test'
26
- y_values = (0..50).map { rand(100) }
27
- x_values = (0..50).map { rand(100) }
28
- g.data('many points', x_values, y_values)
29
-
30
- # Default theme
31
- g.write('test/output/scatter_many.png')
32
- end
33
-
34
- def test_custom_label_format
35
- g = Gruff::Scatter.new('1000x500')
36
- g.top_margin = 0
37
- g.hide_legend = true
38
- g.hide_title = true
39
- g.marker_font_size = 10
40
- g.theme = {
41
- :colors => ['#12a702', '#aedaa9'],
42
- :marker_color => '#dddddd',
43
- :font_color => 'black',
44
- :background_colors => 'white'
45
- }
46
-
47
- # Points style
48
- g.circle_radius = 1
49
- g.stroke_width = 0.01
50
-
51
- # Axis labels
52
- g.x_label_margin = 40
53
- g.bottom_margin = 60
54
- g.disable_significant_rounding_x_axis = true
55
- g.use_vertical_x_labels = true
56
- g.enable_vertical_line_markers = true
57
- g.marker_x_count = 50 # One label every 2 days
58
- g.x_axis_label_format = lambda do |value|
59
- DateTime.strptime(value.to_i.to_s,'%s').strftime('%d.%m.%Y')
60
- end
61
- g.y_axis_increment = 1
62
-
63
- # Fake data (100 days, random times of day between 5 and 16)
64
- r = Random.new(269155)
65
- y_values = (0..100).map { 5 + r.rand(12) }
66
- x_values = (0..100).map { |i| Date.today.strftime('%s').to_i + i*3600*24 }
67
- g.data('many points', x_values, y_values)
68
- g.write('test/output/scatter_custom_label_format.png')
69
- end
70
-
71
- # Done
72
- def test_no_data
73
- g = Gruff::Scatter.new(400)
74
- g.title = 'No Data'
75
- # Default theme
76
- g.write('test/output/scatter_no_data.png')
77
-
78
- g = Gruff::Scatter.new(400)
79
- g.title = 'No Data Title'
80
- g.no_data_message = 'There is no data'
81
- g.write('test/output/scatter_no_data_msg.png')
82
- end
83
-
84
- # Done
85
- def test_all_zeros
86
- g = Gruff::Scatter.new(400)
87
- g.title = 'All Zeros'
88
-
89
- g.data(:gus, [0, 0, 0, 0], [0, 0, 0, 0])
90
-
91
- # Default theme
92
- g.write('test/output/scatter_no_data_other.png')
93
- end
94
-
95
- # Done
96
- def test_some_nil_points
97
- g = Gruff::Scatter.new
98
- g.title = 'Some Nil Points'
99
-
100
- @datasets = [
101
- [:data1, [1, 2, 3, nil, 3, 5, 6], [5, nil, nil, nil, nil, 5, 7]]
102
- ]
103
-
104
- @datasets.each do |data|
105
- assert_raises ArgumentError do
106
- g.data(*data)
107
- end
108
- end
109
- end
110
-
111
- # Done
112
- def test_unequal_number_of_x_and_y_values
113
- g = Gruff::Scatter.new
114
- g.title = 'Unequal number of X and Y values'
115
-
116
- @datasets = [
117
- [:data1, [1, 2, 3], [1, 2]],
118
- [:data2, [1, 2, 3, 4, 5], [1, 2, 3, 4, 5, 6]],
119
- ]
120
-
121
- @datasets.each do |data|
122
- assert_raises ArgumentError do
123
- g.data(*data)
124
- end
125
- end
126
- end
127
-
128
- # Done
129
- def test_empty_set_of_axis_values
130
- g = Gruff::Scatter.new
131
- g.title = 'Missing Axis Values'
132
-
133
- @datasets = [
134
- [:data1, [1, 2, 3, 4, 5]]
135
- ]
136
-
137
- @datasets.each do |data|
138
- assert_raises ArgumentError do
139
- g.data(*data)
140
- end
141
- end
142
- end
143
-
144
- # Done
145
- def test_no_title
146
- g = Gruff::Scatter.new(400)
147
- g.data(:data1, [1, 2, 3, 4, 5], [1, 2, 3, 4, 5])
148
- g.write('test/output/scatter_no_title.png')
149
- end
150
-
151
- # Done
152
- def test_no_line_markers
153
- g = setup_basic_graph(400)
154
- g.title = 'No Line Markers'
155
- g.hide_line_markers = true
156
- g.write('test/output/scatter_no_line_markers.png')
157
- end
158
-
159
- # Done
160
- def test_no_legend
161
- g = setup_basic_graph(400)
162
- g.title = 'No Legend'
163
- g.hide_legend = true
164
- g.write('test/output/scatter_no_legend.png')
165
- end
166
-
167
- # Done
168
- def test_nothing_but_the_graph
169
- g = setup_basic_graph(400)
170
- g.title = 'THIS TITLE SHOULD NOT DISPLAY!!!'
171
- g.hide_line_markers = true
172
- g.hide_legend = true
173
- g.hide_title = true
174
- g.write('test/output/scatter_nothing_but_the_graph.png')
175
- end
176
-
177
- # TODO Implement baselines on x and y axis
178
- #~ def test_baseline_larger_than_data
179
- #~ g = setup_basic_graph(400)
180
- #~ g.title = "Baseline Larger Than Data"
181
- #~ g.baseline_value = 150
182
- #~ g.write("test/output/scatter_large_baseline.png")
183
- #~ end
184
-
185
- # Done
186
- def test_wide_graph
187
- g = setup_basic_graph('800x400')
188
- g.title = 'Wide Graph'
189
- g.write('test/output/scatter_wide_graph.png')
190
-
191
- g = setup_basic_graph('400x200')
192
- g.title = 'Wide Graph Small'
193
- g.write('test/output/scatter_wide_graph_small.png')
194
- end
195
-
196
- # Done
197
- def test_negative
198
- g = setup_pos_neg(800)
199
- g.write('test/output/scatter_pos_neg.png')
200
-
201
- g = setup_pos_neg(400)
202
- g.title = 'Pos/Neg Line Test Small'
203
- g.write('test/output/scatter_pos_neg_400.png')
204
- end
205
-
206
- # Done
207
- def test_all_negative
208
- g = setup_all_neg(800)
209
- g.write('test/output/scatter_all_neg.png')
210
-
211
- g = setup_all_neg(400)
212
- g.title = 'All Neg Line Test Small'
213
- g.write('test/output/scatter_all_neg_400.png')
214
- end
215
-
216
- # Done
217
- def test_no_hide_line_no_labels
218
- g = Gruff::Scatter.new
219
- g.title = 'No Hide Line No Labels'
220
- @datasets.each do |data|
221
- g.data(data[0], data[1], data[2])
222
- end
223
- g.hide_line_markers = false
224
- g.write('test/output/scatter_no_hide.png')
225
- end
226
-
227
- def test_no_set_labels
228
- g = Gruff::Scatter.new
229
- g.title = 'Setting Labels Test'
230
- g.labels = {
231
- 0 => 'This',
232
- 1 => 'should',
233
- 2 => 'not',
234
- 3 => 'show',
235
- 4 => 'up'
236
- }
237
- @datasets.each do |data|
238
- g.data(data[0], data[1], data[2])
239
- end
240
- g.write('test/output/scatter_no_labels.png')
241
- end
242
-
243
- protected
244
-
245
- def setup_basic_graph(size=800)
246
- g = Gruff::Scatter.new(size)
247
- g.title = 'Rad Graph'
248
- @datasets.each do |data|
249
- g.data(data[0], data[1], data[2])
250
- end
251
- g
252
- end
253
-
254
- def setup_pos_neg(size=800)
255
- g = Gruff::Scatter.new(size)
256
- g.title = 'Pos/Neg Scatter Graph Test'
257
- g.data(:apples, [-1, 0, 4, -4], [-5, -1, 3, 4])
258
- g.data(:peaches, [10, 8, 6, 3], [-1, 1, 3, 3])
259
- g
260
- end
261
-
262
- def setup_all_neg(size=800)
263
- g = Gruff::Scatter.new(size)
264
- g.title = 'Neg Scatter Graph Test'
265
- g.data(:apples, [-1, -1, -4, -4], [-5, -1, -3, -4])
266
- g.data(:peaches, [-10, -8, -6, -3], [-1, -1, -3, -3])
267
- g
268
- end
269
-
270
- end # end GruffTestCase
@@ -1,100 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- require File.dirname(__FILE__) + "/gruff_test_case"
4
- require 'yaml'
5
-
6
- class LayerStub < Gruff::Layer; attr_reader :base_dir, :filenames, :selected_filename; end
7
-
8
- class TestGruffScene < GruffTestCase
9
-
10
- def test_hazy
11
- g = setup_scene
12
- g.weather = "cloudy"
13
- g.haze = true
14
- g.time = Time.mktime(2006, 7, 4, 4, 35)
15
- g.write "test/output/scene_hazy_night.png"
16
- end
17
-
18
- def test_stormy_night
19
- g = setup_scene
20
- g.weather = "stormy"
21
- g.time = Time.mktime(2006, 7, 4, 0, 0)
22
- g.write "test/output/scene_stormy_night.png"
23
- end
24
-
25
-
26
- def test_not_hazy
27
- g = setup_scene
28
- g.weather = "cloudy"
29
- g.haze = false
30
- g.time = Time.mktime(2006, 7, 4, 6, 00)
31
- g.write "test/output/scene_not_hazy_day.png"
32
- end
33
-
34
- def test_partly_cloudy
35
- g = setup_scene
36
- g.weather = "partly cloudy"
37
- g.haze = false
38
- g.time = Time.mktime(2006, 7, 4, 13, 00)
39
- g.write "test/output/scene_partly_cloudy_day.png"
40
- end
41
-
42
-
43
- def test_stormy_day
44
- g = setup_scene
45
- g.weather = "stormy"
46
- g.haze = false
47
- g.time = Time.mktime(2006, 7, 4, 8, 00)
48
- g.write "test/output/scene_stormy_day.png"
49
- end
50
-
51
-
52
- def test_layer
53
- l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "clouds")
54
- assert_equal %w(cloudy.png partly_cloudy.png stormy.png), l.filenames.sort
55
-
56
- l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "grass")
57
- assert_equal 'default.png', l.selected_filename
58
-
59
- l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "sky")
60
- l.update Time.mktime(2006, 7, 4, 12, 35) # 12:35, July 4, 2006
61
- assert_equal '1200.png', l.selected_filename
62
-
63
- l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "sky")
64
- l.update Time.mktime(2006, 7, 4, 0, 0) # 00:00, July 4, 2006
65
- assert_equal '0000.png', l.selected_filename
66
-
67
- l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "sky")
68
- l.update Time.mktime(2006, 7, 4, 23, 35) # 23:35, July 4, 2006
69
- assert_equal '2000.png', l.selected_filename
70
-
71
- l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "sky")
72
- l.update Time.mktime(2006, 7, 4, 0, 1) # 00:01, July 4, 2006
73
- assert_equal '0000.png', l.selected_filename
74
-
75
- l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "sky")
76
- l.update Time.mktime(2006, 7, 4, 2, 0) # 02:00, July 4, 2006
77
- assert_equal '0200.png', l.selected_filename
78
-
79
- l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "sky")
80
- l.update Time.mktime(2006, 7, 4, 4, 00) # 04:00, July 4, 2006
81
- assert_equal '0400.png', l.selected_filename
82
-
83
- # TODO Need number_sample folder
84
- # l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "number_sample")
85
- # assert_equal %w(1.png 2.png default.png), l.filenames
86
- # l.update 3
87
- # assert_equal 'default.png', l.selected_filename
88
- end
89
-
90
- private
91
-
92
- def setup_scene
93
- g = Gruff::Scene.new("500x100", File.expand_path("../assets/city_scene", File.dirname(__FILE__)) )
94
- g.layers = %w(background haze sky clouds)
95
- g.weather_group = %w(clouds)
96
- g.time_group = %w(background sky)
97
- g
98
- end
99
-
100
- end
@@ -1,56 +0,0 @@
1
-
2
- require File.dirname(__FILE__) + "/gruff_test_case"
3
-
4
- class TestGruffSideBar < GruffTestCase
5
-
6
- def test_bar_graph
7
- g = setup_basic_graph(Gruff::SideBar, 800)
8
- write_test_file g, 'side_bar.png'
9
- end
10
-
11
- def test_bar_spacing
12
- g = setup_basic_graph(Gruff::SideBar, 800)
13
- g.bar_spacing = 0
14
- g.title = "100% spacing between bars"
15
- g.write("test/output/side_bar_spacing_full.png")
16
-
17
- g = setup_basic_graph(Gruff::SideBar, 800)
18
- g.bar_spacing = 0.5
19
- g.title = "50% spacing between bars"
20
- g.write("test/output/side_bar_spacing_half.png")
21
-
22
- g = setup_basic_graph(Gruff::SideBar, 800)
23
- g.bar_spacing = 1
24
- g.title = "0% spacing between bars"
25
- g.write("test/output/side_bar_spacing_none.png")
26
- end
27
-
28
- def test_x_axis_range
29
- g = Gruff::SideBar.new('400x300')
30
- g.title = 'Should run from 8 to 32'
31
- g.hide_line_numbers = false
32
- g.theme_37signals
33
- g.data("Grapes", [8])
34
- g.data("Apples", [24])
35
- g.data("Oranges", [32])
36
- g.data("Watermelon", [8])
37
- g.data("Peaches", [12])
38
- g.labels = {0 => '2003', 2 => '2004', 4 => '2005'}
39
- g.write("test/output/side_bar_data_range.png")
40
- end
41
-
42
- def test_bar_labels
43
- g = Gruff::SideBar.new('400x300')
44
- g.title = 'Should show labels for each bar'
45
- g.data("Grapes", [8])
46
- g.data("Apples", [24])
47
- g.data("Oranges", [32])
48
- g.data("Watermelon", [8])
49
- g.data("Peaches", [12])
50
- g.labels = {0 => '2003', 2 => '2004', 4 => '2005'}
51
- g.show_labels_for_bar_values = true
52
- g.write("test/output/side_bar_labels.png")
53
- end
54
-
55
- end
56
-
@@ -1,105 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- require File.dirname(__FILE__) + "/gruff_test_case"
4
-
5
- class TestGruffSideStackedBar < GruffTestCase
6
-
7
- def setup
8
- @datasets = [
9
- [:Jimmy, [25, 36, 86, 39]],
10
- [:Charles, [80, 54, 67, 54]],
11
- [:Julie, [22, 29, 35, 38]],
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
- }
21
-
22
- end
23
-
24
- def test_bar_graph
25
- g = Gruff::SideStackedBar.new
26
- g.title = "Visual Stacked Bar Graph Test"
27
- g.labels = {
28
- 0 => '5/6',
29
- 1 => '5/15',
30
- 2 => '5/24',
31
- 3 => '5/30',
32
- }
33
- @datasets.each do |data|
34
- g.data(data[0], data[1])
35
- end
36
- g.write "test/output/side_stacked_bar_keynote.png"
37
- end
38
-
39
-
40
- def test_bar_graph_small
41
- g = Gruff::SideStackedBar.new(400)
42
- g.title = "Visual Stacked Bar Graph Test"
43
- g.labels = {
44
- 0 => '5/6',
45
- 1 => '5/15',
46
- 2 => '5/24',
47
- 3 => '5/30',
48
- }
49
- @datasets.each do |data|
50
- g.data(data[0], data[1])
51
- end
52
- g.write "test/output/side_stacked_bar_keynote_small.png"
53
- end
54
-
55
- def test_wide
56
- g = setup_basic_graph('800x400')
57
- g.title = "Wide SSBar"
58
- g.write "test/output/side_stacked_bar_wide.png"
59
- end
60
-
61
- def test_should_space_long_left_labels_appropriately
62
- g = Gruff::SideStackedBar.new
63
- g.title = "Stacked Bar Long Label"
64
- g.labels = {
65
- 0 => 'September',
66
- 1 => 'Oct',
67
- 2 => 'Nov',
68
- 3 => 'Dec',
69
- }
70
- @datasets.each do |data|
71
- g.data(data[0], data[1])
72
- end
73
- g.write "test/output/side_stacked_bar_long_label.png"
74
- end
75
-
76
- def test_bar_labels
77
- g = Gruff::SideStackedBar.new
78
- g.title = "Stacked Bar Long Label"
79
- g.labels = {
80
- 0 => 'September',
81
- 1 => 'Oct',
82
- 2 => 'Nov',
83
- 3 => 'Dec',
84
- }
85
- @datasets.each do |data|
86
- g.data(data[0], data[1])
87
- end
88
- g.show_labels_for_bar_values = true
89
- g.write "test/output/side_stacked_bar_labels.png"
90
- end
91
-
92
- protected
93
-
94
- def setup_basic_graph(size=800)
95
- g = Gruff::SideStackedBar.new(size)
96
- g.title = "My Graph Title"
97
- g.labels = @sample_labels
98
- @datasets.each do |data|
99
- g.data(data[0], data[1])
100
- end
101
- return g
102
- end
103
-
104
- end
105
-