schapht-gruff 0.3.5

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 (80) hide show
  1. data/History.txt +111 -0
  2. data/MIT-LICENSE +21 -0
  3. data/Manifest.txt +79 -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.rb +27 -0
  35. data/lib/gruff/accumulator_bar.rb +27 -0
  36. data/lib/gruff/area.rb +58 -0
  37. data/lib/gruff/bar.rb +84 -0
  38. data/lib/gruff/bar_conversion.rb +46 -0
  39. data/lib/gruff/base.rb +1112 -0
  40. data/lib/gruff/bullet.rb +109 -0
  41. data/lib/gruff/deprecated.rb +39 -0
  42. data/lib/gruff/line.rb +105 -0
  43. data/lib/gruff/mini/bar.rb +32 -0
  44. data/lib/gruff/mini/legend.rb +77 -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 +142 -0
  48. data/lib/gruff/photo_bar.rb +100 -0
  49. data/lib/gruff/pie.rb +124 -0
  50. data/lib/gruff/scene.rb +209 -0
  51. data/lib/gruff/side_bar.rb +115 -0
  52. data/lib/gruff/side_stacked_bar.rb +74 -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 +54 -0
  56. data/lib/gruff/stacked_mixin.rb +23 -0
  57. data/rails_generators/gruff/gruff_generator.rb +63 -0
  58. data/rails_generators/gruff/templates/controller.rb +32 -0
  59. data/rails_generators/gruff/templates/functional_test.rb +24 -0
  60. data/test/gruff_test_case.rb +123 -0
  61. data/test/test_accumulator_bar.rb +50 -0
  62. data/test/test_area.rb +134 -0
  63. data/test/test_bar.rb +283 -0
  64. data/test/test_base.rb +8 -0
  65. data/test/test_bullet.rb +26 -0
  66. data/test/test_legend.rb +68 -0
  67. data/test/test_line.rb +513 -0
  68. data/test/test_mini_bar.rb +32 -0
  69. data/test/test_mini_pie.rb +20 -0
  70. data/test/test_mini_side_bar.rb +37 -0
  71. data/test/test_net.rb +230 -0
  72. data/test/test_photo.rb +41 -0
  73. data/test/test_pie.rb +154 -0
  74. data/test/test_scene.rb +100 -0
  75. data/test/test_side_bar.rb +12 -0
  76. data/test/test_sidestacked_bar.rb +89 -0
  77. data/test/test_spider.rb +216 -0
  78. data/test/test_stacked_area.rb +52 -0
  79. data/test/test_stacked_bar.rb +52 -0
  80. metadata +160 -0
@@ -0,0 +1,100 @@
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
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
@@ -0,0 +1,12 @@
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
+ end
12
+
@@ -0,0 +1,89 @@
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
+ protected
77
+
78
+ def setup_basic_graph(size=800)
79
+ g = Gruff::SideStackedBar.new(size)
80
+ g.title = "My Graph Title"
81
+ g.labels = @sample_labels
82
+ @datasets.each do |data|
83
+ g.data(data[0], data[1])
84
+ end
85
+ return g
86
+ end
87
+
88
+ end
89
+
@@ -0,0 +1,216 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require File.dirname(__FILE__) + "/gruff_test_case"
4
+
5
+ class TestGruffSpider < GruffTestCase
6
+
7
+ def setup
8
+ @datasets = [
9
+ [:Strength, [10]],
10
+ [:Dexterity, [16]],
11
+ [:Constitution, [12]],
12
+ [:Intelligence, [12]],
13
+ [:Wisdom, [10]],
14
+ ["Charisma", [16]],
15
+ ]
16
+
17
+ # @datasets = [
18
+ # [:Darren, [25]],
19
+ # [:Chris, [80]],
20
+ # [:Egbert, [22]],
21
+ # [:Adam, [95]],
22
+ # [:Bill, [90]],
23
+ # ["Frank", [5]],
24
+ # ["Zero", [0]],
25
+ # ]
26
+ end
27
+
28
+ def test_spider_graph
29
+ g = Gruff::Spider.new(20)
30
+ g.title = "Spider Graph Test"
31
+ @datasets.each do |data|
32
+ g.data(data[0], data[1])
33
+ end
34
+
35
+ # Default theme
36
+ g.write("test/output/spider_keynote.png")
37
+ end
38
+
39
+ def test_pie_graph_small
40
+ g = Gruff::Spider.new(20, 400)
41
+ g.title = "Visual Spider Graph Test Small"
42
+ @datasets.each do |data|
43
+ g.data(data[0], data[1])
44
+ end
45
+
46
+ # Default theme
47
+ g.write("test/output/spider_small.png")
48
+ end
49
+
50
+ def test_spider_graph_nearly_equal
51
+ g = Gruff::Spider.new(50)
52
+ g.title = "Spider Graph Nearly Equal"
53
+
54
+ g.data(:Blake, [41])
55
+ g.data(:Aaron, [42])
56
+ g.data(:Grouch, [40])
57
+ # g.data(:Snuffleupagus, [43])
58
+
59
+ g.write("test/output/spider_nearly_equal.png")
60
+ end
61
+
62
+ def test_pie_graph_equal
63
+ g = Gruff::Spider.new(50)
64
+ g.title = "Spider Graph Equal"
65
+
66
+ g.data(:Bert, [41])
67
+ g.data(:Adam, [41])
68
+ g.data(:Joe, [41])
69
+
70
+ g.write("test/output/spider_equal.png")
71
+ end
72
+
73
+ def test_pie_graph_zero
74
+ g = Gruff::Spider.new(2)
75
+ g.title = "Pie Graph Two One Zero"
76
+
77
+ g.data(:Bert, [0])
78
+ g.data(:Adam, [1])
79
+ g.data(:Sam, [2])
80
+
81
+ g.write("test/output/spider_zero.png")
82
+ end
83
+
84
+ def test_wide
85
+ g = setup_basic_graph('800x400')
86
+ g.title = "Wide spider"
87
+ g.write("test/output/spider_wide.png")
88
+ end
89
+
90
+ def test_label_size
91
+ g = setup_basic_graph()
92
+ g.title = "Spider With Small Legend"
93
+ g.legend_font_size = 10
94
+ g.write("test/output/spider_legend.png")
95
+
96
+ g = setup_basic_graph(400)
97
+ g.title = "Small spider With Small Legend"
98
+ g.legend_font_size = 10
99
+ g.write("test/output/spider_legend_small.png")
100
+ end
101
+
102
+ def test_theme_37signals
103
+ g = Gruff::Spider.new(20)
104
+ g.title = "Spider Graph Test"
105
+ @datasets.each do |data|
106
+ g.data(data[0], data[1])
107
+ end
108
+
109
+ g.theme_37signals
110
+
111
+ # Default theme
112
+ g.write("test/output/spider_37signals.png")
113
+ end
114
+
115
+ def test_no_axes
116
+ g = Gruff::Spider.new(20)
117
+ g.title = "Look ma, no axes"
118
+ g.hide_axes = true
119
+ @datasets.each do |data|
120
+ g.data(data[0], data[1])
121
+ end
122
+ g.write("test/output/spider_no_axes.png")
123
+
124
+ end
125
+
126
+ def test_no_print
127
+ g = Gruff::Spider.new(20)
128
+ g.title = "Should not print"
129
+ g.hide_text = true
130
+ @datasets.each do |data|
131
+ g.data(data[0], data[1])
132
+ end
133
+ g.write("test/output/spider_no_print.png")
134
+ end
135
+
136
+ def test_transparency
137
+ g = Gruff::Spider.new(20)
138
+ g.title = "Transparent background"
139
+ g.hide_text = true
140
+ g.transparent_background = true
141
+ g.hide_axes = true
142
+ @datasets.each do |data|
143
+ g.data(data[0], data[1])
144
+ end
145
+ g.write("test/output/spider_no_background.png")
146
+ end
147
+
148
+ def test_overlay
149
+ g = Gruff::Spider.new(20)
150
+ g.title = "George (blue) vs Sarah (white)"
151
+ @datasets.each do |data|
152
+ g.data(data[0], data[1])
153
+ end
154
+ g.write("test/output/spider_overlay_1.png")
155
+
156
+ g = Gruff::Spider.new(20)
157
+ g.title = "Transparent background"
158
+ g.hide_text = true
159
+ g.hide_axes = true
160
+ g.transparent_background = true
161
+ @datasets = [
162
+ [:Strength, [18]],
163
+ [:Dexterity, [10]],
164
+ [:Constitution, [18]],
165
+ [:Intelligence, [8]],
166
+ [:Wisdom, [14]],
167
+ ["Charisma", [4]],
168
+ ]
169
+ @datasets.each do |data|
170
+ g.data(data[0], data[1])
171
+ end
172
+ g.marker_color = "#4F6EFF"
173
+ g.write("test/output/spider_overlay_2.png")
174
+ end
175
+
176
+ def test_lots_of_data
177
+ g = Gruff::Spider.new(10)
178
+ @datasets = [[:a, [1]], [:b, [5]], [:c, [3]], [:d, [9]], [:e, [4]],
179
+ [:f, [7]], [:g, [0]], [:h, [4]], [:i, [6]], [:j, [0]],
180
+ [:k, [4]], [:l, [8]]]
181
+
182
+ @datasets.each do |data|
183
+ g.data(data[0], data[1])
184
+ end
185
+
186
+ g.title = "Sample Data"
187
+ g.write("test/output/spider_lots_of_data.png")
188
+ end
189
+
190
+ def test_lots_of_data_with_large_names
191
+ g = Gruff::Spider.new(10)
192
+ @datasets = [[:anteaters, [1]], [:bulls, [5]], [:cats, [3]], [:dogs, [9]], [:elephants, [4]],
193
+ [:frogs, [7]], [:giraffes, [0]], [:hamsters, [4]], [:iguanas, [6]],
194
+ [:jaguar, [0]], [:kangaroo, [4]], [:locust, [8]]]
195
+
196
+ @datasets.each do |data|
197
+ g.data(data[0], data[1])
198
+ end
199
+
200
+ g.title = "Zoo Inventory"
201
+ g.write("test/output/spider_lots_of_data_normal_names.png")
202
+ end
203
+
204
+
205
+ protected
206
+
207
+ def setup_basic_graph(size=800, max = 20)
208
+ g = Gruff::Spider.new(max, size)
209
+ g.title = "My Graph Title"
210
+ @datasets.each do |data|
211
+ g.data(data[0], data[1])
212
+ end
213
+ return g
214
+ end
215
+
216
+ end
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/ruby
2
+
3
+ require File.dirname(__FILE__) + "/gruff_test_case"
4
+
5
+ class TestGruffStackedArea < 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
+ ]
13
+ @sample_labels = {
14
+ 0 => '5/6',
15
+ 1 => '5/15',
16
+ 2 => '5/24'
17
+ }
18
+
19
+ end
20
+
21
+ def test_area_graph
22
+ g = Gruff::StackedArea.new
23
+ g.title = "Visual Stacked Area Graph Test"
24
+ g.labels = {
25
+ 0 => '5/6',
26
+ 1 => '5/15',
27
+ 2 => '5/24',
28
+ 3 => '5/30',
29
+ }
30
+ @datasets.each do |data|
31
+ g.data(data[0], data[1])
32
+ end
33
+ g.write "test/output/stacked_area_keynote.png"
34
+ end
35
+
36
+
37
+ def test_area_graph_small
38
+ g = Gruff::StackedArea.new(400)
39
+ g.title = "Visual Stacked Area Graph Test"
40
+ g.labels = {
41
+ 0 => '5/6',
42
+ 1 => '5/15',
43
+ 2 => '5/24',
44
+ 3 => '5/30',
45
+ }
46
+ @datasets.each do |data|
47
+ g.data(data[0], data[1])
48
+ end
49
+ g.write "test/output/stacked_area_keynote_small.png"
50
+ end
51
+
52
+ end