gruff 0.8.0 → 0.9.0

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 (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