gruff 0.26.0-java → 0.27.0-java

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 (100) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/report.yml +1 -1
  3. data/.github/workflows/ci.yml +37 -0
  4. data/.rubocop.yml +3 -0
  5. data/CHANGELOG.md +18 -1
  6. data/Gemfile +5 -0
  7. data/README.md +7 -1
  8. data/gruff.gemspec +1 -1
  9. data/lib/gruff/accumulator_bar.rb +3 -1
  10. data/lib/gruff/area.rb +5 -2
  11. data/lib/gruff/bar.rb +18 -9
  12. data/lib/gruff/base.rb +193 -68
  13. data/lib/gruff/bezier.rb +6 -3
  14. data/lib/gruff/box.rb +40 -16
  15. data/lib/gruff/bubble.rb +9 -2
  16. data/lib/gruff/bullet.rb +8 -1
  17. data/lib/gruff/candlestick.rb +30 -8
  18. data/lib/gruff/dot.rb +13 -3
  19. data/lib/gruff/font.rb +12 -4
  20. data/lib/gruff/helper/bar_conversion.rb +12 -1
  21. data/lib/gruff/helper/bar_mixin.rb +19 -1
  22. data/lib/gruff/helper/bar_value_label.rb +22 -4
  23. data/lib/gruff/helper/stacked_mixin.rb +21 -1
  24. data/lib/gruff/histogram.rb +14 -5
  25. data/lib/gruff/line.rb +31 -12
  26. data/lib/gruff/mini/bar.rb +2 -2
  27. data/lib/gruff/mini/legend.rb +10 -1
  28. data/lib/gruff/mini/pie.rb +2 -2
  29. data/lib/gruff/mini/side_bar.rb +2 -2
  30. data/lib/gruff/net.rb +12 -7
  31. data/lib/gruff/patch/rmagick.rb +2 -0
  32. data/lib/gruff/patch/string.rb +1 -1
  33. data/lib/gruff/pie.rb +46 -11
  34. data/lib/gruff/renderer/bezier.rb +7 -0
  35. data/lib/gruff/renderer/circle.rb +11 -0
  36. data/lib/gruff/renderer/dash_line.rb +11 -0
  37. data/lib/gruff/renderer/dot.rb +11 -0
  38. data/lib/gruff/renderer/ellipse.rb +12 -0
  39. data/lib/gruff/renderer/line.rb +10 -0
  40. data/lib/gruff/renderer/polygon.rb +6 -0
  41. data/lib/gruff/renderer/polyline.rb +8 -0
  42. data/lib/gruff/renderer/rectangle.rb +11 -0
  43. data/lib/gruff/renderer/renderer.rb +16 -5
  44. data/lib/gruff/renderer/text.rb +19 -2
  45. data/lib/gruff/scatter.rb +16 -8
  46. data/lib/gruff/side_bar.rb +19 -10
  47. data/lib/gruff/side_stacked_bar.rb +15 -11
  48. data/lib/gruff/spider.rb +9 -2
  49. data/lib/gruff/stacked_area.rb +6 -1
  50. data/lib/gruff/stacked_bar.rb +16 -10
  51. data/lib/gruff/store/basic_data.rb +36 -2
  52. data/lib/gruff/store/store.rb +16 -3
  53. data/lib/gruff/store/xy_data.rb +32 -2
  54. data/lib/gruff/store/xy_pointsizes_data.rb +36 -3
  55. data/lib/gruff/themes.rb +2 -0
  56. data/lib/gruff/version.rb +3 -1
  57. data/lib/gruff.rb +3 -1
  58. data/sig/generated/gruff/accumulator_bar.rbs +19 -0
  59. data/sig/generated/gruff/area.rbs +27 -0
  60. data/sig/generated/gruff/bar.rbs +74 -0
  61. data/sig/generated/gruff/base.rbs +672 -0
  62. data/sig/generated/gruff/bezier.rbs +24 -0
  63. data/sig/generated/gruff/box.rbs +88 -0
  64. data/sig/generated/gruff/bubble.rbs +69 -0
  65. data/sig/generated/gruff/bullet.rbs +30 -0
  66. data/sig/generated/gruff/candlestick.rbs +79 -0
  67. data/sig/generated/gruff/dot.rbs +44 -0
  68. data/sig/generated/gruff/font.rbs +35 -0
  69. data/sig/generated/gruff/helper/bar_conversion.rbs +27 -0
  70. data/sig/generated/gruff/helper/bar_mixin.rbs +22 -0
  71. data/sig/generated/gruff/helper/bar_value_label.rbs +41 -0
  72. data/sig/generated/gruff/helper/stacked_mixin.rbs +27 -0
  73. data/sig/generated/gruff/histogram.rbs +42 -0
  74. data/sig/generated/gruff/line.rbs +165 -0
  75. data/sig/generated/gruff/net.rbs +52 -0
  76. data/sig/generated/gruff/pie.rbs +131 -0
  77. data/sig/generated/gruff/renderer/bezier.rbs +15 -0
  78. data/sig/generated/gruff/renderer/circle.rbs +19 -0
  79. data/sig/generated/gruff/renderer/dash_line.rbs +19 -0
  80. data/sig/generated/gruff/renderer/dot.rbs +27 -0
  81. data/sig/generated/gruff/renderer/ellipse.rbs +20 -0
  82. data/sig/generated/gruff/renderer/line.rbs +24 -0
  83. data/sig/generated/gruff/renderer/polyline.rbs +16 -0
  84. data/sig/generated/gruff/renderer/rectangle.rbs +19 -0
  85. data/sig/generated/gruff/renderer/renderer.rbs +43 -0
  86. data/sig/generated/gruff/renderer/text.rbs +38 -0
  87. data/sig/generated/gruff/scatter.rbs +112 -0
  88. data/sig/generated/gruff/side_bar.rbs +78 -0
  89. data/sig/generated/gruff/side_stacked_bar.rbs +52 -0
  90. data/sig/generated/gruff/spider.rbs +50 -0
  91. data/sig/generated/gruff/stacked_area.rbs +25 -0
  92. data/sig/generated/gruff/stacked_bar.rbs +56 -0
  93. data/sig/generated/gruff/store/basic_data.rbs +48 -0
  94. data/sig/generated/gruff/store/store.rbs +53 -0
  95. data/sig/generated/gruff/store/xy_data.rbs +58 -0
  96. data/sig/generated/gruff/store/xy_pointsizes_data.rbs +61 -0
  97. data/sig/generated/gruff/themes.rbs +24 -0
  98. data/sig/generated/gruff/version.rbs +5 -0
  99. data/sig/generated/gruff.rbs +20 -0
  100. metadata +51 -6
@@ -1,10 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  module Gruff
4
6
  # @private
5
7
  class Store
6
- attr_reader :data
8
+ attr_reader :data #: Array[Gruff::Store::BasicData | Gruff::Store::XYData | Gruff::Store::XYPointsizeData]
7
9
 
10
+ # @rbs return: void
8
11
  def initialize(data_class)
9
12
  @data_class = data_class
10
13
  @data = []
@@ -14,40 +17,48 @@ module Gruff
14
17
  @data << @data_class.new(*args)
15
18
  end
16
19
 
20
+ # @rbs return: Array[Gruff::Store::BasicData | Gruff::Store::XYData | Gruff::Store::XYPointsizeData]
17
21
  def norm_data
18
22
  @norm_data || []
19
23
  end
20
24
 
21
25
  def normalize(**keywords)
22
- @norm_data = @data.map { |data_row| data_row.normalize(**keywords) }
26
+ @norm_data = @data.map { |data_row| data_row.normalize(**keywords) } # steep:ignore
23
27
  end
24
28
 
29
+ # @rbs return: bool
25
30
  def empty?
26
31
  @data.all?(&:empty?)
27
32
  end
28
33
 
34
+ # @rbs return: Integer
29
35
  def length
30
36
  @data.length
31
37
  end
32
38
 
39
+ # @rbs return: Integer
33
40
  def columns
34
41
  @columns ||= @data.empty? ? 0 : @data.map(&:columns).max
35
42
  end
36
43
 
44
+ # @rbs return: Float | Integer
37
45
  def min
38
46
  @min ||= @data.filter_map(&:min).min
39
47
  end
40
48
  alias min_y min
41
49
 
50
+ # @rbs return: Float | Integer
42
51
  def max
43
52
  @max ||= @data.filter_map(&:max).max
44
53
  end
45
54
  alias max_y max
46
55
 
56
+ # @rbs return: Float | Integer
47
57
  def min_x
48
58
  @min_x ||= @data.filter_map(&:min_x).min
49
59
  end
50
60
 
61
+ # @rbs return: Float | Integer
51
62
  def max_x
52
63
  @max_x ||= @data.filter_map(&:max_x).max
53
64
  end
@@ -60,14 +71,16 @@ module Gruff
60
71
  @norm_data = @norm_data.sort_by { |a| -a.points.sum(&:to_f) }
61
72
  end
62
73
 
74
+ # @rbs return: Array[Gruff::Store::BasicData | Gruff::Store::XYData | Gruff::Store::XYPointsizeData]
63
75
  def reverse!
64
76
  @data.reverse!
65
77
  end
66
78
 
79
+ # @rbs colors: Array[String]
67
80
  def change_colors(colors)
68
81
  index = 0
69
82
  @data.each do |data_row|
70
- data_row.color ||= begin
83
+ data_row.color ||= begin # steep:ignore
71
84
  index = (index + 1) % colors.length
72
85
  colors[index - 1]
73
86
  end
@@ -1,49 +1,79 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  module Gruff
4
6
  class Store
5
7
  # @private
6
- class XYData < Struct.new(:label, :x_points, :y_points, :color)
8
+ class XYData
9
+ attr_accessor :label #: String
10
+ attr_accessor :x_points #: Array[nil | Float | Integer]
11
+ attr_accessor :y_points #: Array[nil | Float | Integer]
12
+ attr_accessor :color #: String
13
+
14
+ # @rbs label: String | Symbol
15
+ # @rbs x_points: Array[nil | Float | Integer] | nil
16
+ # @rbs y_points: Array[nil | Float | Integer] | nil
17
+ # @rbs color: String
7
18
  def initialize(label, x_points, y_points, color)
8
19
  y_points = Array(y_points)
9
20
  x_points = x_points ? Array(x_points) : Array.new(y_points.length)
10
21
  raise ArgumentError, 'x_points.length != y_points.length!' if x_points.length != y_points.length
11
22
 
12
- super(label.to_s, x_points, y_points, color)
23
+ @label = label.to_s
24
+ @x_points = x_points
25
+ @y_points = y_points
26
+ @color = color
13
27
  end
14
28
 
15
29
  alias points y_points
16
30
 
31
+ # @rbs return: Array[[Float | Integer | nil, Float | Integer | nil]]
17
32
  def coordinates
18
33
  x_points.zip(y_points)
19
34
  end
20
35
 
36
+ def coordinate_and_pointsizes
37
+ raise NotImplementedError, 'This method is not implemented for XYData'
38
+ end
39
+
40
+ # @rbs return: bool
21
41
  def empty?
22
42
  y_points.empty?
23
43
  end
24
44
 
45
+ # @rbs return: Integer
25
46
  def columns
26
47
  y_points.length
27
48
  end
28
49
 
50
+ # @rbs return: Float | Integer
29
51
  def min
30
52
  y_points.compact.min
31
53
  end
32
54
  alias min_y min
33
55
 
56
+ # @rbs return: Float | Integer
34
57
  def max
35
58
  y_points.compact.max
36
59
  end
37
60
  alias max_y max
38
61
 
62
+ # @rbs return: Float | Integer
39
63
  def min_x
40
64
  x_points.compact.min
41
65
  end
42
66
 
67
+ # @rbs return: Float | Integer
43
68
  def max_x
44
69
  x_points.compact.max
45
70
  end
46
71
 
72
+ # @rbs minimum_x: Float | Integer
73
+ # @rbs minimum_y: Float | Integer
74
+ # @rbs spread_x: Float | Integer
75
+ # @rbs spread_y: Float | Integer
76
+ # @rbs return: Gruff::Store::XYData
47
77
  def normalize(minimum_x:, minimum_y:, spread_x:, spread_y:)
48
78
  norm_x_points = x_points.map do |x|
49
79
  x.nil? ? nil : (x.to_f - minimum_x.to_f) / spread_x
@@ -1,50 +1,83 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  module Gruff
4
6
  class Store
5
7
  # @private
6
- class XYPointsizeData < Struct.new(:label, :x_points, :y_points, :point_sizes, :color)
8
+ class XYPointsizeData
9
+ attr_accessor :label #: String
10
+ attr_accessor :x_points #: Array[nil | Float | Integer]
11
+ attr_accessor :y_points #: Array[nil | Float | Integer]
12
+ attr_accessor :point_sizes #: Array[nil | Float | Integer]
13
+ attr_accessor :color #: String
14
+
15
+ # @rbs label: String | Symbol
16
+ # @rbs x_points: Array[nil | Float | Integer] | nil
17
+ # @rbs y_points: Array[nil | Float | Integer] | nil
18
+ # @rbs point_sizes: Array[nil | Float | Integer]
19
+ # @rbs color: String
7
20
  def initialize(label, x_points, y_points, point_sizes, color)
8
21
  y_points = Array(y_points)
9
22
  x_points = x_points ? Array(x_points) : Array.new(y_points.length)
10
23
  raise ArgumentError, 'x_points.length != y_points.length!' if x_points.length != y_points.length
11
24
  raise ArgumentError, 'x_points.length != point_sizes.length!' if x_points.length != point_sizes.length
12
25
 
13
- super(label.to_s, x_points, y_points, point_sizes, color)
26
+ @label = label.to_s
27
+ @x_points = x_points
28
+ @y_points = y_points
29
+ @point_sizes = point_sizes
30
+ @color = color
14
31
  end
15
32
 
16
33
  alias points y_points
17
34
 
35
+ def coordinates
36
+ raise NotImplementedError, 'This method is not implemented for XYPointsizeData'
37
+ end
38
+
39
+ # @rbs return: Array[[Float | Integer | nil, Float | Integer | nil, Float | Integer]]
18
40
  def coordinate_and_pointsizes
19
- x_points.zip(y_points, point_sizes)
41
+ x_points.zip(y_points, point_sizes) #: Array[[Float | Integer | nil, Float | Integer | nil, Float | Integer]]
20
42
  end
21
43
 
44
+ # @rbs return: bool
22
45
  def empty?
23
46
  y_points.empty?
24
47
  end
25
48
 
49
+ # @rbs return: Integer
26
50
  def columns
27
51
  y_points.length
28
52
  end
29
53
 
54
+ # @rbs return: Float | Integer
30
55
  def min
31
56
  y_points.compact.min
32
57
  end
33
58
  alias min_y min
34
59
 
60
+ # @rbs return: Float | Integer
35
61
  def max
36
62
  y_points.compact.max
37
63
  end
38
64
  alias max_y max
39
65
 
66
+ # @rbs return: Float | Integer
40
67
  def min_x
41
68
  x_points.compact.min
42
69
  end
43
70
 
71
+ # @rbs return: Float | Integer
44
72
  def max_x
45
73
  x_points.compact.max
46
74
  end
47
75
 
76
+ # @rbs minimum_x: Float | Integer
77
+ # @rbs minimum_y: Float | Integer
78
+ # @rbs spread_x: Float | Integer
79
+ # @rbs spread_y: Float | Integer
80
+ # @rbs return: Gruff::Store::XYPointsizeData
48
81
  def normalize(minimum_x:, minimum_y:, spread_x:, spread_y:)
49
82
  norm_x_points = x_points.map do |x|
50
83
  x.nil? ? nil : (x.to_f - minimum_x.to_f) / spread_x
data/lib/gruff/themes.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  module Gruff
4
6
  module Themes
5
7
  # A color scheme similar to the popular presentation software.
data/lib/gruff/version.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  module Gruff
4
- VERSION = '0.26.0'
6
+ VERSION = '0.27.0'
5
7
  end
data/lib/gruff.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  require 'rmagick'
4
6
 
5
7
  require_relative 'gruff/patch/rmagick'
@@ -16,7 +18,7 @@ require_relative 'gruff/version'
16
18
  module Gruff
17
19
  # @private
18
20
  def self.libpath(path)
19
- File.join(__dir__, 'gruff', path)
21
+ File.join(__dir__, 'gruff', path) # steep:ignore
20
22
  end
21
23
 
22
24
  autoload :BarConversion, Gruff.libpath('helper/bar_conversion')
@@ -0,0 +1,19 @@
1
+ # Generated from lib/gruff/accumulator_bar.rb with RBS::Inline
2
+
3
+ #
4
+ # Gruff::AccumulatorBar is a special bar graph that shows a
5
+ # single dataset as a set of stacked bars.
6
+ # The bottom bar shows the running total and the top bar shows
7
+ # the new value being added to the array.
8
+ #
9
+ # Here's how to set up a Gruff::AccumulatorBar.
10
+ #
11
+ # g = Gruff::AccumulatorBar.new
12
+ # g.title = 'Your Savings'
13
+ # g.data 'First', [1, 1, 1]
14
+ # g.write('accumulator_bar.png')
15
+ class Gruff::AccumulatorBar < Gruff::StackedBar
16
+ private
17
+
18
+ def setup_data: () -> untyped
19
+ end
@@ -0,0 +1,27 @@
1
+ # Generated from lib/gruff/area.rb with RBS::Inline
2
+
3
+ #
4
+ # Gruff::Area provides an area graph which displays graphically
5
+ # quantitative data.
6
+ #
7
+ # Here's how to set up a Gruff::Area.
8
+ #
9
+ # g = Gruff::Area.new
10
+ # g.title = 'Area Graph'
11
+ # g.data :Jimmy, [25, 36, 86, 39, 25, 31, 79, 88]
12
+ # g.data :Charles, [80, 54, 67, 54, 68, 70, 90, 95]
13
+ # g.data :Julie, [22, 29, 35, 38, 36, 40, 46, 57]
14
+ # g.write('area.png')
15
+ class Gruff::Area < Gruff::Base
16
+ # Specifies the filling opacity in area graph. Default is +0.85+.
17
+ attr_writer fill_opacity: Float | Integer
18
+
19
+ # Specifies the stroke width in line around area graph. Default is +2.0+.
20
+ attr_writer stroke_width: Float | Integer
21
+
22
+ private
23
+
24
+ def initialize_attributes: () -> untyped
25
+
26
+ def draw_graph: () -> untyped
27
+ end
@@ -0,0 +1,74 @@
1
+ # Generated from lib/gruff/bar.rb with RBS::Inline
2
+
3
+ #
4
+ # Gruff::Bar provide a bar graph that presents categorical data
5
+ # with rectangular bars.
6
+ #
7
+ # Here's how to set up a Gruff::Bar.
8
+ #
9
+ # g = Gruff::Bar.new
10
+ # g.title = 'Bar Graph With Manual Colors'
11
+ # g.spacing_factor = 0.1
12
+ # g.group_spacing = 20
13
+ # g.data :Art, [0, 5, 8, 15], '#990000'
14
+ # g.data :Philosophy, [10, 3, 2, 8], '#009900'
15
+ # g.data :Science, [2, 15, 8, 11], '#990099'
16
+ # g.write('bar.png')
17
+ class Gruff::Bar < Gruff::Base
18
+ include Gruff::Base::BarMixin
19
+
20
+ # Spacing factor applied between bars.
21
+ attr_writer bar_spacing: Float | Integer
22
+
23
+ # Spacing factor applied between a group of bars belonging to the same label.
24
+ attr_writer group_spacing: Float | Integer
25
+
26
+ # Set the number output format string or lambda.
27
+ # Default is +"%.2f"+.
28
+ attr_writer label_formatting: nil | String | Proc
29
+
30
+ # Output the values for the bars on a bar graph.
31
+ # Default is +false+.
32
+ attr_writer show_labels_for_bar_values: bool
33
+
34
+ # Prevent drawing of column labels below a bar graph. Default is +false+.
35
+ attr_writer hide_labels: bool
36
+
37
+ # Value to avoid completely overwriting the coordinate axis
38
+ AXIS_MARGIN: ::Float
39
+
40
+ # Can be used to adjust the spaces between the bars.
41
+ # Accepts values between 0.00 and 1.00 where 0.00 means no spacing at all
42
+ # and 1 means that each bars' width is nearly 0 (so each bar is a simple
43
+ # line with no x dimension).
44
+ #
45
+ # Default value is +0.9+.
46
+ #
47
+ # @rbs space_percent: Float | Integer
48
+ def spacing_factor=: (Float | Integer space_percent) -> untyped
49
+
50
+ private
51
+
52
+ def initialize_attributes: () -> untyped
53
+
54
+ def setup_drawing: () -> untyped
55
+
56
+ # @rbs return: bool
57
+ def hide_labels?: () -> bool
58
+
59
+ # @rbs return: bool
60
+ def hide_left_label_area?: () -> bool
61
+
62
+ # @rbs return: bool
63
+ def hide_bottom_label_area?: () -> bool
64
+
65
+ def setup_graph_measurements: () -> untyped
66
+
67
+ def draw_graph: () -> untyped
68
+
69
+ # @rbs return: Float | Integer
70
+ def calculate_spacing: () -> (Float | Integer)
71
+
72
+ # @rbs return: Proc
73
+ def proc_text_metrics: () -> Proc
74
+ end