gruff 0.7.0-java → 0.12.0-java

Sign up to get free protection for your applications and to get access to all the features.
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,39 +0,0 @@
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
@@ -1,23 +0,0 @@
1
-
2
- module Gruff::Base::StackedMixin
3
- # Used by StackedBar and child classes.
4
- #
5
- # tsal: moved from Base 03 FEB 2007
6
- DATA_VALUES_INDEX = Gruff::Base::DATA_VALUES_INDEX
7
- def get_maximum_by_stack
8
- # Get sum of each stack
9
- max_hash = {}
10
- @data.each do |data_set|
11
- data_set[DATA_VALUES_INDEX].each_with_index do |data_point, i|
12
- max_hash[i] = 0.0 unless max_hash[i]
13
- max_hash[i] += data_point.to_f
14
- end
15
- end
16
-
17
- # @maximum_value = 0
18
- max_hash.keys.each do |key|
19
- @maximum_value = max_hash[key] if max_hash[key] > @maximum_value
20
- end
21
- @minimum_value = 0
22
- end
23
- end
@@ -1,152 +0,0 @@
1
- $:.unshift(File.dirname(__FILE__) + '/../lib/')
2
-
3
- RMAGICK_BYPASS_VERSION_TEST = true
4
-
5
- require 'gruff'
6
- require 'fileutils'
7
-
8
- TEST_OUTPUT_DIR = File.dirname(__FILE__) + "/output#{'_java' if RUBY_PLATFORM == 'java'}"
9
- FileUtils.mkdir_p(TEST_OUTPUT_DIR)
10
- FileUtils.rm_f Dir[TEST_OUTPUT_DIR + '/*']
11
-
12
- require 'minitest/autorun'
13
- require 'minitest/reporters'
14
- Minitest::Reporters.use!
15
-
16
- class Gruff::Base
17
- alias :write_org :write
18
-
19
- def write(filename='graph.png')
20
- basefilename = File.basename(filename).split('.')[0..-2].join('.')
21
- extension = filename.slice(/\.[^\.]*$/)
22
- testfilename = File.join(TEST_OUTPUT_DIR, basefilename) + extension
23
- counter = 0
24
- while File.exist?(testfilename)
25
- counter += 1
26
- testfilename = File.join(TEST_OUTPUT_DIR, basefilename) + "-#{counter}#{extension}"
27
- end
28
- write_org(testfilename)
29
- end
30
- end
31
-
32
- class GruffTestCase < Minitest::Test
33
- def setup
34
- srand 42
35
- @datasets = [
36
- [:Jimmy, [25, 36, 86, 39, 25, 31, 79, 88]],
37
- [:Charles, [80, 54, 67, 54, 68, 70, 90, 95]],
38
- [:Julie, [22, 29, 35, 38, 36, 40, 46, 57]],
39
- [:Jane, [95, 95, 95, 90, 85, 80, 88, 100]],
40
- [:Philip, [90, 34, 23, 12, 78, 89, 98, 88]],
41
- [:Arthur, [5, 10, 13, 11, 6, 16, 22, 32]],
42
- ]
43
-
44
- @labels = {
45
- 0 => '5/6',
46
- 1 => '5/15',
47
- 2 => '5/24',
48
- 3 => '5/30',
49
- 4 => '6/4',
50
- 5 => '6/12',
51
- 6 => '6/21',
52
- 7 => '6/28',
53
- }
54
- end
55
-
56
- def setup_single_dataset
57
- @datasets = [
58
- [:Jimmy, [25, 36, 86]]
59
- ]
60
-
61
- @labels = {
62
- 0 => 'You',
63
- 1 => 'Average',
64
- 2 => 'Lifetime'
65
- }
66
- end
67
-
68
- def setup_wide_dataset
69
- @datasets = [
70
- ['Auto', 25],
71
- ['Food', 5],
72
- ['Entertainment', 15]
73
- ]
74
-
75
- @labels = {0 => 'This Month'}
76
- end
77
-
78
- def test_dummy
79
- assert true
80
- end
81
-
82
- protected
83
-
84
- # Generate graphs at several sizes.
85
- #
86
- # Also writes the graph to disk.
87
- #
88
- # graph_sized 'bar_basic' do |g|
89
- # g.data('students', [1, 2, 3, 4])
90
- # end
91
- #
92
- def graph_sized(filename, sizes=['', 400])
93
- class_name = self.class.name.gsub(/^TestGruff/, '')
94
- Array(sizes).each do |size|
95
- g = instance_eval("Gruff::#{class_name}.new #{size}")
96
- g.title = "#{class_name} Graph"
97
- yield g
98
- write_test_file g, "#{filename}_#{size}.png"
99
- end
100
- end
101
-
102
- def write_test_file(graph, filename)
103
- testfilename = [TEST_OUTPUT_DIR, filename].join('/')
104
- basefilename = filename.split('.')[0..-2].join('.')
105
- extension = filename.slice(/\..*$/)
106
- counter = 0
107
- while File.exist? testfilename
108
- counter += 1
109
- testfilename = [TEST_OUTPUT_DIR, basefilename].join('/') + "-#{counter}#{extension}"
110
- end
111
- graph.write(testfilename)
112
- end
113
-
114
- ##
115
- # Example:
116
- #
117
- # setup_basic_graph Gruff::Pie, 400
118
- #
119
- def setup_basic_graph(*args)
120
- klass, size = Gruff::Bar, 400
121
- # Allow args to be klass, size or just klass or just size.
122
- #
123
- # TODO Refactor
124
- case args.length
125
- when 1
126
- case args[0]
127
- when Fixnum
128
- size = args[0]
129
- klass = eval("Gruff::#{self.class.name.gsub(/^TestGruff/, '')}")
130
- when String
131
- size = args[0]
132
- klass = eval("Gruff::#{self.class.name.gsub(/^TestGruff/, '')}")
133
- else
134
- klass = args[0]
135
- end
136
- when 2
137
- klass, size = args[0], args[1]
138
- end
139
-
140
- g = klass.new(size)
141
- g.title = 'My Bar Graph'
142
- g.labels = @labels
143
- g.font = '/Library/Fonts/Verdana.ttf'
144
-
145
-
146
- @datasets.each do |data|
147
- g.data(data[0], data[1])
148
- end
149
- g
150
- end
151
-
152
- end
@@ -1,58 +0,0 @@
1
- #!ruby
2
-
3
- require 'chunky_png'
4
-
5
- class ImageCompare
6
- include ChunkyPNG::Color
7
-
8
- def self.compare(file_name, old_file_name)
9
- name = file_name.chomp('.png')
10
- org_file_name = "#{name}_0.png~"
11
- new_file_name = "#{name}_1.png~"
12
-
13
- return nil unless File.exists? old_file_name
14
- images = [
15
- ChunkyPNG::Image.from_file(old_file_name),
16
- ChunkyPNG::Image.from_file(file_name),
17
- ]
18
-
19
- sizes = images.map(&:width).uniq + images.map(&:height).uniq
20
- if sizes.size != 2
21
- logger.warn "Image size has changed for #{name}: #{sizes}"
22
- return nil
23
- end
24
-
25
- diff = []
26
- images.first.height.times do |y|
27
- images.first.row(y).each_with_index do |pixel, x|
28
- unless pixel == images.last[x, y]
29
- diff << [x, y]
30
- end
31
- end
32
- end
33
-
34
- if diff.empty?
35
- File.delete(org_file_name) if File.exists? org_file_name
36
- File.delete(new_file_name) if File.exists? new_file_name
37
- return false
38
- end
39
-
40
- x, y = diff.map { |xy| xy[0] }, diff.map { |xy| xy[1] }
41
- (1..2).each do |i|
42
- images.each do |image|
43
- image.rect(x.min - i, y.min - i, x.max + i, y.max + i, ChunkyPNG::Color.rgb(255, 0, 0))
44
- end
45
- end
46
- images.first.save(org_file_name)
47
- images.last.save(new_file_name)
48
- true
49
- end
50
- end
51
-
52
- if $0 == __FILE__
53
- unless ARGV.size == 2
54
- puts "Usage: #$0 <image1> <image2>"
55
- exit 1
56
- end
57
- ImageCompare.compare(ARGV[0], ARGV[1])
58
- end
@@ -1,51 +0,0 @@
1
- require File.dirname(__FILE__) + '/gruff_test_case'
2
-
3
- class TestGruffAccumulatorBar < GruffTestCase
4
-
5
- # TODO Delete old output files once when starting tests
6
-
7
- def setup
8
- super
9
- @datasets = [
10
- (1..20).to_a.map { rand(10) }
11
- ]
12
- end
13
-
14
- def test_accumulator
15
- g = Gruff::AccumulatorBar.new 500
16
- g.title = 'Your Savings'
17
- g.hide_legend = true
18
-
19
- # g.font = File.expand_path(File.dirname(__FILE__) + "/../assets/fonts/ATMA____.TTF")
20
-
21
- g.marker_font_size = 18
22
-
23
- g.theme = {
24
- :colors => ['#aedaa9', '#12a702'],
25
- :marker_color => '#dddddd',
26
- :font_color => 'black',
27
- :background_colors => 'white'
28
- # :background_image => File.expand_path(File.dirname(__FILE__) + "/../assets/backgrounds/43things.png")
29
- }
30
-
31
- # Attempt at negative numbers
32
- # g.data 'Savings', (1..20).to_a.map { rand(10) * (rand(2) > 0 ? 1 : -1) }
33
- g.data 'Savings', (1..12).to_a.map { rand(100) }
34
- g.labels = (0..11).to_a.inject({}) {|memo, index| {index => '12-26'}.merge(memo)}
35
-
36
- g.maximum_value = 1000
37
- g.minimum_value = 0
38
-
39
- g.write('test/output/accum_bar.png')
40
- end
41
-
42
- def test_too_many_args
43
- assert_raises(Gruff::IncorrectNumberOfDatasetsException) {
44
- g = Gruff::AccumulatorBar.new
45
- g.data 'First', [1,1,1]
46
- g.data 'Too Many', [1,1,1]
47
- g.write('test/output/_SHOULD_NOT_ACTUALLY_BE_WRITTEN.png')
48
- }
49
- end
50
-
51
- end
@@ -1,134 +0,0 @@
1
- #!/usr/bin/ruby
2
-
3
- require File.dirname(__FILE__) + "/gruff_test_case"
4
-
5
- class TestGruffArea < GruffTestCase
6
-
7
- def setup
8
- super
9
- @datasets = [
10
- [:Jimmy, [25, 36, 86, 39, 25, 31, 79, 88]],
11
- [:Charles, [80, 54, 67, 54, 68, 70, 90, 95]],
12
- [:Julie, [22, 29, 35, 38, 36, 40, 46, 57]],
13
- [:Jane, [95, 95, 95, 90, 85, 80, 88, 100]],
14
- [:Philip, [90, 34, 23, 12, 78, 89, 98, 88]],
15
- ["Arthur", [5, 10, 13, 11, 6, 16, 22, 32]],
16
- ]
17
- @sample_labels = {
18
- 0 => '5/6',
19
- 1 => '5/15',
20
- 2 => '5/24',
21
- 3 => '5/30',
22
- 4 => '6/4',
23
- 5 => '6/12',
24
- 6 => '6/21',
25
- 7 => '6/28',
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