gruff 0.8.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE.md +18 -0
  3. data/.gitignore +3 -0
  4. data/.rubocop.yml +93 -0
  5. data/.rubocop_todo.yml +23 -810
  6. data/.travis.yml +4 -4
  7. data/.yardopts +1 -0
  8. data/CHANGELOG.md +22 -0
  9. data/Gemfile +3 -1
  10. data/README.md +44 -21
  11. data/Rakefile +2 -206
  12. data/docker/Dockerfile +14 -0
  13. data/docker/build.sh +4 -0
  14. data/docker/launch.sh +4 -0
  15. data/gruff.gemspec +11 -8
  16. data/init.rb +2 -0
  17. data/lib/gruff.rb +23 -0
  18. data/lib/gruff/accumulator_bar.rb +6 -6
  19. data/lib/gruff/area.rb +13 -17
  20. data/lib/gruff/bar.rb +58 -41
  21. data/lib/gruff/base.rb +243 -566
  22. data/lib/gruff/bezier.rb +12 -14
  23. data/lib/gruff/bullet.rb +39 -57
  24. data/lib/gruff/dot.rb +25 -59
  25. data/lib/gruff/{bar_conversion.rb → helper/bar_conversion.rb} +13 -12
  26. data/lib/gruff/helper/bar_value_label_mixin.rb +30 -0
  27. data/lib/gruff/{stacked_mixin.rb → helper/stacked_mixin.rb} +7 -6
  28. data/lib/gruff/line.rb +95 -177
  29. data/lib/gruff/mini/bar.rb +6 -7
  30. data/lib/gruff/mini/legend.rb +16 -32
  31. data/lib/gruff/mini/pie.rb +6 -7
  32. data/lib/gruff/mini/side_bar.rb +4 -5
  33. data/lib/gruff/net.rb +37 -65
  34. data/lib/gruff/patch/rmagick.rb +33 -0
  35. data/lib/gruff/patch/string.rb +8 -0
  36. data/lib/gruff/photo_bar.rb +19 -19
  37. data/lib/gruff/pie.rb +22 -73
  38. data/lib/gruff/renderer/bezier.rb +21 -0
  39. data/lib/gruff/renderer/circle.rb +21 -0
  40. data/lib/gruff/renderer/dash_line.rb +22 -0
  41. data/lib/gruff/renderer/dot.rb +39 -0
  42. data/lib/gruff/renderer/ellipse.rb +21 -0
  43. data/lib/gruff/renderer/line.rb +34 -0
  44. data/lib/gruff/renderer/polygon.rb +23 -0
  45. data/lib/gruff/renderer/polyline.rb +21 -0
  46. data/lib/gruff/renderer/rectangle.rb +19 -0
  47. data/lib/gruff/renderer/renderer.rb +127 -0
  48. data/lib/gruff/renderer/text.rb +42 -0
  49. data/lib/gruff/scatter.rb +85 -156
  50. data/lib/gruff/scene.rb +22 -30
  51. data/lib/gruff/side_bar.rb +62 -58
  52. data/lib/gruff/side_stacked_bar.rb +47 -43
  53. data/lib/gruff/spider.rb +19 -36
  54. data/lib/gruff/stacked_area.rb +17 -21
  55. data/lib/gruff/stacked_bar.rb +50 -24
  56. data/lib/gruff/store/base_data.rb +34 -0
  57. data/lib/gruff/store/custom_data.rb +34 -0
  58. data/lib/gruff/store/store.rb +80 -0
  59. data/lib/gruff/store/xy_data.rb +55 -0
  60. data/lib/gruff/themes.rb +3 -3
  61. data/lib/gruff/version.rb +3 -1
  62. metadata +41 -30
  63. data/Manifest.txt +0 -81
  64. data/assets/bubble.png +0 -0
  65. data/assets/city_scene/background/0000.png +0 -0
  66. data/assets/city_scene/background/0600.png +0 -0
  67. data/assets/city_scene/background/2000.png +0 -0
  68. data/assets/city_scene/clouds/cloudy.png +0 -0
  69. data/assets/city_scene/clouds/partly_cloudy.png +0 -0
  70. data/assets/city_scene/clouds/stormy.png +0 -0
  71. data/assets/city_scene/grass/default.png +0 -0
  72. data/assets/city_scene/haze/true.png +0 -0
  73. data/assets/city_scene/number_sample/1.png +0 -0
  74. data/assets/city_scene/number_sample/2.png +0 -0
  75. data/assets/city_scene/number_sample/default.png +0 -0
  76. data/assets/city_scene/sky/0000.png +0 -0
  77. data/assets/city_scene/sky/0200.png +0 -0
  78. data/assets/city_scene/sky/0400.png +0 -0
  79. data/assets/city_scene/sky/0600.png +0 -0
  80. data/assets/city_scene/sky/0800.png +0 -0
  81. data/assets/city_scene/sky/1000.png +0 -0
  82. data/assets/city_scene/sky/1200.png +0 -0
  83. data/assets/city_scene/sky/1400.png +0 -0
  84. data/assets/city_scene/sky/1500.png +0 -0
  85. data/assets/city_scene/sky/1700.png +0 -0
  86. data/assets/city_scene/sky/2000.png +0 -0
  87. data/assets/pc306715.jpg +0 -0
  88. data/lib/gruff/deprecated.rb +0 -38
@@ -1,5 +1,7 @@
1
- require File.dirname(__FILE__) + '/base'
2
- require File.dirname(__FILE__) + '/stacked_mixin'
1
+ # frozen_string_literal: true
2
+
3
+ require 'gruff/base'
4
+ require 'gruff/helper/stacked_mixin'
3
5
 
4
6
  class Gruff::StackedArea < Gruff::Base
5
7
  include StackedMixin
@@ -9,24 +11,21 @@ class Gruff::StackedArea < Gruff::Base
9
11
  get_maximum_by_stack
10
12
  super
11
13
 
12
- return unless @has_data
14
+ return unless data_given?
13
15
 
14
- @x_increment = @graph_width / (@column_count - 1).to_f
15
- @d = @d.stroke 'transparent'
16
+ x_increment = @graph_width / (column_count - 1).to_f
16
17
 
17
- height = Array.new(@column_count, 0)
18
+ height = Array.new(column_count, 0)
18
19
 
19
20
  data_points = nil
20
21
  iterator = last_series_goes_on_bottom ? :reverse_each : :each
21
- @norm_data.send(iterator) do |data_row|
22
+ store.norm_data.public_send(iterator) do |data_row|
22
23
  prev_data_points = data_points
23
- data_points = Array.new
24
-
25
- @d = @d.fill data_row[DATA_COLOR_INDEX]
24
+ data_points = []
26
25
 
27
- data_row[DATA_VALUES_INDEX].each_with_index do |data_point, index|
26
+ data_row.points.each_with_index do |data_point, index|
28
27
  # Use incremented x and scaled y
29
- new_x = @graph_left + (@x_increment * index)
28
+ new_x = @graph_left + (x_increment * index)
30
29
  new_y = @graph_top + (@graph_height - data_point * @graph_height - height[index])
31
30
 
32
31
  height[index] += (data_point * @graph_height)
@@ -37,27 +36,24 @@ class Gruff::StackedArea < Gruff::Base
37
36
  draw_label(new_x, index)
38
37
  end
39
38
 
39
+ poly_points = data_points.dup
40
40
  if prev_data_points
41
- poly_points = data_points.dup
42
41
  (prev_data_points.length / 2 - 1).downto(0) do |i|
43
42
  poly_points << prev_data_points[2 * i]
44
43
  poly_points << prev_data_points[2 * i + 1]
45
44
  end
46
- poly_points << data_points[0]
47
- poly_points << data_points[1]
48
45
  else
49
- poly_points = data_points.dup
50
46
  poly_points << @graph_right
51
47
  poly_points << @graph_bottom - 1
52
48
  poly_points << @graph_left
53
49
  poly_points << @graph_bottom - 1
54
- poly_points << data_points[0]
55
- poly_points << data_points[1]
56
50
  end
57
- @d = @d.polyline(*poly_points)
51
+ poly_points << data_points[0]
52
+ poly_points << data_points[1]
53
+
54
+ Gruff::Renderer::Polygon.new(color: data_row.color).render(poly_points)
58
55
  end
59
56
 
60
- @d.draw(@base_image)
57
+ Gruff::Renderer.finish
61
58
  end
62
-
63
59
  end
@@ -1,59 +1,85 @@
1
- require File.dirname(__FILE__) + '/base'
2
- require File.dirname(__FILE__) + '/stacked_mixin'
1
+ # frozen_string_literal: true
2
+
3
+ require 'gruff/base'
4
+ require 'gruff/helper/stacked_mixin'
5
+ require 'gruff/helper/bar_value_label_mixin'
3
6
 
4
7
  class Gruff::StackedBar < Gruff::Base
5
8
  include StackedMixin
9
+ include BarValueLabelMixin
6
10
 
7
- # Spacing factor applied between bars
11
+ # Spacing factor applied between bars.
8
12
  attr_accessor :bar_spacing
9
13
 
10
- # Number of pixels between bar segments
14
+ # Number of pixels between bar segments.
11
15
  attr_accessor :segment_spacing
12
16
 
17
+ # Set the number output format for labels using sprintf.
18
+ # Default is +"%.2f"+.
19
+ attr_accessor :label_formatting
20
+
21
+ # Output the values for the bars on a bar graph.
22
+ # Default is +false+.
23
+ attr_accessor :show_labels_for_bar_values
24
+
25
+ def initialize_ivars
26
+ super
27
+ @label_formatting = nil
28
+ @show_labels_for_bar_values = false
29
+ end
30
+ private :initialize_ivars
31
+
13
32
  # Draws a bar graph, but multiple sets are stacked on top of each other.
14
33
  def draw
15
34
  get_maximum_by_stack
16
35
  super
17
- return unless @has_data
36
+ return unless data_given?
18
37
 
19
38
  # Setup spacing.
20
39
  #
21
40
  # Columns sit stacked.
22
41
  @bar_spacing ||= 0.9
23
- @segment_spacing ||= 1
24
- @bar_width = @graph_width / @column_count.to_f
25
- padding = (@bar_width * (1 - @bar_spacing)) / 2
26
-
27
- @d = @d.stroke_opacity 0.0
42
+ @segment_spacing ||= 2
28
43
 
29
- height = Array.new(@column_count, 0)
44
+ bar_width = @graph_width / column_count.to_f
45
+ padding = (bar_width * (1 - @bar_spacing)) / 2
30
46
 
31
- @norm_data.each_with_index do |data_row, row_index|
32
- data_row[DATA_VALUES_INDEX].each_with_index do |data_point, point_index|
33
- @d = @d.fill data_row[DATA_COLOR_INDEX]
34
-
35
- # Calculate center based on bar_width and current row
36
- label_center = @graph_left + (@bar_width * point_index) + (@bar_width * @bar_spacing / 2.0)
37
- draw_label(label_center, point_index)
47
+ height = Array.new(column_count, 0)
48
+ bar_value_label = BarValueLabel.new(column_count, bar_width)
38
49
 
50
+ store.norm_data.each_with_index do |data_row, row_index|
51
+ data_row.points.each_with_index do |data_point, point_index|
39
52
  next if data_point == 0
40
53
 
41
54
  # Use incremented x and scaled y
42
- left_x = @graph_left + (@bar_width * point_index) + padding
55
+ left_x = @graph_left + (bar_width * point_index) + padding
43
56
  left_y = @graph_top + (@graph_height -
44
57
  data_point * @graph_height -
45
58
  height[point_index]) + @segment_spacing
46
- right_x = left_x + @bar_width * @bar_spacing
47
- right_y = @graph_top + @graph_height - height[point_index] - @segment_spacing
59
+ right_x = left_x + bar_width * @bar_spacing
60
+ right_y = @graph_top + @graph_height - height[point_index]
48
61
 
49
62
  # update the total height of the current stacked bar
50
63
  height[point_index] += (data_point * @graph_height)
51
64
 
52
- @d = @d.rectangle(left_x, left_y, right_x, right_y)
65
+ rect_renderer = Gruff::Renderer::Rectangle.new(color: data_row.color)
66
+ rect_renderer.render(left_x, left_y, right_x, right_y)
67
+
68
+ # Calculate center based on bar_width and current row
69
+ label_center = left_x + bar_width * @bar_spacing / 2.0
70
+ draw_label(label_center, point_index)
71
+
72
+ bar_value_label.coordinates[point_index] = [left_x, left_y, right_x, right_y]
73
+ bar_value_label.values[point_index] += store.data[row_index].points[point_index]
53
74
  end
54
75
  end
55
76
 
56
- @d.draw(@base_image)
57
- end
77
+ if @show_labels_for_bar_values
78
+ bar_value_label.prepare_rendering(@label_formatting) do |x, y, text|
79
+ draw_value_label(x, y, text, true)
80
+ end
81
+ end
58
82
 
83
+ Gruff::Renderer.finish
84
+ end
59
85
  end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gruff
4
+ # @private
5
+ class Store
6
+ class BaseData < Struct.new(:label, :points, :color)
7
+ def initialize(label, points, color)
8
+ self.label = label
9
+ self.points = Array(points)
10
+ self.color = color
11
+ end
12
+
13
+ def columns
14
+ points.length
15
+ end
16
+
17
+ def min
18
+ points.compact.min
19
+ end
20
+
21
+ def max
22
+ points.compact.max
23
+ end
24
+
25
+ def normalize(args = {})
26
+ norm_points = points.map do |point|
27
+ point.nil? ? nil : (point.to_f - args[:minimum].to_f) / args[:spread]
28
+ end
29
+
30
+ self.class.new(label, norm_points, color)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gruff
4
+ class Store
5
+ class CustomData < Struct.new(:label, :points, :color, :custom)
6
+ def initialize(label, points, color, custom = nil)
7
+ self.label = label
8
+ self.points = Array(points)
9
+ self.color = color
10
+ self.custom = custom
11
+ end
12
+
13
+ def columns
14
+ points.length
15
+ end
16
+
17
+ def min
18
+ points.compact.min
19
+ end
20
+
21
+ def max
22
+ points.compact.max
23
+ end
24
+
25
+ def normalize(args = {})
26
+ norm_points = points.map do |point|
27
+ point.nil? ? nil : (point.to_f - args[:minimum].to_f) / args[:spread]
28
+ end
29
+
30
+ self.class.new(label, norm_points, color, custom)
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gruff
4
+ class Store
5
+ attr_reader :data, :norm_data
6
+
7
+ def initialize(data_class)
8
+ @data_class = data_class
9
+ @data = []
10
+ @norm_data = []
11
+ @normalized = false
12
+ end
13
+
14
+ def add(*args)
15
+ @data << @data_class.new(*args)
16
+ end
17
+
18
+ def normalize(args = {})
19
+ unless @normalized
20
+ @data.each do |data_row|
21
+ @norm_data << data_row.normalize(args)
22
+ end
23
+
24
+ @normalized = true
25
+ end
26
+ end
27
+
28
+ def empty?
29
+ @data.empty?
30
+ end
31
+
32
+ def length
33
+ @data.length
34
+ end
35
+
36
+ def columns
37
+ @columns ||= @data.empty? ? 0 : @data.map(&:columns).max
38
+ end
39
+
40
+ def min
41
+ @min ||= @data.map(&:min).compact.min
42
+ end
43
+ alias min_y min
44
+
45
+ def max
46
+ @max ||= @data.map(&:max).compact.max
47
+ end
48
+ alias max_y max
49
+
50
+ def min_x
51
+ @min_x ||= @data.map(&:min_x).compact.min
52
+ end
53
+
54
+ def max_x
55
+ @max_x ||= @data.map(&:max_x).compact.max
56
+ end
57
+
58
+ def sort_data!
59
+ @data = @data.sort_by { |a| -a.points.reduce(0) { |acc, elem| acc + elem.to_f } }
60
+ end
61
+
62
+ def sort_norm_data!
63
+ @norm_data = @norm_data.sort_by { |a| -a.points.reduce(0) { |acc, elem| acc + elem.to_f } }
64
+ end
65
+
66
+ def reverse!
67
+ @data.reverse!
68
+ end
69
+
70
+ def set_colors!(colors)
71
+ index = 0
72
+ @data.each do |data_row|
73
+ data_row.color ||= begin
74
+ index = (index + 1) % colors.length
75
+ colors[index - 1]
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Gruff
4
+ class Store
5
+ class XYData < Struct.new(:label, :y_points, :color, :x_points)
6
+ def initialize(label, y_points, color, x_points = nil)
7
+ self.label = label
8
+ self.y_points = Array(y_points)
9
+ self.color = color
10
+ self.x_points = Array(x_points) if x_points
11
+ end
12
+
13
+ def x_points
14
+ self[:x_points] || Array.new(y_points.length)
15
+ end
16
+
17
+ def coordinates
18
+ x_points.zip(y_points)
19
+ end
20
+
21
+ def columns
22
+ y_points.length
23
+ end
24
+
25
+ def min
26
+ y_points.compact.min
27
+ end
28
+ alias min_y min
29
+
30
+ def max
31
+ y_points.compact.max
32
+ end
33
+ alias max_y max
34
+
35
+ def min_x
36
+ x_points.compact.min
37
+ end
38
+
39
+ def max_x
40
+ x_points.compact.max
41
+ end
42
+
43
+ def normalize(args = {})
44
+ norm_x_points = x_points.map do |x|
45
+ x.nil? ? nil : (x.to_f - args[:minimum_x].to_f) / args[:spread_x]
46
+ end
47
+ norm_y_points = y_points.map do |y|
48
+ y.nil? ? nil : (y.to_f - args[:minimum_y].to_f) / args[:spread_y]
49
+ end
50
+
51
+ self.class.new(label, norm_y_points, color, norm_x_points)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,6 +1,7 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gruff
2
4
  module Themes
3
-
4
5
  # A color scheme similar to the popular presentation software.
5
6
  KEYNOTE = {
6
7
  colors: [
@@ -90,12 +91,11 @@ module Gruff
90
91
  '#686868',
91
92
  '#989898',
92
93
  '#c8c8c8',
93
- '#e8e8e8',
94
+ '#e8e8e8'
94
95
  ],
95
96
  marker_color: '#aea9a9', # Grey
96
97
  font_color: 'black',
97
98
  background_colors: 'white'
98
99
  }
99
-
100
100
  end
101
101
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Gruff
2
- VERSION = '0.8.0'
4
+ VERSION = '0.9.0'
3
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: gruff
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Geoffrey Grosenbach
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2020-04-05 00:00:00.000000000 Z
12
+ date: 2020-05-27 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rmagick
@@ -67,6 +67,20 @@ dependencies:
67
67
  - - ">="
68
68
  - !ruby/object:Gem::Version
69
69
  version: '0'
70
+ - !ruby/object:Gem::Dependency
71
+ name: yard
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - "~>"
75
+ - !ruby/object:Gem::Version
76
+ version: 0.9.25
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - "~>"
82
+ - !ruby/object:Gem::Version
83
+ version: 0.9.25
70
84
  description: Beautiful graphs for one or multiple datasets. Can be used on websites
71
85
  or in documents.
72
86
  email: boss@topfunky.com
@@ -75,63 +89,57 @@ extensions: []
75
89
  extra_rdoc_files: []
76
90
  files:
77
91
  - ".editorconfig"
92
+ - ".github/ISSUE_TEMPLATE.md"
78
93
  - ".gitignore"
79
94
  - ".rubocop.yml"
80
95
  - ".rubocop_todo.yml"
81
96
  - ".travis.yml"
97
+ - ".yardopts"
82
98
  - CHANGELOG.md
83
99
  - Gemfile
84
100
  - MIT-LICENSE
85
- - Manifest.txt
86
101
  - README.md
87
102
  - Rakefile
88
- - assets/bubble.png
89
- - assets/city_scene/background/0000.png
90
- - assets/city_scene/background/0600.png
91
- - assets/city_scene/background/2000.png
92
- - assets/city_scene/clouds/cloudy.png
93
- - assets/city_scene/clouds/partly_cloudy.png
94
- - assets/city_scene/clouds/stormy.png
95
- - assets/city_scene/grass/default.png
96
- - assets/city_scene/haze/true.png
97
- - assets/city_scene/number_sample/1.png
98
- - assets/city_scene/number_sample/2.png
99
- - assets/city_scene/number_sample/default.png
100
- - assets/city_scene/sky/0000.png
101
- - assets/city_scene/sky/0200.png
102
- - assets/city_scene/sky/0400.png
103
- - assets/city_scene/sky/0600.png
104
- - assets/city_scene/sky/0800.png
105
- - assets/city_scene/sky/1000.png
106
- - assets/city_scene/sky/1200.png
107
- - assets/city_scene/sky/1400.png
108
- - assets/city_scene/sky/1500.png
109
- - assets/city_scene/sky/1700.png
110
- - assets/city_scene/sky/2000.png
111
- - assets/pc306715.jpg
112
103
  - assets/plastik/blue.png
113
104
  - assets/plastik/green.png
114
105
  - assets/plastik/red.png
106
+ - docker/Dockerfile
107
+ - docker/build.sh
108
+ - docker/launch.sh
115
109
  - gruff.gemspec
116
110
  - init.rb
117
111
  - lib/gruff.rb
118
112
  - lib/gruff/accumulator_bar.rb
119
113
  - lib/gruff/area.rb
120
114
  - lib/gruff/bar.rb
121
- - lib/gruff/bar_conversion.rb
122
115
  - lib/gruff/base.rb
123
116
  - lib/gruff/bezier.rb
124
117
  - lib/gruff/bullet.rb
125
- - lib/gruff/deprecated.rb
126
118
  - lib/gruff/dot.rb
119
+ - lib/gruff/helper/bar_conversion.rb
120
+ - lib/gruff/helper/bar_value_label_mixin.rb
121
+ - lib/gruff/helper/stacked_mixin.rb
127
122
  - lib/gruff/line.rb
128
123
  - lib/gruff/mini/bar.rb
129
124
  - lib/gruff/mini/legend.rb
130
125
  - lib/gruff/mini/pie.rb
131
126
  - lib/gruff/mini/side_bar.rb
132
127
  - lib/gruff/net.rb
128
+ - lib/gruff/patch/rmagick.rb
129
+ - lib/gruff/patch/string.rb
133
130
  - lib/gruff/photo_bar.rb
134
131
  - lib/gruff/pie.rb
132
+ - lib/gruff/renderer/bezier.rb
133
+ - lib/gruff/renderer/circle.rb
134
+ - lib/gruff/renderer/dash_line.rb
135
+ - lib/gruff/renderer/dot.rb
136
+ - lib/gruff/renderer/ellipse.rb
137
+ - lib/gruff/renderer/line.rb
138
+ - lib/gruff/renderer/polygon.rb
139
+ - lib/gruff/renderer/polyline.rb
140
+ - lib/gruff/renderer/rectangle.rb
141
+ - lib/gruff/renderer/renderer.rb
142
+ - lib/gruff/renderer/text.rb
135
143
  - lib/gruff/scatter.rb
136
144
  - lib/gruff/scene.rb
137
145
  - lib/gruff/side_bar.rb
@@ -139,7 +147,10 @@ files:
139
147
  - lib/gruff/spider.rb
140
148
  - lib/gruff/stacked_area.rb
141
149
  - lib/gruff/stacked_bar.rb
142
- - lib/gruff/stacked_mixin.rb
150
+ - lib/gruff/store/base_data.rb
151
+ - lib/gruff/store/custom_data.rb
152
+ - lib/gruff/store/store.rb
153
+ - lib/gruff/store/xy_data.rb
143
154
  - lib/gruff/themes.rb
144
155
  - lib/gruff/version.rb
145
156
  - rails_generators/gruff/gruff_generator.rb