gruff 0.26.0 → 0.27.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 (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 +43 -1
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  require 'histogram'
4
6
 
5
7
  #
@@ -15,19 +17,24 @@ require 'histogram'
15
17
  #
16
18
  class Gruff::Histogram < Gruff::Bar
17
19
  # Specifies interpolation between the min and max of the set. Default is +10+.
18
- attr_writer :bin_width
20
+ attr_writer :bin_width #: Float | Integer
19
21
 
20
22
  # Specifies minimum value for bin.
21
- attr_writer :minimum_bin
23
+ attr_writer :minimum_bin #: Float | Integer
22
24
 
23
25
  # Specifies maximum value for bin.
24
- attr_writer :maximum_bin
26
+ attr_writer :maximum_bin #: Float | Integer
25
27
 
26
- def initialize(*)
28
+ # @rbs target_width: (String | Float | Integer)
29
+ # @rbs return: void
30
+ def initialize(target_width = DEFAULT_TARGET_WIDTH)
27
31
  super
28
32
  @data = []
29
33
  end
30
34
 
35
+ # @rbs name: String | Symbol
36
+ # @rbs data_points: Array[Float | Integer] | nil
37
+ # @rbs color: String
31
38
  def data(name, data_points = [], color = nil)
32
39
  @data << [name, Array(data_points), color]
33
40
  end
@@ -46,7 +53,7 @@ private
46
53
  if data_points.empty?
47
54
  store.add(name, [], color)
48
55
  else
49
- bins, freqs = HistogramArray.new(data_points).histogram(bin_width: @bin_width, min: @minimum_bin, max: @maximum_bin)
56
+ bins, freqs = HistogramArray.new(data_points.compact).histogram(bin_width: @bin_width, min: @minimum_bin, max: @maximum_bin) # steep:ignore
50
57
  bins.each_with_index do |bin, index|
51
58
  @labels[index] = bin
52
59
  end
@@ -58,7 +65,9 @@ private
58
65
  end
59
66
 
60
67
  # @private
68
+ # @rbs inherits Array[Float | Integer | nil]
61
69
  class HistogramArray < Array
70
+ # @rbs skip
62
71
  include ::Histogram
63
72
  end
64
73
  end
data/lib/gruff/line.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  #
4
6
  # Here's how to make a Gruff::Line.
5
7
  #
@@ -14,31 +16,32 @@
14
16
  #
15
17
  class Gruff::Line < Gruff::Base
16
18
  # Allow for reference lines ( which are like baseline ... just allowing for more & on both axes ).
17
- attr_accessor :reference_lines
18
- attr_writer :reference_line_default_color
19
- attr_writer :reference_line_default_width
19
+ attr_accessor :reference_lines #: Hash[Symbol, untyped]
20
+ attr_writer :reference_line_default_color #: String
21
+ attr_writer :reference_line_default_width #: Float | Integer
20
22
 
21
23
  # Allow for vertical marker lines.
22
- attr_writer :show_vertical_markers
24
+ attr_writer :show_vertical_markers #: bool
23
25
 
24
26
  # Dimensions of lines and dots; calculated based on dataset size if left unspecified.
25
- attr_writer :line_width
26
- attr_writer :dot_radius
27
+ attr_writer :line_width #: Float | Integer
28
+ attr_writer :dot_radius #: Float | Integer
27
29
 
28
30
  # default is +'circle'+, other options include +square+ and +diamond+.
29
- attr_writer :dot_style
31
+ attr_writer :dot_style #: :square | :circle | :diamond | 'square' | 'circle' | 'diamond'
30
32
 
31
33
  # Hide parts of the graph to fit more data points, or for a different appearance.
32
- attr_writer :hide_dots, :hide_lines
34
+ attr_writer :hide_dots #: bool
35
+ attr_writer :hide_lines #: bool
33
36
 
34
37
  # accessors for support of xy data.
35
- attr_writer :minimum_x_value
38
+ attr_writer :minimum_x_value #: Float
36
39
 
37
40
  # accessors for support of xy data.
38
- attr_writer :maximum_x_value
41
+ attr_writer :maximum_x_value #: Float
39
42
 
40
43
  # The number of vertical lines shown.
41
- attr_writer :marker_x_count
44
+ attr_writer :marker_x_count #: Integer
42
45
 
43
46
  # Call with target pixel width of graph (+800+, +400+, +300+), and/or +false+ to omit lines (points only).
44
47
  #
@@ -47,6 +50,8 @@ class Gruff::Line < Gruff::Base
47
50
  # g = Gruff::Line.new(false) # Defaults to 800px wide, no lines (for backwards compatibility)
48
51
  #
49
52
  # The preferred way is to call {#hide_dots=} or {#hide_lines=} instead.
53
+ #
54
+ # @rbs return: void
50
55
  def initialize(*args)
51
56
  raise ArgumentError, 'Wrong number of arguments' if args.length > 2
52
57
 
@@ -58,6 +63,8 @@ class Gruff::Line < Gruff::Base
58
63
  end
59
64
 
60
65
  # Get the value if somebody has defined it.
66
+ #
67
+ # @rbs return: Float | Integer | nil
61
68
  def baseline_value
62
69
  if @reference_lines.key?(:baseline)
63
70
  @reference_lines[:baseline][:value]
@@ -65,17 +72,21 @@ class Gruff::Line < Gruff::Base
65
72
  end
66
73
 
67
74
  # Set a value for a baseline reference line..
75
+ #
76
+ # @rbs new_value: Float | Integer
68
77
  def baseline_value=(new_value)
69
78
  @reference_lines[:baseline] ||= {}
70
79
  @reference_lines[:baseline][:value] = new_value
71
80
  end
72
81
 
82
+ # @rbs return: Float | Integer | nil
73
83
  def baseline_color
74
84
  if @reference_lines.key?(:baseline)
75
85
  @reference_lines[:baseline][:color]
76
86
  end
77
87
  end
78
88
 
89
+ # @rbs new_value: Float | Integer
79
90
  def baseline_color=(new_value)
80
91
  @reference_lines[:baseline] ||= {}
81
92
  @reference_lines[:baseline][:color] = new_value
@@ -93,8 +104,11 @@ class Gruff::Line < Gruff::Base
93
104
  # be used.
94
105
  #
95
106
  # @param name [String, Symbol] The name of the dataset.
107
+ # @rbs name: String | Symbol
96
108
  # @param data_points [Array] The array of dataset.
109
+ # @rbs data_points: Array[nil | Float | Integer] | nil
97
110
  # @param color [String] The color for drawing graph of dataset.
111
+ # @rbs color: String
98
112
  #
99
113
  # @note
100
114
  # If you want to use a preset theme, you must set it before calling {#data}.
@@ -139,6 +153,11 @@ class Gruff::Line < Gruff::Base
139
153
  # In this example the labels are drawn at x positions 2, 4, and 6:
140
154
  # g.labels = {0 => '2003', 2 => '2004', 4 => '2005', 6 => '2006'}
141
155
  # # The 0 => '2003' label will be ignored since it is outside the chart range.
156
+ #
157
+ # @rbs name: String | Symbol
158
+ # @rbs x_data_points: Array[nil | Float | Integer] | Array[[nil | Float | Integer, nil | Float | Integer]] | nil
159
+ # @rbs y_data_points: Array[nil | Float | Integer] | nil | String
160
+ # @rbs color: String
142
161
  def dataxy(name, x_data_points = [], y_data_points = [], color = nil)
143
162
  # make sure it's an array
144
163
  x_data_points = Array(x_data_points)
@@ -152,7 +171,7 @@ class Gruff::Line < Gruff::Base
152
171
  y_data_points = Array(y_data_points)
153
172
  end
154
173
 
155
- raise ArgumentError, 'x_data_points.length != y_data_points.length!' if x_data_points.length != y_data_points.length
174
+ raise ArgumentError, 'x_data_points.length != y_data_points.length!' if x_data_points.length != y_data_points.length # steep:ignore
156
175
 
157
176
  # call the existing data routine for the x/y data.
158
177
  store.add(name, x_data_points, y_data_points, color)
@@ -31,12 +31,12 @@ private
31
31
  end
32
32
 
33
33
  def setup_data
34
- expand_canvas_for_vertical_legend
34
+ expand_canvas_for_vertical_legend # steep:ignore
35
35
  super
36
36
  end
37
37
 
38
38
  def draw_graph
39
39
  super
40
- draw_vertical_legend
40
+ draw_vertical_legend # steep:ignore
41
41
  end
42
42
  end
@@ -13,6 +13,8 @@ module Gruff::Mini::Legend
13
13
 
14
14
  # The canvas needs to be bigger so we can put the legend beneath it.
15
15
  def expand_canvas_for_vertical_legend
16
+ # steep:ignore:start
17
+
16
18
  return if @hide_mini_legend
17
19
 
18
20
  @legend_labels = store.data.map(&:label)
@@ -33,19 +35,23 @@ module Gruff::Mini::Legend
33
35
  end
34
36
 
35
37
  @renderer = Gruff::Renderer.new(@columns, @rows, @scale, @theme_options)
38
+ # steep:ignore:end
36
39
  end
37
40
 
38
41
  def calculate_line_height
39
- calculate_caps_height(@legend_font) * 1.7
42
+ calculate_caps_height(@legend_font) * 1.7 # steep:ignore
40
43
  end
41
44
 
42
45
  def calculate_legend_width
46
+ # steep:ignore:start
43
47
  width = @legend_labels.map { |label| calculate_width(@legend_font, label) }.max
44
48
  scale(width + (40 * 1.7))
49
+ # steep:ignore:end
45
50
  end
46
51
 
47
52
  # Draw the legend beneath the existing graph.
48
53
  def draw_vertical_legend
54
+ # steep:ignore:start
49
55
  return if @hide_mini_legend
50
56
 
51
57
  legend_square_width = 40.0 # small square with color of this item
@@ -77,10 +83,12 @@ module Gruff::Mini::Legend
77
83
 
78
84
  current_y_offset += calculate_line_height
79
85
  end
86
+ # steep:ignore:end
80
87
  end
81
88
 
82
89
  # Shorten long labels so they will fit on the canvas.
83
90
  def truncate_legend_label(label, x_offset)
91
+ # steep:ignore:start
84
92
  truncated_label = label.to_s
85
93
 
86
94
  font = @legend_font.dup
@@ -90,6 +98,7 @@ module Gruff::Mini::Legend
90
98
  truncated_label = truncated_label[0..truncated_label.length - 2]
91
99
  end
92
100
  truncated_label + (truncated_label.length < label.to_s.length ? '...' : '')
101
+ # steep:ignore:end
93
102
  end
94
103
 
95
104
  def scale(value)
@@ -28,12 +28,12 @@ private
28
28
  end
29
29
 
30
30
  def setup_data
31
- expand_canvas_for_vertical_legend
31
+ expand_canvas_for_vertical_legend # steep:ignore
32
32
  super
33
33
  end
34
34
 
35
35
  def draw_graph
36
36
  super
37
- draw_vertical_legend
37
+ draw_vertical_legend # steep:ignore
38
38
  end
39
39
  end
@@ -35,12 +35,12 @@ private
35
35
  end
36
36
 
37
37
  def setup_data
38
- expand_canvas_for_vertical_legend
38
+ expand_canvas_for_vertical_legend # steep:ignore
39
39
  super
40
40
  end
41
41
 
42
42
  def draw_graph
43
43
  super
44
- draw_vertical_legend
44
+ draw_vertical_legend # steep:ignore
45
45
  end
46
46
  end
data/lib/gruff/net.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  # See also the Spider graph.
4
6
  #
5
7
  # Here's how to make a Gruff::Net.
@@ -24,11 +26,11 @@
24
26
  #
25
27
  class Gruff::Net < Gruff::Base
26
28
  # Hide parts of the graph to fit more data points, or for a different appearance.
27
- attr_writer :hide_dots
29
+ attr_writer :hide_dots #: bool
28
30
 
29
31
  # Dimensions of lines and dots; calculated based on dataset size if left unspecified.
30
- attr_writer :line_width
31
- attr_writer :dot_radius
32
+ attr_writer :line_width #: Float | Integer
33
+ attr_writer :dot_radius #: Float | Integer
32
34
 
33
35
  private
34
36
 
@@ -63,10 +65,8 @@ private
63
65
  poly_points = []
64
66
 
65
67
  data_row.points.each_with_index do |data_point, index|
66
- next if data_point.nil?
67
-
68
68
  rad_pos = index * Math::PI * 2 / column_count
69
- point_distance = data_point * @radius
69
+ point_distance = data_point.to_f * @radius
70
70
  start_x = @center_x + (Math.sin(rad_pos) * point_distance)
71
71
  start_y = @center_y - (Math.cos(rad_pos) * point_distance)
72
72
  if poly_points.empty?
@@ -77,7 +77,7 @@ private
77
77
  next_index = index + 1 < data_row.points.length ? index + 1 : 0
78
78
 
79
79
  next_rad_pos = next_index * Math::PI * 2 / column_count
80
- next_point_distance = data_row.points[next_index] * @radius
80
+ next_point_distance = data_row.points[next_index].to_f * @radius
81
81
  end_x = @center_x + (Math.sin(next_rad_pos) * next_point_distance)
82
82
  end_y = @center_y - (Math.cos(next_rad_pos) * next_point_distance)
83
83
  poly_points << end_x
@@ -109,6 +109,11 @@ private
109
109
  end
110
110
  end
111
111
 
112
+ # @rbs center_x: Float | Integer
113
+ # @rbs center_y: Float | Integer
114
+ # @rbs angle: Float | Integer
115
+ # @rbs radius: Float
116
+ # @rbs amount: String | Integer
112
117
  def draw_label(center_x, center_y, angle, radius, amount)
113
118
  x_offset = center_x # + 15 # The label points need to be tweaked slightly
114
119
  y_offset = center_y # + 0 # This one doesn't though
@@ -10,10 +10,12 @@ module Magick
10
10
  scaled_width = [(width * scale), 1].max
11
11
  scaled_height = [(height * scale), 1].max
12
12
 
13
+ # steep:ignore:start
13
14
  annotate(img,
14
15
  scaled_width, scaled_height,
15
16
  x * scale, y * scale,
16
17
  text.gsub('%', '%%'))
18
+ # steep:ignore:end
17
19
  end
18
20
 
19
21
  if defined? JRUBY_VERSION
@@ -8,7 +8,7 @@ module String::GruffCommify
8
8
  refine String do
9
9
  # Taken from http://codesnippets.joyent.com/posts/show/330
10
10
  def commify(delimiter = THOUSAND_SEPARATOR)
11
- gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{delimiter}")
11
+ gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{delimiter}") # steep:ignore
12
12
  end
13
13
  end
14
14
  end
data/lib/gruff/pie.rb CHANGED
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  #
4
6
  # Here's how to make a Gruff::Pie.
5
7
  #
@@ -16,25 +18,25 @@ class Gruff::Pie < Gruff::Base
16
18
 
17
19
  # Can be used to make the pie start cutting slices at the top (-90.0)
18
20
  # or at another angle. Default is +-90.0+, which starts at 3 o'clock.
19
- attr_writer :start_degree
21
+ attr_writer :start_degree #: Float | Integer
20
22
 
21
23
  # Set the number output format lambda.
22
- attr_writer :label_formatting
24
+ attr_writer :label_formatting #: Proc
23
25
 
24
26
  # Do not show labels for slices that are less than this percent. Use 0 to always show all labels.
25
27
  # Defaults to +0+.
26
- attr_writer :hide_labels_less_than
28
+ attr_writer :hide_labels_less_than #: Float | Integer
27
29
 
28
30
  # Affect the distance between the percentages and the pie chart.
29
31
  # Defaults to +0.1+.
30
- attr_writer :text_offset_percentage
32
+ attr_writer :text_offset_percentage #: Float | Integer
31
33
 
32
34
  ## Use values instead of percentages.
33
- attr_writer :show_values_as_labels
35
+ attr_writer :show_values_as_labels #: bool
34
36
 
35
37
  # Set to +true+ if you want the data sets sorted with largest avg values drawn
36
38
  # first. Default is +true+.
37
- attr_writer :sort
39
+ attr_writer :sort #: bool
38
40
 
39
41
  # Can be used to make the pie start cutting slices at the top (-90.0)
40
42
  # or at another angle. Default is +-90.0+, which starts at 3 o'clock.
@@ -90,53 +92,64 @@ private
90
92
 
91
93
  # General Helper Methods
92
94
 
95
+ # @rbs degree: Float | Integer
93
96
  def update_chart_degrees_with(degrees)
94
97
  @chart_degrees = chart_degrees + degrees
95
98
  end
96
99
 
97
100
  # Spatial Value-Related Methods
98
101
 
102
+ # @rbs return: Float | Integer
99
103
  def chart_degrees
100
104
  @chart_degrees ||= @start_degree
101
105
  end
102
106
 
103
- attr_reader :graph_height
104
- attr_reader :graph_width
107
+ attr_reader :graph_height #: Float | Integer
108
+ attr_reader :graph_width #: Float | Integer
105
109
 
110
+ # @rbs return: Float | Integer
106
111
  def half_width
107
112
  graph_width / 2.0
108
113
  end
109
114
 
115
+ # @rbs return: Float | Integer
110
116
  def half_height
111
117
  graph_height / 2.0
112
118
  end
113
119
 
120
+ # @rbs return: Float | Integer
114
121
  def radius
115
122
  @radius ||= ([graph_width, graph_height].min / 2.0) * 0.8
116
123
  end
117
124
 
125
+ # @rbs return: Float | Integer
118
126
  def center_x
119
127
  @center_x ||= @graph_left + half_width
120
128
  end
121
129
 
130
+ # @rbs return: Float | Integer
122
131
  def center_y
123
132
  @center_y ||= @graph_top + half_height - 10
124
133
  end
125
134
 
135
+ # @rbs return: Float | Integer
126
136
  def distance_from_center
127
137
  20.0
128
138
  end
129
139
 
140
+ # @rbs return: Float | Integer | BigDecimal
130
141
  def radius_offset
131
142
  radius + (radius * @text_offset_percentage) + distance_from_center
132
143
  end
133
144
 
145
+ # @rbs return: Float | Integer
134
146
  def ellipse_factor
135
147
  radius_offset * @text_offset_percentage
136
148
  end
137
149
 
138
150
  # Label-Related Methods
139
151
 
152
+ # @rbs slice: Gruff::Pie::PieSlice
140
153
  def process_label_for(slice)
141
154
  if slice.percentage >= @hide_labels_less_than
142
155
  x, y = label_coordinates_for slice
@@ -145,16 +158,22 @@ private
145
158
  end
146
159
  end
147
160
 
161
+ # @rbs slice: Gruff::Pie::PieSlice
162
+ # @rbs return: [Float | Integer, Float | Integer]
148
163
  def label_coordinates_for(slice)
149
164
  angle = chart_degrees + (slice.degrees / 2.0)
150
165
 
151
166
  [x_label_coordinate(angle), y_label_coordinate(angle)]
152
167
  end
153
168
 
169
+ # @rbs angle: Float | Integer
170
+ # @rbs return: Float
154
171
  def x_label_coordinate(angle)
155
- center_x + ((radius_offset + ellipse_factor) * Math.cos(deg2rad(angle)))
172
+ center_x + ((radius_offset + ellipse_factor) * Math.cos(deg2rad(angle))) #: Float
156
173
  end
157
174
 
175
+ # @rbs angle: Float | Integer
176
+ # @rbs return: Float
158
177
  def y_label_coordinate(angle)
159
178
  center_y + (radius_offset * Math.sin(deg2rad(angle)))
160
179
  end
@@ -162,19 +181,35 @@ private
162
181
  # Helper Classes
163
182
  #
164
183
  # @private
165
- class PieSlice < Struct.new(:label, :value, :color)
166
- attr_accessor :total
184
+ class PieSlice
185
+ attr_accessor :label #: String | Symbol
186
+ attr_accessor :value #: Float | Integer
187
+ attr_accessor :color #: String
188
+ attr_accessor :total #: Float | Integer
189
+
190
+ # @rbs label: String | Symbol
191
+ # @rbs value: nil | Float | Integer
192
+ # @rbs color: String
193
+ # @rbs return: void
194
+ def initialize(label, value, color)
195
+ @label = label
196
+ @value = value || 0.0
197
+ @color = color
198
+ end
167
199
 
200
+ # @rbs return: Float | Integer
168
201
  def percentage
169
202
  (size * 100.0).round
170
203
  end
171
204
 
205
+ # @rbs return: Float
172
206
  def degrees
173
207
  size * 360.0
174
208
  end
175
209
 
176
210
  private
177
211
 
212
+ # @rbs return: Float | Integer
178
213
  def size
179
214
  value / total
180
215
  end
@@ -1,14 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  module Gruff
4
6
  # @private
5
7
  class Renderer::Bezier
8
+ # @rbs renderer: Gruff::Renderer
9
+ # @rbs color: String
10
+ # @rbs width: Float | Integer
11
+ # @rbs return: void
6
12
  def initialize(renderer, color:, width: 1.0)
7
13
  @renderer = renderer
8
14
  @color = color
9
15
  @width = width
10
16
  end
11
17
 
18
+ # @rbs points: Array[Float | Integer]
12
19
  def render(points)
13
20
  @renderer.draw.push
14
21
  @renderer.draw.stroke_width(@width)
@@ -1,8 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  module Gruff
4
6
  # @private
5
7
  class Renderer::Circle
8
+ # @rbs renderer: Gruff::Renderer
9
+ # @rbs color: String
10
+ # @rbs width: Float | Integer
11
+ # @rbs opacity: Float | Integer
12
+ # @rbs return: void
6
13
  def initialize(renderer, color:, width: 1.0, opacity: 1.0)
7
14
  @renderer = renderer
8
15
  @color = color
@@ -10,6 +17,10 @@ module Gruff
10
17
  @opacity = opacity
11
18
  end
12
19
 
20
+ # @rbs origin_x: Float | Integer
21
+ # @rbs origin_y: Float | Integer
22
+ # @rbs perim_x: Float | Integer
23
+ # @rbs perim_y: Float | Integer
13
24
  def render(origin_x, origin_y, perim_x, perim_y)
14
25
  @renderer.draw.push
15
26
  @renderer.draw.stroke_width(@width)
@@ -1,8 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  module Gruff
4
6
  # @private
5
7
  class Renderer::DashLine
8
+ # @rbs renderer: Gruff::Renderer
9
+ # @rbs color: String
10
+ # @rbs width: Float | Integer
11
+ # @rbs dasharray: Array[Float | Integer]
12
+ # @rbs return: void
6
13
  def initialize(renderer, color:, width:, dasharray: [10, 20])
7
14
  @renderer = renderer
8
15
  @color = color
@@ -10,6 +17,10 @@ module Gruff
10
17
  @dasharray = dasharray
11
18
  end
12
19
 
20
+ # @rbs start_x: Float | Integer
21
+ # @rbs start_y: Float | Integer
22
+ # @rbs end_x: Float | Integer
23
+ # @rbs end_y: Float | Integer
13
24
  def render(start_x, start_y, end_x, end_y)
14
25
  @renderer.draw.push
15
26
  @renderer.draw.stroke_color(@color)
@@ -1,8 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  module Gruff
4
6
  # @private
5
7
  class Renderer::Dot
8
+ # @rbs renderer: Gruff::Renderer
9
+ # @rbs style: :square | :circle | :diamond | 'square' | 'circle' | 'diamond'
10
+ # @rbs color: String
11
+ # @rbs width: Float | Integer
12
+ # @rbs opacity: Float | Integer
13
+ # @rbs return: void
6
14
  def initialize(renderer, style, color:, width: 1.0, opacity: 1.0)
7
15
  @renderer = renderer
8
16
  @style = style.to_sym
@@ -11,6 +19,9 @@ module Gruff
11
19
  @opacity = opacity
12
20
  end
13
21
 
22
+ # @rbs new_x: Float | Integer
23
+ # @rbs new_y: Float | Integer
24
+ # @rbs radius: Float | Integer
14
25
  def render(new_x, new_y, radius)
15
26
  @renderer.draw.push
16
27
  @renderer.draw.stroke_width(@width)
@@ -1,14 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  module Gruff
4
6
  # @private
5
7
  class Renderer::Ellipse
8
+ # @rbs renderer: Gruff::Renderer
9
+ # @rbs color: String
10
+ # @rbs width: Float | Integer
11
+ # @rbs return: void
6
12
  def initialize(renderer, color:, width: 1.0)
7
13
  @renderer = renderer
8
14
  @color = color
9
15
  @width = width
10
16
  end
11
17
 
18
+ # @rbs origin_x: Float | Integer
19
+ # @rbs origin_y: Float | Integer
20
+ # @rbs width: Float | Integer
21
+ # @rbs height: Float | Integer
22
+ # @rbs arc_start: Float | Integer
23
+ # @rbs arc_end: Float | Integer
12
24
  def render(origin_x, origin_y, width, height, arc_start, arc_end)
13
25
  @renderer.draw.push
14
26
  @renderer.draw.stroke_width(@width)
@@ -1,16 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  module Gruff
4
6
  # @private
5
7
  class Renderer::Line
6
8
  EPSILON = 0.001
7
9
 
10
+ # @rbs renderer: Gruff::Renderer
11
+ # @rbs color: String
12
+ # @rbs width: Float | Integer
13
+ # @rbs return: void
8
14
  def initialize(renderer, color:, width: nil)
9
15
  @renderer = renderer
10
16
  @color = color
11
17
  @width = width
12
18
  end
13
19
 
20
+ # @rbs start_x: Float | Integer
21
+ # @rbs start_y: Float | Integer
22
+ # @rbs end_x: Float | Integer
23
+ # @rbs end_y: Float | Integer
14
24
  def render(start_x, start_y, end_x, end_y)
15
25
  render_line(start_x, start_y, end_x, end_y, @color)
16
26
  end