gruff 0.1.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/CocoaMagick.rb +311 -0
- data/lib/gruff/bar.rb +15 -4
- data/lib/gruff/base.rb +263 -100
- data/lib/gruff/deprecated.rb +39 -0
- data/lib/gruff/line.rb +4 -2
- data/lib/gruff/pie.rb +1 -1
- data/lib/gruff/scene.rb +8 -7
- data/test/bar_test.rb +95 -39
- data/test/gruff_test_case.rb +22 -0
- data/test/line_test.rb +47 -1
- data/test/pie_test.rb +12 -0
- data/test/scene_test.rb +6 -0
- metadata +4 -2
@@ -0,0 +1,39 @@
|
|
1
|
+
|
2
|
+
##
|
3
|
+
# A mixin for methods that need to be deleted or have been
|
4
|
+
# replaced by cleaner code.
|
5
|
+
|
6
|
+
module Gruff
|
7
|
+
module Deprecated
|
8
|
+
|
9
|
+
def scale_measurements
|
10
|
+
setup_graph_measurements
|
11
|
+
end
|
12
|
+
|
13
|
+
def total_height
|
14
|
+
@rows + 10
|
15
|
+
end
|
16
|
+
|
17
|
+
def graph_top
|
18
|
+
@graph_top * @scale
|
19
|
+
end
|
20
|
+
|
21
|
+
def graph_height
|
22
|
+
@graph_height * @scale
|
23
|
+
end
|
24
|
+
|
25
|
+
def graph_left
|
26
|
+
@graph_left * @scale
|
27
|
+
end
|
28
|
+
|
29
|
+
def graph_width
|
30
|
+
@graph_width * @scale
|
31
|
+
end
|
32
|
+
|
33
|
+
# TODO Should be calculate_graph_height
|
34
|
+
# def setup_graph_height
|
35
|
+
# @graph_height = @graph_bottom - @graph_top
|
36
|
+
# end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
data/lib/gruff/line.rb
CHANGED
@@ -37,8 +37,10 @@ class Gruff::Line < Gruff::Base
|
|
37
37
|
super
|
38
38
|
|
39
39
|
return unless @has_data
|
40
|
-
|
41
|
-
|
40
|
+
|
41
|
+
# Check to see if more than one datapoint was given. NaN can result otherwise.
|
42
|
+
@x_increment = (@column_count > 1) ? (@graph_width / (@column_count - 1).to_f) : @graph_width
|
43
|
+
|
42
44
|
circle_radius = clip_value_if_greater_than(@columns / (@norm_data.first[1].size * 2.5), 5.0)
|
43
45
|
|
44
46
|
@d = @d.stroke_opacity 1.0
|
data/lib/gruff/pie.rb
CHANGED
@@ -11,7 +11,7 @@ class Gruff::Pie < Gruff::Base
|
|
11
11
|
return unless @has_data
|
12
12
|
|
13
13
|
diameter = @graph_height
|
14
|
-
radius = [@graph_width, @graph_height].min / 2.0
|
14
|
+
radius = ([@graph_width, @graph_height].min / 2.0) * 0.8
|
15
15
|
top_x = @graph_left + (@graph_width - diameter) / 2.0
|
16
16
|
center_x = @graph_left + (@graph_width / 2.0)
|
17
17
|
center_y = @graph_top + (@graph_height / 2.0) - 10 # Move graph up a bit
|
data/lib/gruff/scene.rb
CHANGED
@@ -2,10 +2,7 @@
|
|
2
2
|
require "observer"
|
3
3
|
require File.dirname(__FILE__) + '/base'
|
4
4
|
|
5
|
-
|
6
|
-
#
|
7
|
-
# Started by Geoffrey Grosenbach at Canada on Rails, April 2006.
|
8
|
-
#
|
5
|
+
##
|
9
6
|
# A scene is a non-linear graph that assembles layers together to tell a story.
|
10
7
|
# Layers are folders with appropriately named files (see below). You can group
|
11
8
|
# layers and control them together or just set their values individually.
|
@@ -147,6 +144,8 @@ class Gruff::Layer
|
|
147
144
|
else
|
148
145
|
select_default
|
149
146
|
end
|
147
|
+
# Finally, try to use 'default' if we're still blank
|
148
|
+
@selected_filename ||= select_default
|
150
149
|
end
|
151
150
|
|
152
151
|
# Returns the full path to the selected image, or a blank string
|
@@ -185,12 +184,14 @@ private
|
|
185
184
|
end
|
186
185
|
|
187
186
|
def select_default
|
188
|
-
|
187
|
+
@filenames.include?("default.png") ? "default.png" : ''
|
189
188
|
end
|
190
189
|
|
191
|
-
# Returns the string "#{filename}.png", if it exists
|
190
|
+
# Returns the string "#{filename}.png", if it exists.
|
191
|
+
#
|
192
|
+
# Failing that, it returns default.png, or '' if that doesn't exist.
|
192
193
|
def file_exists_or_blank(filename)
|
193
|
-
@filenames.include?("#{filename}.png") ? "#{filename}.png" :
|
194
|
+
@filenames.include?("#{filename}.png") ? "#{filename}.png" : select_default
|
194
195
|
end
|
195
196
|
|
196
197
|
end
|
data/test/bar_test.rb
CHANGED
@@ -18,45 +18,18 @@ class TestGruffBar < GruffTestCase
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def test_bar_graph
|
21
|
-
g =
|
22
|
-
g.title = "
|
23
|
-
g.labels = {
|
24
|
-
0 => '5/6',
|
25
|
-
1 => '5/15',
|
26
|
-
2 => '5/24',
|
27
|
-
3 => '5/30',
|
28
|
-
}
|
29
|
-
@datasets.each do |data|
|
30
|
-
g.data(data[0], data[1])
|
31
|
-
end
|
21
|
+
g = setup_basic_graph
|
22
|
+
g.title = "Bar Graph Test"
|
32
23
|
g.write("test/output/bar_keynote.png")
|
33
24
|
|
34
|
-
g =
|
25
|
+
g = setup_basic_graph
|
35
26
|
g.title = "Visual Multi-Line Bar Graph Test"
|
36
|
-
g.labels = {
|
37
|
-
0 => '5/6',
|
38
|
-
1 => '5/15',
|
39
|
-
2 => '5/24',
|
40
|
-
3 => '5/30',
|
41
|
-
}
|
42
27
|
g.theme_rails_keynote
|
43
|
-
@datasets.each do |data|
|
44
|
-
g.data(data[0], data[1])
|
45
|
-
end
|
46
28
|
g.write("test/output/bar_rails_keynote.png")
|
47
29
|
|
48
|
-
g =
|
30
|
+
g = setup_basic_graph
|
49
31
|
g.title = "Visual Multi-Line Bar Graph Test"
|
50
|
-
g.labels = {
|
51
|
-
0 => '5/6',
|
52
|
-
1 => '5/15',
|
53
|
-
2 => '5/24',
|
54
|
-
3 => '5/30',
|
55
|
-
}
|
56
32
|
g.theme_odeo
|
57
|
-
@datasets.each do |data|
|
58
|
-
g.data(data[0], data[1])
|
59
|
-
end
|
60
33
|
g.write("test/output/bar_odeo.png")
|
61
34
|
end
|
62
35
|
|
@@ -94,13 +67,13 @@ class TestGruffBar < GruffTestCase
|
|
94
67
|
g.write("test/output/bar_keynote_small.png")
|
95
68
|
end
|
96
69
|
|
97
|
-
|
98
|
-
def test_nil_font
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
end
|
70
|
+
# Somewhat worthless test. Should an error be thrown?
|
71
|
+
# def test_nil_font
|
72
|
+
# g = setup_basic_graph 400
|
73
|
+
# g.title = "Nil Font"
|
74
|
+
# g.font = nil
|
75
|
+
# g.write "test/output/bar_nil_font.png"
|
76
|
+
# end
|
104
77
|
|
105
78
|
|
106
79
|
def test_no_line_markers
|
@@ -110,6 +83,44 @@ class TestGruffBar < GruffTestCase
|
|
110
83
|
g.write("test/output/bar_no_line_markers.png")
|
111
84
|
end
|
112
85
|
|
86
|
+
def test_no_legend
|
87
|
+
g = setup_basic_graph(400)
|
88
|
+
g.title = "No Legend"
|
89
|
+
g.hide_legend = true
|
90
|
+
g.write("test/output/bar_no_legend.png")
|
91
|
+
end
|
92
|
+
|
93
|
+
def test_no_title
|
94
|
+
g = setup_basic_graph(400)
|
95
|
+
g.title = "No Title"
|
96
|
+
g.hide_title = true
|
97
|
+
g.write("test/output/bar_no_title.png")
|
98
|
+
end
|
99
|
+
|
100
|
+
def test_no_title_or_legend
|
101
|
+
g = setup_basic_graph(400)
|
102
|
+
g.title = "No Title or Legend"
|
103
|
+
g.hide_legend = true
|
104
|
+
g.hide_title = true
|
105
|
+
g.write("test/output/bar_no_title_or_legend.png")
|
106
|
+
end
|
107
|
+
|
108
|
+
def test_set_marker_count
|
109
|
+
g = setup_basic_graph(400)
|
110
|
+
g.title = "Set marker"
|
111
|
+
g.marker_count = 10
|
112
|
+
g.write("test/output/bar_set_marker.png")
|
113
|
+
end
|
114
|
+
|
115
|
+
def test_x_y_labels
|
116
|
+
g = setup_basic_graph(400)
|
117
|
+
g.title = "X Y Labels"
|
118
|
+
g.x_axis_label = 'Score (%)'
|
119
|
+
g.y_axis_label = "Students"
|
120
|
+
g.write("test/output/bar_x_y_labels.png")
|
121
|
+
end
|
122
|
+
|
123
|
+
|
113
124
|
def test_wide_graph
|
114
125
|
g = setup_basic_graph('800x400')
|
115
126
|
g.title = "Wide Graph"
|
@@ -121,6 +132,17 @@ class TestGruffBar < GruffTestCase
|
|
121
132
|
end
|
122
133
|
|
123
134
|
|
135
|
+
def test_tall_graph
|
136
|
+
g = setup_basic_graph('400x600')
|
137
|
+
g.title = "Tall Graph"
|
138
|
+
g.write("test/output/bar_tall_graph.png")
|
139
|
+
|
140
|
+
g = setup_basic_graph('200x400')
|
141
|
+
g.title = "Tall Graph Small"
|
142
|
+
g.write("test/output/bar_tall_graph_small.png")
|
143
|
+
end
|
144
|
+
|
145
|
+
|
124
146
|
def test_one_value
|
125
147
|
g = Gruff::Bar.new
|
126
148
|
g.title = "One Value Graph Test"
|
@@ -163,13 +185,36 @@ class TestGruffBar < GruffTestCase
|
|
163
185
|
g.data(:peaches, [4, 3, 2, 1])
|
164
186
|
g.minimum_value = 0
|
165
187
|
g.maximum_value = 10
|
166
|
-
g.write("test/output/
|
188
|
+
g.write("test/output/bar_nearly_zero_max_10.png")
|
189
|
+
end
|
190
|
+
|
191
|
+
def test_y_axis_increment
|
192
|
+
generate_with_y_axis_increment 2.0
|
193
|
+
generate_with_y_axis_increment 1
|
194
|
+
generate_with_y_axis_increment 5
|
195
|
+
generate_with_y_axis_increment 20
|
196
|
+
end
|
197
|
+
|
198
|
+
def generate_with_y_axis_increment(increment)
|
199
|
+
g = Gruff::Bar.new
|
200
|
+
g.title = "Y Axis Set to #{increment}"
|
201
|
+
g.labels = {
|
202
|
+
0 => '5/6',
|
203
|
+
1 => '5/15',
|
204
|
+
2 => '5/24',
|
205
|
+
3 => '5/30',
|
206
|
+
}
|
207
|
+
g.y_axis_increment = increment
|
208
|
+
g.data(:apples, [1, 0.2, 0.5, 0.7])
|
209
|
+
g.data(:peaches, [2.5, 2.3, 2, 6.1])
|
210
|
+
g.write("test/output/bar_y_increment_#{increment}.png")
|
167
211
|
end
|
168
212
|
|
169
213
|
|
170
214
|
def test_custom_theme
|
171
215
|
g = Gruff::Bar.new
|
172
216
|
g.title = "Custom Theme"
|
217
|
+
g.font = File.expand_path('CREABBRG.TTF', ENV['MAGICK_FONT_PATH'])
|
173
218
|
g.title_font_size = 60
|
174
219
|
g.legend_font_size = 32
|
175
220
|
g.marker_font_size = 32
|
@@ -192,6 +237,17 @@ class TestGruffBar < GruffTestCase
|
|
192
237
|
g.write("test/output/bar_themed.png")
|
193
238
|
end
|
194
239
|
|
240
|
+
def test_july_enhancements
|
241
|
+
g = Gruff::Bar.new(600)
|
242
|
+
g.hide_legend = true
|
243
|
+
g.title = "Full speed ahead"
|
244
|
+
g.labels = (0..10).inject({}) { |memo, i| memo.merge({ i => (i*10).to_s}) }
|
245
|
+
g.data(:apples, (0..9).map { rand(20)/10.0 })
|
246
|
+
g.y_axis_increment = 1.0
|
247
|
+
g.x_axis_label = 'Score (%)'
|
248
|
+
g.y_axis_label = 'Students'
|
249
|
+
write_test_file g, 'enhancements.png'
|
250
|
+
end
|
195
251
|
|
196
252
|
|
197
253
|
protected
|
data/test/gruff_test_case.rb
CHANGED
@@ -9,5 +9,27 @@ class GruffTestCase < Test::Unit::TestCase
|
|
9
9
|
assert true
|
10
10
|
end
|
11
11
|
|
12
|
+
protected
|
13
|
+
|
14
|
+
# Generate graphs at several sizes.
|
15
|
+
#
|
16
|
+
# Also writes the graph to disk.
|
17
|
+
#
|
18
|
+
# graph_sized 'bar_basic' do |g|
|
19
|
+
# g.data('students', [1, 2, 3, 4])
|
20
|
+
# end
|
21
|
+
#
|
22
|
+
def graph_sized(filename, &block)
|
23
|
+
class_name = self.class.name.gsub(/^TestGruff/, '')
|
24
|
+
['', 400].each do |size|
|
25
|
+
g = instance_eval("Gruff::#{class_name}.new #{size}")
|
26
|
+
block.call g
|
27
|
+
write_test_file g, "#{filename}#{size}.png"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def write_test_file(graph, filename)
|
32
|
+
graph.write(File.dirname(__FILE__) + "/output/#{filename}")
|
33
|
+
end
|
12
34
|
|
13
35
|
end
|
data/test/line_test.rb
CHANGED
@@ -33,6 +33,50 @@ class TestGruffLine < GruffTestCase
|
|
33
33
|
line_graph_with_themes(400)
|
34
34
|
end
|
35
35
|
|
36
|
+
def test_one_value
|
37
|
+
g = Gruff::Line.new
|
38
|
+
g.title = "One Value Graph Test"
|
39
|
+
g.labels = {
|
40
|
+
0 => '1',
|
41
|
+
1 => '2'
|
42
|
+
}
|
43
|
+
g.data('one', 1)
|
44
|
+
|
45
|
+
g.write("test/output/line_one_value.png")
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_one_value_array
|
49
|
+
g = Gruff::Line.new
|
50
|
+
g.title = "One Value Graph Test"
|
51
|
+
g.labels = {
|
52
|
+
0 => '1',
|
53
|
+
1 => '2'
|
54
|
+
}
|
55
|
+
g.data('one', [1])
|
56
|
+
|
57
|
+
g.write("test/output/line_one_value_array.png")
|
58
|
+
end
|
59
|
+
|
60
|
+
|
61
|
+
def test_fix_hang
|
62
|
+
g = Gruff::Line.new(320)
|
63
|
+
g.title = "Hang Value Graph Test"
|
64
|
+
g.data('test', [0,0,100])
|
65
|
+
|
66
|
+
g.write("test/output/line_hang_value.png")
|
67
|
+
end
|
68
|
+
|
69
|
+
# def test_fix_crash
|
70
|
+
# g = Gruff::Line.new(370)
|
71
|
+
# g.title = "Crash Test"
|
72
|
+
# g.data "ichi", [5]
|
73
|
+
# g.data "ni", [0]
|
74
|
+
# g.data "san", [0]
|
75
|
+
# g.data "shi", [0]
|
76
|
+
# g.write("test/output/line_crash_fix_test.png")
|
77
|
+
# end
|
78
|
+
|
79
|
+
|
36
80
|
def test_line_small_values
|
37
81
|
@datasets = [
|
38
82
|
[:small, [0.1, 0.14356, 0.0, 0.5674839, 0.456]],
|
@@ -121,6 +165,7 @@ class TestGruffLine < GruffTestCase
|
|
121
165
|
50 => 'September',
|
122
166
|
}
|
123
167
|
g.data('many points', (0..50).collect {|i| rand(100) })
|
168
|
+
g.x_axis_label = "Months"
|
124
169
|
|
125
170
|
# Default theme
|
126
171
|
g.write("test/output/line_many.png")
|
@@ -137,6 +182,7 @@ class TestGruffLine < GruffTestCase
|
|
137
182
|
g.title = "Similar High End Values With Floor"
|
138
183
|
g.data('similar points', %w(29.43 29.459 29.498 29.53 29.548 29.589 29.619 29.66 29.689 29.849 29.878 29.74 29.769 29.79 29.808 29.828).collect {|i| i.to_f} )
|
139
184
|
g.minimum_value = 0
|
185
|
+
g.y_axis_label = "Barometric Pressure"
|
140
186
|
g.write("test/output/line_similar_high_end_values_with_floor.png")
|
141
187
|
end
|
142
188
|
|
@@ -378,7 +424,6 @@ class TestGruffLine < GruffTestCase
|
|
378
424
|
g.write('test/output/line_many_numbers.png')
|
379
425
|
end
|
380
426
|
|
381
|
-
|
382
427
|
protected
|
383
428
|
|
384
429
|
# TODO Reset data after each theme
|
@@ -449,6 +494,7 @@ protected
|
|
449
494
|
return g
|
450
495
|
end
|
451
496
|
|
497
|
+
|
452
498
|
def setup_all_neg(size=800)
|
453
499
|
g = Gruff::Line.new(size)
|
454
500
|
g.title = "All Neg Line Graph Test"
|
data/test/pie_test.rb
CHANGED
@@ -70,6 +70,18 @@ class TestGruffPie < GruffTestCase
|
|
70
70
|
g.write("test/output/pie_zero.png")
|
71
71
|
end
|
72
72
|
|
73
|
+
|
74
|
+
def test_pie_graph_one_val
|
75
|
+
g = Gruff::Pie.new
|
76
|
+
g.title = "Pie Graph One Val"
|
77
|
+
|
78
|
+
g.data(:Bert, 53)
|
79
|
+
g.data(:Adam, 29)
|
80
|
+
|
81
|
+
g.write("test/output/pie_one_val.png")
|
82
|
+
end
|
83
|
+
|
84
|
+
|
73
85
|
def test_wide
|
74
86
|
g = setup_basic_graph('800x400')
|
75
87
|
g.title = "Wide Pie"
|
data/test/scene_test.rb
CHANGED
@@ -79,6 +79,12 @@ class TestGruffScene < GruffTestCase
|
|
79
79
|
l = LayerStub.new(File.expand_path("../assets/city_scene", File.dirname(__FILE__)), "sky")
|
80
80
|
l.update Time.mktime(2006, 7, 4, 4, 00) # 04:00, July 4, 2006
|
81
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
|
82
88
|
end
|
83
89
|
|
84
90
|
private
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: gruff
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2006-
|
6
|
+
version: 0.2.3
|
7
|
+
date: 2006-09-21 00:00:00 -07:00
|
8
8
|
summary: Beautiful graphs for one or multiple datasets.
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -32,12 +32,14 @@ files:
|
|
32
32
|
- README
|
33
33
|
- CHANGELOG
|
34
34
|
- MIT-LICENSE
|
35
|
+
- lib/CocoaMagick.rb
|
35
36
|
- lib/gruff
|
36
37
|
- lib/gruff.rb
|
37
38
|
- lib/gruff/area.rb
|
38
39
|
- lib/gruff/bar.rb
|
39
40
|
- lib/gruff/bar_conversion.rb
|
40
41
|
- lib/gruff/base.rb
|
42
|
+
- lib/gruff/deprecated.rb
|
41
43
|
- lib/gruff/line.rb
|
42
44
|
- lib/gruff/net.rb
|
43
45
|
- lib/gruff/photo_bar.rb
|