gruff 0.29.0-java → 0.30.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.
- checksums.yaml +4 -4
- data/.github/dependabot.yml +6 -0
- data/.github/workflows/ci.yml +19 -26
- data/.rubocop.yml +15 -0
- data/.rubocop_todo.yml +11 -0
- data/CHANGELOG.md +5 -0
- data/Gemfile +2 -0
- data/gruff.gemspec +1 -0
- data/init.rb +1 -0
- data/lib/gruff/accumulator_bar.rb +1 -0
- data/lib/gruff/area.rb +2 -0
- data/lib/gruff/bar.rb +5 -0
- data/lib/gruff/base.rb +59 -2
- data/lib/gruff/bezier.rb +1 -0
- data/lib/gruff/box.rb +8 -0
- data/lib/gruff/bubble.rb +4 -0
- data/lib/gruff/bullet.rb +4 -0
- data/lib/gruff/candlestick.rb +20 -8
- data/lib/gruff/dot.rb +4 -0
- data/lib/gruff/font.rb +2 -0
- data/lib/gruff/helper/bar_value_label.rb +2 -0
- data/lib/gruff/helper/stacked_mixin.rb +1 -0
- data/lib/gruff/histogram.rb +3 -0
- data/lib/gruff/line.rb +28 -0
- data/lib/gruff/mini/bar.rb +4 -0
- data/lib/gruff/mini/legend.rb +15 -3
- data/lib/gruff/mini/pie.rb +4 -0
- data/lib/gruff/mini/side_bar.rb +4 -0
- data/lib/gruff/net.rb +7 -1
- data/lib/gruff/patch/rmagick.rb +11 -0
- data/lib/gruff/patch/string.rb +3 -0
- data/lib/gruff/pie.rb +8 -0
- data/lib/gruff/renderer/bezier.rb +1 -0
- data/lib/gruff/renderer/circle.rb +1 -0
- data/lib/gruff/renderer/dash_line.rb +1 -0
- data/lib/gruff/renderer/dot.rb +13 -0
- data/lib/gruff/renderer/ellipse.rb +1 -0
- data/lib/gruff/renderer/line.rb +7 -0
- data/lib/gruff/renderer/polygon.rb +2 -0
- data/lib/gruff/renderer/polyline.rb +1 -0
- data/lib/gruff/renderer/rectangle.rb +1 -0
- data/lib/gruff/renderer/renderer.rb +26 -3
- data/lib/gruff/renderer/text.rb +5 -1
- data/lib/gruff/scatter.rb +17 -0
- data/lib/gruff/side_bar.rb +9 -0
- data/lib/gruff/side_stacked_bar.rb +3 -0
- data/lib/gruff/spider.rb +26 -2
- data/lib/gruff/stacked_area.rb +5 -0
- data/lib/gruff/stacked_bar.rb +5 -0
- data/lib/gruff/store/basic_data.rb +4 -0
- data/lib/gruff/store/store.rb +8 -0
- data/lib/gruff/store/xy_data.rb +2 -0
- data/lib/gruff/store/xy_pointsizes_data.rb +2 -0
- data/lib/gruff/version.rb +1 -1
- data/lib/gruff.rb +2 -0
- data/sig/generated/gruff/accumulator_bar.rbs +2 -1
- data/sig/generated/gruff/area.rbs +4 -2
- data/sig/generated/gruff/bar.rbs +10 -5
- data/sig/generated/gruff/base.rbs +113 -53
- data/sig/generated/gruff/bezier.rbs +2 -1
- data/sig/generated/gruff/box.rbs +13 -5
- data/sig/generated/gruff/bubble.rbs +8 -4
- data/sig/generated/gruff/bullet.rbs +8 -4
- data/sig/generated/gruff/candlestick.rbs +26 -14
- data/sig/generated/gruff/dot.rbs +8 -4
- data/sig/generated/gruff/font.rbs +3 -1
- data/sig/generated/gruff/helper/bar_value_label.rbs +4 -2
- data/sig/generated/gruff/helper/stacked_mixin.rbs +2 -1
- data/sig/generated/gruff/histogram.rbs +6 -3
- data/sig/generated/gruff/line.rbs +44 -16
- data/sig/generated/gruff/mini/bar.rbs +27 -0
- data/sig/generated/gruff/mini/legend.rbs +36 -0
- data/sig/generated/gruff/mini/pie.rbs +26 -0
- data/sig/generated/gruff/mini/side_bar.rbs +34 -0
- data/sig/generated/gruff/net.rbs +12 -6
- data/sig/generated/gruff/patch/rmagick.rbs +25 -0
- data/sig/generated/gruff/patch/string.rbs +11 -0
- data/sig/generated/gruff/pie.rbs +15 -7
- data/sig/generated/gruff/renderer/bezier.rbs +2 -1
- data/sig/generated/gruff/renderer/circle.rbs +2 -1
- data/sig/generated/gruff/renderer/dash_line.rbs +2 -1
- data/sig/generated/gruff/renderer/dot.rbs +17 -4
- data/sig/generated/gruff/renderer/ellipse.rbs +2 -1
- data/sig/generated/gruff/renderer/line.rbs +9 -2
- data/sig/generated/gruff/renderer/polygon.rbs +17 -0
- data/sig/generated/gruff/renderer/polyline.rbs +2 -1
- data/sig/generated/gruff/renderer/rectangle.rbs +2 -1
- data/sig/generated/gruff/renderer/renderer.rbs +31 -8
- data/sig/generated/gruff/renderer/text.rbs +7 -3
- data/sig/generated/gruff/scatter.rbs +30 -13
- data/sig/generated/gruff/side_bar.rbs +15 -6
- data/sig/generated/gruff/side_stacked_bar.rbs +6 -3
- data/sig/generated/gruff/spider.rbs +35 -11
- data/sig/generated/gruff/stacked_area.rbs +9 -4
- data/sig/generated/gruff/stacked_bar.rbs +10 -5
- data/sig/generated/gruff/store/basic_data.rbs +8 -4
- data/sig/generated/gruff/store/store.rbs +12 -4
- data/sig/generated/gruff/store/xy_data.rbs +4 -2
- data/sig/generated/gruff/store/xy_pointsizes_data.rbs +4 -2
- data/sig/generated/gruff.rbs +3 -1
- metadata +12 -3
data/lib/gruff/bezier.rb
CHANGED
data/lib/gruff/box.rb
CHANGED
|
@@ -26,6 +26,7 @@ class Gruff::Box < Gruff::Base
|
|
|
26
26
|
# Default value is +0.8+.
|
|
27
27
|
#
|
|
28
28
|
# @rbs space_percent: Float | Integer
|
|
29
|
+
# @rbs return: void
|
|
29
30
|
def spacing_factor=(space_percent)
|
|
30
31
|
raise ArgumentError, 'spacing_factor must be between 0.00 and 1.00' if (space_percent < 0) || (space_percent > 1)
|
|
31
32
|
|
|
@@ -34,6 +35,7 @@ class Gruff::Box < Gruff::Base
|
|
|
34
35
|
|
|
35
36
|
private
|
|
36
37
|
|
|
38
|
+
# @rbs return: void
|
|
37
39
|
def initialize_attributes
|
|
38
40
|
super
|
|
39
41
|
@fill_opacity = 0.2
|
|
@@ -41,6 +43,7 @@ private
|
|
|
41
43
|
@spacing_factor = 0.8
|
|
42
44
|
end
|
|
43
45
|
|
|
46
|
+
# @rbs return: void
|
|
44
47
|
def draw_graph
|
|
45
48
|
# Setup the BarConversion Object
|
|
46
49
|
conversion = Gruff::BarConversion.new(
|
|
@@ -93,6 +96,7 @@ private
|
|
|
93
96
|
end
|
|
94
97
|
end
|
|
95
98
|
|
|
99
|
+
# @rbs return: Array[Gruff::Box::BoxData]
|
|
96
100
|
def normalized_boxes
|
|
97
101
|
@normalized_boxes ||= store.norm_data.map { |data| Gruff::Box::BoxData.new(data.label, data.points, data.color) }
|
|
98
102
|
end
|
|
@@ -113,6 +117,10 @@ private
|
|
|
113
117
|
attr_accessor :points #: Array[Float | Integer]
|
|
114
118
|
attr_accessor :color #: String
|
|
115
119
|
|
|
120
|
+
# @rbs label: String
|
|
121
|
+
# @rbs points: Array[Float | Integer]
|
|
122
|
+
# @rbs color: String
|
|
123
|
+
# @rbs return: void
|
|
116
124
|
def initialize(label, points, color)
|
|
117
125
|
@label = label
|
|
118
126
|
@points = points.compact.sort
|
data/lib/gruff/bubble.rb
CHANGED
|
@@ -60,6 +60,7 @@ class Gruff::Bubble < Gruff::Scatter
|
|
|
60
60
|
# @rbs y_data_points: Array[nil | Float | Integer] | nil
|
|
61
61
|
# @rbs point_sizes: Array[nil | Float | Integer] | nil
|
|
62
62
|
# @rbs color: String
|
|
63
|
+
# @rbs return: void
|
|
63
64
|
def data(name, x_data_points = [], y_data_points = [], point_sizes = [], color = nil)
|
|
64
65
|
# make sure it's an array
|
|
65
66
|
x_data_points = Array(x_data_points)
|
|
@@ -78,10 +79,12 @@ class Gruff::Bubble < Gruff::Scatter
|
|
|
78
79
|
|
|
79
80
|
private
|
|
80
81
|
|
|
82
|
+
# @rbs return: void
|
|
81
83
|
def initialize_store
|
|
82
84
|
@store = Gruff::Store.new(Gruff::Store::XYPointsizeData)
|
|
83
85
|
end
|
|
84
86
|
|
|
87
|
+
# @rbs return: void
|
|
85
88
|
def initialize_attributes
|
|
86
89
|
super
|
|
87
90
|
|
|
@@ -89,6 +92,7 @@ private
|
|
|
89
92
|
@stroke_width = 1.0
|
|
90
93
|
end
|
|
91
94
|
|
|
95
|
+
# @rbs return: void
|
|
92
96
|
def draw_graph
|
|
93
97
|
store.norm_data.each do |data_row|
|
|
94
98
|
data_row.coordinate_and_pointsizes.each do |x_value, y_value, point_size|
|
data/lib/gruff/bullet.rb
CHANGED
|
@@ -31,6 +31,7 @@ class Gruff::Bullet < Gruff::Base
|
|
|
31
31
|
self.theme = Gruff::Themes::GREYSCALE
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
+
# @rbs return: void
|
|
34
35
|
def initialize_attributes
|
|
35
36
|
super
|
|
36
37
|
|
|
@@ -42,6 +43,7 @@ class Gruff::Bullet < Gruff::Base
|
|
|
42
43
|
# @rbs value: Float | Integer
|
|
43
44
|
# @rbs maximum_value: Float | Integer
|
|
44
45
|
# @rbs options: Hash[Symbol, Float | Integer]
|
|
46
|
+
# @rbs return: void
|
|
45
47
|
def data(value, maximum_value, options = {})
|
|
46
48
|
@value = value.to_f
|
|
47
49
|
self.maximum_value = maximum_value.to_f
|
|
@@ -49,6 +51,7 @@ class Gruff::Bullet < Gruff::Base
|
|
|
49
51
|
@options.map { |k, v| @options[k] = v.to_f if v.respond_to?(:to_f) }
|
|
50
52
|
end
|
|
51
53
|
|
|
54
|
+
# @rbs return: void
|
|
52
55
|
def draw
|
|
53
56
|
# TODO: Left label
|
|
54
57
|
# TODO Bottom labels and markers
|
|
@@ -95,6 +98,7 @@ class Gruff::Bullet < Gruff::Base
|
|
|
95
98
|
|
|
96
99
|
private
|
|
97
100
|
|
|
101
|
+
# @rbs return: void
|
|
98
102
|
def draw_title
|
|
99
103
|
return if hide_title?
|
|
100
104
|
|
data/lib/gruff/candlestick.rb
CHANGED
|
@@ -36,6 +36,7 @@ class Gruff::Candlestick < Gruff::Base
|
|
|
36
36
|
# Default value is +0.9+.
|
|
37
37
|
#
|
|
38
38
|
# @rbs space_percent: Float | Integer
|
|
39
|
+
# @rbs return: void
|
|
39
40
|
def spacing_factor=(space_percent)
|
|
40
41
|
raise ArgumentError, 'spacing_factor must be between 0.00 and 1.00' if (space_percent < 0) || (space_percent > 1)
|
|
41
42
|
|
|
@@ -43,11 +44,13 @@ class Gruff::Candlestick < Gruff::Base
|
|
|
43
44
|
end
|
|
44
45
|
|
|
45
46
|
# The sort feature is not supported in this graph.
|
|
47
|
+
# @rbs return: void
|
|
46
48
|
def sort=(_value)
|
|
47
49
|
raise 'Not support #sort= in Gruff::Candlestick'
|
|
48
50
|
end
|
|
49
51
|
|
|
50
52
|
# The sort feature is not supported in this graph.
|
|
53
|
+
# @rbs return: void
|
|
51
54
|
def sorted_drawing=(_value)
|
|
52
55
|
raise 'Not support #sorted_drawing= in Gruff::Candlestick'
|
|
53
56
|
end
|
|
@@ -56,12 +59,14 @@ class Gruff::Candlestick < Gruff::Base
|
|
|
56
59
|
# @rbs high: Float | Integer
|
|
57
60
|
# @rbs open: Float | Integer
|
|
58
61
|
# @rbs close: Float | Integer
|
|
62
|
+
# @rbs return: void
|
|
59
63
|
def data(low:, high:, open:, close:)
|
|
60
64
|
super('', [low, high, open, close])
|
|
61
65
|
end
|
|
62
66
|
|
|
63
67
|
private
|
|
64
68
|
|
|
69
|
+
# @rbs return: void
|
|
65
70
|
def initialize_attributes
|
|
66
71
|
super
|
|
67
72
|
@show_vertical_markers = false
|
|
@@ -74,6 +79,7 @@ private
|
|
|
74
79
|
@hide_legend = true
|
|
75
80
|
end
|
|
76
81
|
|
|
82
|
+
# @rbs return: void
|
|
77
83
|
def draw_graph
|
|
78
84
|
# Setup the BarConversion Object
|
|
79
85
|
conversion = Gruff::BarConversion.new(
|
|
@@ -81,7 +87,7 @@ private
|
|
|
81
87
|
minimum_value: minimum_value, maximum_value: maximum_value, spread: @spread
|
|
82
88
|
)
|
|
83
89
|
|
|
84
|
-
width =
|
|
90
|
+
width = @graph_width / calculate_spacing
|
|
85
91
|
bar_width = width * @spacing_factor
|
|
86
92
|
padding = width - bar_width
|
|
87
93
|
|
|
@@ -106,6 +112,7 @@ private
|
|
|
106
112
|
end
|
|
107
113
|
end
|
|
108
114
|
|
|
115
|
+
# @rbs return: Array[Gruff::Candlestick::CandlestickData]
|
|
109
116
|
def normalized_candlesticks
|
|
110
117
|
@normalized_candlesticks ||= store.norm_data.map { |data| Gruff::Candlestick::CandlestickData.new(*data.points) } # steep:ignore
|
|
111
118
|
end
|
|
@@ -115,9 +122,9 @@ private
|
|
|
115
122
|
normalized_candlesticks.size
|
|
116
123
|
end
|
|
117
124
|
|
|
118
|
-
# @rbs return:
|
|
125
|
+
# @rbs return: Float
|
|
119
126
|
def calculate_spacing
|
|
120
|
-
column_count
|
|
127
|
+
column_count.to_f
|
|
121
128
|
end
|
|
122
129
|
|
|
123
130
|
# @rbs return: bool
|
|
@@ -127,11 +134,16 @@ private
|
|
|
127
134
|
|
|
128
135
|
# @private
|
|
129
136
|
class CandlestickData
|
|
130
|
-
attr_accessor :low
|
|
131
|
-
attr_accessor :high
|
|
132
|
-
attr_accessor :open
|
|
133
|
-
attr_accessor :close
|
|
134
|
-
|
|
137
|
+
attr_accessor :low #: Float | Integer
|
|
138
|
+
attr_accessor :high #: Float | Integer
|
|
139
|
+
attr_accessor :open #: Float | Integer
|
|
140
|
+
attr_accessor :close #: Float | Integer
|
|
141
|
+
|
|
142
|
+
# @rbs low: Float | Integer
|
|
143
|
+
# @rbs high: Float | Integer
|
|
144
|
+
# @rbs open: Float | Integer
|
|
145
|
+
# @rbs close: Float | Integer
|
|
146
|
+
# @rbs return: void
|
|
135
147
|
def initialize(low, high, open, close)
|
|
136
148
|
@low = low.to_f
|
|
137
149
|
@high = high.to_f
|
data/lib/gruff/dot.rb
CHANGED
|
@@ -29,6 +29,7 @@ class Gruff::Dot < Gruff::Base
|
|
|
29
29
|
|
|
30
30
|
private
|
|
31
31
|
|
|
32
|
+
# @rbs return: void
|
|
32
33
|
def initialize_attributes
|
|
33
34
|
super
|
|
34
35
|
@hide_labels = false
|
|
@@ -49,6 +50,7 @@ private
|
|
|
49
50
|
@hide_line_markers && @x_axis_label.nil? && @legend_at_bottom == false
|
|
50
51
|
end
|
|
51
52
|
|
|
53
|
+
# @rbs return: void
|
|
52
54
|
def draw_graph
|
|
53
55
|
# Setup spacing.
|
|
54
56
|
#
|
|
@@ -76,6 +78,7 @@ private
|
|
|
76
78
|
end
|
|
77
79
|
|
|
78
80
|
# Instead of base class version, draws vertical background lines and label
|
|
81
|
+
# @rbs return: void
|
|
79
82
|
def draw_line_markers
|
|
80
83
|
return if @hide_line_markers
|
|
81
84
|
|
|
@@ -98,6 +101,7 @@ private
|
|
|
98
101
|
|
|
99
102
|
# @rbs y_offset: Float | Integer
|
|
100
103
|
# @rbs index: Integer
|
|
104
|
+
# @rbs return: void
|
|
101
105
|
def draw_label(y_offset, index)
|
|
102
106
|
draw_unique_label(index) do
|
|
103
107
|
draw_label_at(@graph_left - @label_margin, 1.0, 0.0, y_offset, @labels[index], gravity: Magick::EastGravity)
|
data/lib/gruff/font.rb
CHANGED
|
@@ -26,6 +26,7 @@ class Gruff::Font
|
|
|
26
26
|
# @rbs size: Float | Integer
|
|
27
27
|
# @rbs bold: bool
|
|
28
28
|
# @rbs color: String
|
|
29
|
+
# @rbs return: void
|
|
29
30
|
def initialize(path: nil, size: 20.0, bold: false, color: 'white')
|
|
30
31
|
@path = path
|
|
31
32
|
@bold = bold
|
|
@@ -36,6 +37,7 @@ class Gruff::Font
|
|
|
36
37
|
# Get font weight.
|
|
37
38
|
# @return [Magick::WeightType] font weight
|
|
38
39
|
# TODO: type annotation of return value
|
|
40
|
+
# @rbs return: untyped
|
|
39
41
|
def weight
|
|
40
42
|
@bold ? Magick::BoldWeight : Magick::NormalWeight
|
|
41
43
|
end
|
|
@@ -45,6 +45,7 @@ module Gruff::BarValueLabel
|
|
|
45
45
|
# @rbs format: nil | String | Proc
|
|
46
46
|
# @rbs proc_text_metrics: Proc
|
|
47
47
|
# @rbs yields: (Float | Integer, Float | Integer, String, Float, Float) -> void
|
|
48
|
+
# @rbs return: void
|
|
48
49
|
def prepare_rendering(format, proc_text_metrics)
|
|
49
50
|
left_x, left_y, _right_x, _right_y = @coordinate
|
|
50
51
|
val, metrics = Gruff::BarValueLabel.metrics(@value, format, proc_text_metrics)
|
|
@@ -59,6 +60,7 @@ module Gruff::BarValueLabel
|
|
|
59
60
|
# @rbs format: nil | String | Proc
|
|
60
61
|
# @rbs proc_text_metrics: Proc
|
|
61
62
|
# @rbs yields: (Float | Integer, Float | Integer, String, Float, Float) -> void
|
|
63
|
+
# @rbs return: void
|
|
62
64
|
def prepare_rendering(format, proc_text_metrics)
|
|
63
65
|
left_x, left_y, right_x, _right_y = @coordinate
|
|
64
66
|
val, metrics = Gruff::BarValueLabel.metrics(@value, format, proc_text_metrics)
|
data/lib/gruff/histogram.rb
CHANGED
|
@@ -35,12 +35,14 @@ class Gruff::Histogram < Gruff::Bar
|
|
|
35
35
|
# @rbs name: String | Symbol
|
|
36
36
|
# @rbs data_points: Array[Float | Integer] | nil
|
|
37
37
|
# @rbs color: String
|
|
38
|
+
# @rbs return: void
|
|
38
39
|
def data(name, data_points = [], color = nil)
|
|
39
40
|
@data << [name, Array(data_points), color]
|
|
40
41
|
end
|
|
41
42
|
|
|
42
43
|
private
|
|
43
44
|
|
|
45
|
+
# @rbs return: void
|
|
44
46
|
def initialize_attributes
|
|
45
47
|
super
|
|
46
48
|
@bin_width = 10
|
|
@@ -48,6 +50,7 @@ private
|
|
|
48
50
|
@maximum_bin = nil
|
|
49
51
|
end
|
|
50
52
|
|
|
53
|
+
# @rbs return: void
|
|
51
54
|
def setup_data
|
|
52
55
|
@data.each do |(name, data_points, color)|
|
|
53
56
|
if data_points.empty?
|
data/lib/gruff/line.rb
CHANGED
|
@@ -51,6 +51,7 @@ class Gruff::Line < Gruff::Base
|
|
|
51
51
|
#
|
|
52
52
|
# The preferred way is to call {#hide_dots=} or {#hide_lines=} instead.
|
|
53
53
|
#
|
|
54
|
+
# @rbs *args: untyped
|
|
54
55
|
# @rbs return: void
|
|
55
56
|
def initialize(*args)
|
|
56
57
|
raise ArgumentError, 'Wrong number of arguments' if args.length > 2
|
|
@@ -74,6 +75,7 @@ class Gruff::Line < Gruff::Base
|
|
|
74
75
|
# Set a value for a baseline reference line..
|
|
75
76
|
#
|
|
76
77
|
# @rbs new_value: Float | Integer
|
|
78
|
+
# @rbs return: Float | Integer
|
|
77
79
|
def baseline_value=(new_value)
|
|
78
80
|
@reference_lines[:baseline] ||= {}
|
|
79
81
|
@reference_lines[:baseline][:value] = new_value
|
|
@@ -87,6 +89,7 @@ class Gruff::Line < Gruff::Base
|
|
|
87
89
|
end
|
|
88
90
|
|
|
89
91
|
# @rbs new_value: Float | Integer
|
|
92
|
+
# @rbs return: Float | Integer
|
|
90
93
|
def baseline_color=(new_value)
|
|
91
94
|
@reference_lines[:baseline] ||= {}
|
|
92
95
|
@reference_lines[:baseline][:color] = new_value
|
|
@@ -115,6 +118,7 @@ class Gruff::Line < Gruff::Base
|
|
|
115
118
|
#
|
|
116
119
|
# @example
|
|
117
120
|
# data("Bart S.", [95, 45, 78, 89, 88, 76], '#ffcc00')
|
|
121
|
+
# @rbs return: void
|
|
118
122
|
def data(name, data_points = [], color = nil)
|
|
119
123
|
store.add(name, nil, data_points, color)
|
|
120
124
|
end
|
|
@@ -158,6 +162,7 @@ class Gruff::Line < Gruff::Base
|
|
|
158
162
|
# @rbs x_data_points: Array[nil | Float | Integer] | Array[[nil | Float | Integer, nil | Float | Integer]] | nil
|
|
159
163
|
# @rbs y_data_points: Array[nil | Float | Integer] | nil | String
|
|
160
164
|
# @rbs color: String
|
|
165
|
+
# @rbs return: void
|
|
161
166
|
def dataxy(name, x_data_points = [], y_data_points = [], color = nil)
|
|
162
167
|
# make sure it's an array
|
|
163
168
|
x_data_points = Array(x_data_points)
|
|
@@ -179,10 +184,12 @@ class Gruff::Line < Gruff::Base
|
|
|
179
184
|
|
|
180
185
|
private
|
|
181
186
|
|
|
187
|
+
# @rbs return: void
|
|
182
188
|
def initialize_store
|
|
183
189
|
@store = Gruff::Store.new(Gruff::Store::XYData)
|
|
184
190
|
end
|
|
185
191
|
|
|
192
|
+
# @rbs return: void
|
|
186
193
|
def initialize_attributes
|
|
187
194
|
super
|
|
188
195
|
@reference_lines = {}
|
|
@@ -201,22 +208,33 @@ private
|
|
|
201
208
|
@show_vertical_markers = false
|
|
202
209
|
end
|
|
203
210
|
|
|
211
|
+
# @rbs reference_line: Hash[Symbol, untyped]
|
|
212
|
+
# @rbs left: Float | Integer
|
|
213
|
+
# @rbs right: Float | Integer
|
|
214
|
+
# @rbs top: Float | Integer
|
|
215
|
+
# @rbs bottom: Float | Integer
|
|
216
|
+
# @rbs return: void
|
|
204
217
|
def draw_reference_line(reference_line, left, right, top, bottom)
|
|
205
218
|
color = reference_line[:color] || @reference_line_default_color
|
|
206
219
|
width = reference_line[:width] || @reference_line_default_width
|
|
207
220
|
Gruff::Renderer::DashLine.new(renderer, color: color, width: width).render(left, top, right, bottom)
|
|
208
221
|
end
|
|
209
222
|
|
|
223
|
+
# @rbs reference_line: Hash[Symbol, untyped]
|
|
224
|
+
# @rbs return: void
|
|
210
225
|
def draw_horizontal_reference_line(reference_line)
|
|
211
226
|
level = @graph_top + (@graph_height - (reference_line[:norm_value] * @graph_height))
|
|
212
227
|
draw_reference_line(reference_line, @graph_left, @graph_left + @graph_width, level, level)
|
|
213
228
|
end
|
|
214
229
|
|
|
230
|
+
# @rbs reference_line: Hash[Symbol, untyped]
|
|
231
|
+
# @rbs return: void
|
|
215
232
|
def draw_vertical_reference_line(reference_line)
|
|
216
233
|
index = @graph_left + (@x_increment * reference_line[:index])
|
|
217
234
|
draw_reference_line(reference_line, index, index, @graph_top, @graph_top + @graph_height)
|
|
218
235
|
end
|
|
219
236
|
|
|
237
|
+
# @rbs return: void
|
|
220
238
|
def draw_graph
|
|
221
239
|
# Check to see if more than one datapoint was given. NaN can result otherwise.
|
|
222
240
|
@x_increment = column_count > 1 ? @graph_width / (column_count - 1) : @graph_width
|
|
@@ -268,6 +286,7 @@ private
|
|
|
268
286
|
end
|
|
269
287
|
end
|
|
270
288
|
|
|
289
|
+
# @rbs return: void
|
|
271
290
|
def setup_data
|
|
272
291
|
# Update the global min/max values for the x data
|
|
273
292
|
@maximum_x_value = (@maximum_x_value || store.max_x).to_f
|
|
@@ -290,11 +309,13 @@ private
|
|
|
290
309
|
super
|
|
291
310
|
end
|
|
292
311
|
|
|
312
|
+
# @rbs return: void
|
|
293
313
|
def setup_drawing
|
|
294
314
|
@marker_x_count ||= column_count - 1
|
|
295
315
|
super
|
|
296
316
|
end
|
|
297
317
|
|
|
318
|
+
# @rbs return: void
|
|
298
319
|
def normalize
|
|
299
320
|
return unless data_given?
|
|
300
321
|
|
|
@@ -309,6 +330,7 @@ private
|
|
|
309
330
|
end
|
|
310
331
|
end
|
|
311
332
|
|
|
333
|
+
# @rbs return: void
|
|
312
334
|
def draw_line_markers
|
|
313
335
|
# do all of the stuff for the horizontal lines on the y-axis
|
|
314
336
|
super
|
|
@@ -320,6 +342,10 @@ private
|
|
|
320
342
|
end
|
|
321
343
|
end
|
|
322
344
|
|
|
345
|
+
# @rbs x_data: Float | Integer | nil
|
|
346
|
+
# @rbs new_x: Float | Integer
|
|
347
|
+
# @rbs index: Integer
|
|
348
|
+
# @rbs return: void
|
|
323
349
|
def draw_label_for_x_data(x_data, new_x, index)
|
|
324
350
|
if x_data.nil?
|
|
325
351
|
draw_label(new_x, index)
|
|
@@ -330,6 +356,8 @@ private
|
|
|
330
356
|
end
|
|
331
357
|
end
|
|
332
358
|
|
|
359
|
+
# @rbs data_row: Gruff::Store::XYData
|
|
360
|
+
# @rbs return: bool
|
|
333
361
|
def contains_one_point_only?(data_row)
|
|
334
362
|
data_row.y_points.compact.count == 1
|
|
335
363
|
end
|
data/lib/gruff/mini/bar.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# rbs_inline: enabled
|
|
2
3
|
|
|
3
4
|
#
|
|
4
5
|
# Makes a small bar graph suitable for display at 200px or even smaller.
|
|
@@ -17,6 +18,7 @@ private
|
|
|
17
18
|
|
|
18
19
|
include Gruff::Mini::Legend
|
|
19
20
|
|
|
21
|
+
# @rbs return: void
|
|
20
22
|
def initialize_attributes
|
|
21
23
|
super
|
|
22
24
|
|
|
@@ -30,11 +32,13 @@ private
|
|
|
30
32
|
@minimum_value = 0.0
|
|
31
33
|
end
|
|
32
34
|
|
|
35
|
+
# @rbs return: void
|
|
33
36
|
def setup_data
|
|
34
37
|
expand_canvas_for_vertical_legend # steep:ignore
|
|
35
38
|
super
|
|
36
39
|
end
|
|
37
40
|
|
|
41
|
+
# @rbs return: void
|
|
38
42
|
def draw_graph
|
|
39
43
|
super
|
|
40
44
|
draw_vertical_legend # steep:ignore
|
data/lib/gruff/mini/legend.rb
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# rbs_inline: enabled
|
|
2
3
|
|
|
3
4
|
# A module to handle the small legend.
|
|
4
5
|
# @private
|
|
5
6
|
module Gruff::Mini::Legend
|
|
6
|
-
attr_accessor :hide_mini_legend
|
|
7
|
+
attr_accessor :hide_mini_legend #: bool
|
|
8
|
+
attr_accessor :legend_position #: Symbol
|
|
7
9
|
|
|
10
|
+
# @rbs return: void
|
|
8
11
|
def initialize(*)
|
|
9
12
|
@hide_mini_legend = false
|
|
10
13
|
@legend_position = nil
|
|
@@ -12,6 +15,7 @@ module Gruff::Mini::Legend
|
|
|
12
15
|
end
|
|
13
16
|
|
|
14
17
|
# The canvas needs to be bigger so we can put the legend beneath it.
|
|
18
|
+
# @rbs return: Gruff::Renderer
|
|
15
19
|
def expand_canvas_for_vertical_legend
|
|
16
20
|
# steep:ignore:start
|
|
17
21
|
|
|
@@ -38,10 +42,12 @@ module Gruff::Mini::Legend
|
|
|
38
42
|
# steep:ignore:end
|
|
39
43
|
end
|
|
40
44
|
|
|
45
|
+
# @rbs return: Float
|
|
41
46
|
def calculate_line_height
|
|
42
47
|
calculate_caps_height(@legend_font) * 1.7 # steep:ignore
|
|
43
48
|
end
|
|
44
49
|
|
|
50
|
+
# @rbs return: Float
|
|
45
51
|
def calculate_legend_width
|
|
46
52
|
# steep:ignore:start
|
|
47
53
|
width = @legend_labels.map { |label| calculate_width(@legend_font, label) }.max
|
|
@@ -50,6 +56,7 @@ module Gruff::Mini::Legend
|
|
|
50
56
|
end
|
|
51
57
|
|
|
52
58
|
# Draw the legend beneath the existing graph.
|
|
59
|
+
# @rbs return: void
|
|
53
60
|
def draw_vertical_legend
|
|
54
61
|
# steep:ignore:start
|
|
55
62
|
return if @hide_mini_legend
|
|
@@ -87,6 +94,9 @@ module Gruff::Mini::Legend
|
|
|
87
94
|
end
|
|
88
95
|
|
|
89
96
|
# Shorten long labels so they will fit on the canvas.
|
|
97
|
+
# @rbs label: String | Symbol
|
|
98
|
+
# @rbs x_offset: Float | Integer
|
|
99
|
+
# @rbs return: String
|
|
90
100
|
def truncate_legend_label(label, x_offset)
|
|
91
101
|
# steep:ignore:start
|
|
92
102
|
truncated_label = label.to_s
|
|
@@ -95,13 +105,15 @@ module Gruff::Mini::Legend
|
|
|
95
105
|
font.size = scale(font.size)
|
|
96
106
|
max_width = @columns - scale(x_offset) - @right_margin
|
|
97
107
|
while calculate_width(font, "#{truncated_label}...") > max_width && truncated_label.length > 1
|
|
98
|
-
truncated_label = truncated_label[0..truncated_label.length - 2]
|
|
108
|
+
truncated_label = truncated_label[0..(truncated_label.length - 2)]
|
|
99
109
|
end
|
|
100
110
|
truncated_label + (truncated_label.length < label.to_s.length ? '...' : '')
|
|
101
111
|
# steep:ignore:end
|
|
102
112
|
end
|
|
103
113
|
|
|
114
|
+
# @rbs value: Float | Integer
|
|
115
|
+
# @rbs return: Float
|
|
104
116
|
def scale(value)
|
|
105
|
-
value * @scale
|
|
117
|
+
(value.to_f * @scale).to_f
|
|
106
118
|
end
|
|
107
119
|
end
|
data/lib/gruff/mini/pie.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# rbs_inline: enabled
|
|
2
3
|
|
|
3
4
|
#
|
|
4
5
|
# Makes a small pie graph suitable for display at 200px or even smaller.
|
|
@@ -16,6 +17,7 @@ private
|
|
|
16
17
|
|
|
17
18
|
include Gruff::Mini::Legend
|
|
18
19
|
|
|
20
|
+
# @rbs return: void
|
|
19
21
|
def initialize_attributes
|
|
20
22
|
super
|
|
21
23
|
|
|
@@ -27,11 +29,13 @@ private
|
|
|
27
29
|
@legend_font.size = 50.0
|
|
28
30
|
end
|
|
29
31
|
|
|
32
|
+
# @rbs return: void
|
|
30
33
|
def setup_data
|
|
31
34
|
expand_canvas_for_vertical_legend # steep:ignore
|
|
32
35
|
super
|
|
33
36
|
end
|
|
34
37
|
|
|
38
|
+
# @rbs return: void
|
|
35
39
|
def draw_graph
|
|
36
40
|
super
|
|
37
41
|
draw_vertical_legend # steep:ignore
|
data/lib/gruff/mini/side_bar.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# rbs_inline: enabled
|
|
2
3
|
|
|
3
4
|
#
|
|
4
5
|
# Makes a small side bar graph suitable for display at 200px or even smaller.
|
|
@@ -24,6 +25,7 @@ private
|
|
|
24
25
|
|
|
25
26
|
include Gruff::Mini::Legend
|
|
26
27
|
|
|
28
|
+
# @rbs return: void
|
|
27
29
|
def initialize_attributes
|
|
28
30
|
super
|
|
29
31
|
@hide_legend = true
|
|
@@ -34,11 +36,13 @@ private
|
|
|
34
36
|
@legend_font.size = 50.0
|
|
35
37
|
end
|
|
36
38
|
|
|
39
|
+
# @rbs return: void
|
|
37
40
|
def setup_data
|
|
38
41
|
expand_canvas_for_vertical_legend # steep:ignore
|
|
39
42
|
super
|
|
40
43
|
end
|
|
41
44
|
|
|
45
|
+
# @rbs return: void
|
|
42
46
|
def draw_graph
|
|
43
47
|
super
|
|
44
48
|
draw_vertical_legend # steep:ignore
|
data/lib/gruff/net.rb
CHANGED
|
@@ -34,6 +34,7 @@ class Gruff::Net < Gruff::Base
|
|
|
34
34
|
|
|
35
35
|
private
|
|
36
36
|
|
|
37
|
+
# @rbs return: void
|
|
37
38
|
def initialize_attributes
|
|
38
39
|
super
|
|
39
40
|
|
|
@@ -45,11 +46,13 @@ private
|
|
|
45
46
|
@marker_font.bold = true
|
|
46
47
|
end
|
|
47
48
|
|
|
49
|
+
# @rbs return: void
|
|
48
50
|
def setup_drawing
|
|
49
51
|
@center_labels_over_point = false
|
|
50
52
|
super
|
|
51
53
|
end
|
|
52
54
|
|
|
55
|
+
# @rbs return: void
|
|
53
56
|
def setup_graph_measurements
|
|
54
57
|
super
|
|
55
58
|
|
|
@@ -60,6 +63,7 @@ private
|
|
|
60
63
|
@center_y = @graph_top + (@graph_height / 2.0) + 10
|
|
61
64
|
end
|
|
62
65
|
|
|
66
|
+
# @rbs return: void
|
|
63
67
|
def draw_graph
|
|
64
68
|
store.norm_data.each do |data_row|
|
|
65
69
|
poly_points = []
|
|
@@ -94,11 +98,12 @@ private
|
|
|
94
98
|
end
|
|
95
99
|
|
|
96
100
|
# the lines connecting in the center, with the first line vertical
|
|
101
|
+
# @rbs return: void
|
|
97
102
|
def draw_line_markers
|
|
98
103
|
return if @hide_line_markers
|
|
99
104
|
|
|
100
105
|
# Draw horizontal line markers and annotate with numbers
|
|
101
|
-
(0..column_count - 1).each do |index|
|
|
106
|
+
(0..(column_count - 1)).each do |index|
|
|
102
107
|
rad_pos = index * Math::PI * 2 / column_count
|
|
103
108
|
|
|
104
109
|
Gruff::Renderer::Line.new(renderer, color: @marker_color)
|
|
@@ -114,6 +119,7 @@ private
|
|
|
114
119
|
# @rbs angle: Float | Integer
|
|
115
120
|
# @rbs radius: Float
|
|
116
121
|
# @rbs amount: String | Integer
|
|
122
|
+
# @rbs return: void
|
|
117
123
|
def draw_label(center_x, center_y, angle, radius, amount)
|
|
118
124
|
x_offset = center_x # + 15 # The label points need to be tweaked slightly
|
|
119
125
|
y_offset = center_y # + 0 # This one doesn't though
|
data/lib/gruff/patch/rmagick.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# rbs_inline: enabled
|
|
2
3
|
|
|
3
4
|
# @private
|
|
4
5
|
module Magick
|
|
@@ -6,6 +7,14 @@ module Magick
|
|
|
6
7
|
module GruffAnnotate
|
|
7
8
|
refine Draw do
|
|
8
9
|
# Additional method to scale annotation text since Draw.scale doesn't.
|
|
10
|
+
# @rbs img: untyped
|
|
11
|
+
# @rbs width: Integer
|
|
12
|
+
# @rbs height: Integer
|
|
13
|
+
# @rbs x: Integer
|
|
14
|
+
# @rbs y: Integer
|
|
15
|
+
# @rbs text: String
|
|
16
|
+
# @rbs scale: Float
|
|
17
|
+
# @rbs return: void
|
|
9
18
|
def annotate_scaled(img, width, height, x, y, text, scale)
|
|
10
19
|
scaled_width = [(width * scale), 1].max
|
|
11
20
|
scaled_height = [(height * scale), 1].max
|
|
@@ -22,6 +31,8 @@ module Magick
|
|
|
22
31
|
# FIXME(uwe): We should NOT need to implement this method.
|
|
23
32
|
# Remove this method as soon as RMagick4J Issue #16 is fixed.
|
|
24
33
|
# https://github.com/Serabe/RMagick4J/issues/16
|
|
34
|
+
# @rbs fill: String | Symbol
|
|
35
|
+
# @rbs return: void
|
|
25
36
|
def fill=(fill)
|
|
26
37
|
fill = { white: '#FFFFFF' }[fill.to_sym] || fill
|
|
27
38
|
@draw.fill = Magick4J.ColorDatabase.query_default(fill)
|
data/lib/gruff/patch/string.rb
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# rbs_inline: enabled
|
|
2
3
|
|
|
3
4
|
# @private
|
|
4
5
|
module String::GruffCommify
|
|
@@ -7,6 +8,8 @@ module String::GruffCommify
|
|
|
7
8
|
|
|
8
9
|
refine String do
|
|
9
10
|
# Taken from http://codesnippets.joyent.com/posts/show/330
|
|
11
|
+
# @rbs delimiter: String
|
|
12
|
+
# @rbs return: String
|
|
10
13
|
def commify(delimiter = THOUSAND_SEPARATOR)
|
|
11
14
|
gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{delimiter}") # steep:ignore
|
|
12
15
|
end
|