gruff 0.29.0-java → 0.31.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/.github/workflows/release.yml +24 -0
- data/.rubocop.yml +15 -0
- data/.rubocop_todo.yml +11 -0
- data/CHANGELOG.md +9 -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 +13 -3
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
|
data/lib/gruff/pie.rb
CHANGED
|
@@ -41,6 +41,8 @@ class Gruff::Pie < Gruff::Base
|
|
|
41
41
|
# Can be used to make the pie start cutting slices at the top (-90.0)
|
|
42
42
|
# or at another angle. Default is +-90.0+, which starts at 3 o'clock.
|
|
43
43
|
# @deprecated Please use {#start_degree=} instead.
|
|
44
|
+
# @rbs value: Float | Integer
|
|
45
|
+
# @rbs return: void
|
|
44
46
|
def zero_degree=(value)
|
|
45
47
|
warn '#zero_degree= is deprecated. Please use `start_degree` attribute instead'
|
|
46
48
|
@start_degree = value
|
|
@@ -48,6 +50,7 @@ class Gruff::Pie < Gruff::Base
|
|
|
48
50
|
|
|
49
51
|
private
|
|
50
52
|
|
|
53
|
+
# @rbs return: void
|
|
51
54
|
def initialize_attributes
|
|
52
55
|
super
|
|
53
56
|
@start_degree = -90.0
|
|
@@ -63,11 +66,13 @@ private
|
|
|
63
66
|
@label_formatting = ->(value, percentage) { @show_values_as_labels ? value.to_s : "#{percentage}%" }
|
|
64
67
|
end
|
|
65
68
|
|
|
69
|
+
# @rbs return: void
|
|
66
70
|
def setup_drawing
|
|
67
71
|
@center_labels_over_point = false
|
|
68
72
|
super
|
|
69
73
|
end
|
|
70
74
|
|
|
75
|
+
# @rbs return: void
|
|
71
76
|
def draw_graph
|
|
72
77
|
slices.each do |slice|
|
|
73
78
|
if slice.value > 0
|
|
@@ -79,6 +84,7 @@ private
|
|
|
79
84
|
end
|
|
80
85
|
end
|
|
81
86
|
|
|
87
|
+
# @rbs return: Array[Gruff::Pie::PieSlice]
|
|
82
88
|
def slices
|
|
83
89
|
@slices ||= begin
|
|
84
90
|
slices = store.data.map { |data| Gruff::Pie::PieSlice.new(data.label, data.points.first, data.color) }
|
|
@@ -93,6 +99,7 @@ private
|
|
|
93
99
|
# General Helper Methods
|
|
94
100
|
|
|
95
101
|
# @rbs degrees: Float | Integer
|
|
102
|
+
# @rbs return: void
|
|
96
103
|
def update_chart_degrees_with(degrees)
|
|
97
104
|
@chart_degrees = chart_degrees + degrees
|
|
98
105
|
end
|
|
@@ -150,6 +157,7 @@ private
|
|
|
150
157
|
# Label-Related Methods
|
|
151
158
|
|
|
152
159
|
# @rbs slice: Gruff::Pie::PieSlice
|
|
160
|
+
# @rbs return: void
|
|
153
161
|
def process_label_for(slice)
|
|
154
162
|
if slice.percentage >= @hide_labels_less_than
|
|
155
163
|
x, y = label_coordinates_for slice
|
data/lib/gruff/renderer/dot.rb
CHANGED
|
@@ -22,6 +22,7 @@ module Gruff
|
|
|
22
22
|
# @rbs new_x: Float | Integer
|
|
23
23
|
# @rbs new_y: Float | Integer
|
|
24
24
|
# @rbs radius: Float | Integer
|
|
25
|
+
# @rbs return: void
|
|
25
26
|
def render(new_x, new_y, radius)
|
|
26
27
|
@renderer.draw.push
|
|
27
28
|
@renderer.draw.stroke_width(@width)
|
|
@@ -41,10 +42,18 @@ module Gruff
|
|
|
41
42
|
|
|
42
43
|
private
|
|
43
44
|
|
|
45
|
+
# @rbs new_x: Float | Integer
|
|
46
|
+
# @rbs new_y: Float | Integer
|
|
47
|
+
# @rbs radius: Float | Integer
|
|
48
|
+
# @rbs return: void
|
|
44
49
|
def circle(new_x, new_y, radius)
|
|
45
50
|
@renderer.draw.circle(new_x, new_y, new_x - radius, new_y)
|
|
46
51
|
end
|
|
47
52
|
|
|
53
|
+
# @rbs new_x: Float | Integer
|
|
54
|
+
# @rbs new_y: Float | Integer
|
|
55
|
+
# @rbs radius: Float | Integer
|
|
56
|
+
# @rbs return: void
|
|
48
57
|
def square(new_x, new_y, radius)
|
|
49
58
|
corner1 = new_x - radius
|
|
50
59
|
corner2 = new_y - radius
|
|
@@ -53,6 +62,10 @@ module Gruff
|
|
|
53
62
|
@renderer.draw.rectangle(corner1, corner2, corner3, corner4)
|
|
54
63
|
end
|
|
55
64
|
|
|
65
|
+
# @rbs new_x: Float | Integer
|
|
66
|
+
# @rbs new_y: Float | Integer
|
|
67
|
+
# @rbs radius: Float | Integer
|
|
68
|
+
# @rbs return: void
|
|
56
69
|
def diamond(new_x, new_y, radius)
|
|
57
70
|
polygon = []
|
|
58
71
|
polygon += [new_x - radius, new_y]
|
|
@@ -21,6 +21,7 @@ module Gruff
|
|
|
21
21
|
# @rbs height: Float | Integer
|
|
22
22
|
# @rbs arc_start: Float | Integer
|
|
23
23
|
# @rbs arc_end: Float | Integer
|
|
24
|
+
# @rbs return: void
|
|
24
25
|
def render(origin_x, origin_y, width, height, arc_start, arc_end)
|
|
25
26
|
@renderer.draw.push
|
|
26
27
|
@renderer.draw.stroke_width(@width)
|
data/lib/gruff/renderer/line.rb
CHANGED
|
@@ -21,12 +21,19 @@ module Gruff
|
|
|
21
21
|
# @rbs start_y: Float | Integer
|
|
22
22
|
# @rbs end_x: Float | Integer
|
|
23
23
|
# @rbs end_y: Float | Integer
|
|
24
|
+
# @rbs return: void
|
|
24
25
|
def render(start_x, start_y, end_x, end_y)
|
|
25
26
|
render_line(start_x, start_y, end_x, end_y, @color)
|
|
26
27
|
end
|
|
27
28
|
|
|
28
29
|
private
|
|
29
30
|
|
|
31
|
+
# @rbs start_x: Float | Integer
|
|
32
|
+
# @rbs start_y: Float | Integer
|
|
33
|
+
# @rbs end_x: Float | Integer
|
|
34
|
+
# @rbs end_y: Float | Integer
|
|
35
|
+
# @rbs color: String
|
|
36
|
+
# @rbs return: void
|
|
30
37
|
def render_line(start_x, start_y, end_x, end_y, color)
|
|
31
38
|
# FIXME(uwe): Workaround for Issue #66
|
|
32
39
|
# https://github.com/topfunky/gruff/issues/66
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
+
# rbs_inline: enabled
|
|
2
3
|
|
|
3
4
|
module Gruff
|
|
4
5
|
# @private
|
|
@@ -16,6 +17,7 @@ module Gruff
|
|
|
16
17
|
end
|
|
17
18
|
|
|
18
19
|
# @rbs points: Array[Float | Integer]
|
|
20
|
+
# @rbs return: void
|
|
19
21
|
def render(points)
|
|
20
22
|
@renderer.draw.push
|
|
21
23
|
@renderer.draw.stroke_width(@width)
|
|
@@ -21,6 +21,7 @@ module Gruff
|
|
|
21
21
|
# @rbs upper_left_y: Float | Integer
|
|
22
22
|
# @rbs lower_right_x: Float | Integer
|
|
23
23
|
# @rbs lower_right_y: Float | Integer
|
|
24
|
+
# @rbs return: void
|
|
24
25
|
def render(upper_left_x, upper_left_y, lower_right_x, lower_right_y)
|
|
25
26
|
@renderer.draw.push
|
|
26
27
|
@renderer.draw.stroke_width(@width)
|
|
@@ -6,9 +6,9 @@ module Gruff
|
|
|
6
6
|
# @private
|
|
7
7
|
class Renderer
|
|
8
8
|
attr_accessor :text_renderers #: Array[Gruff::Renderer::Text]
|
|
9
|
-
attr_reader :draw
|
|
10
|
-
attr_reader :image
|
|
11
|
-
attr_reader :scale #:
|
|
9
|
+
attr_reader :draw #: untyped
|
|
10
|
+
attr_reader :image #: untyped
|
|
11
|
+
attr_reader :scale #: Float | Integer
|
|
12
12
|
|
|
13
13
|
# @rbs columns: Integer
|
|
14
14
|
# @rbs rows: Integer
|
|
@@ -24,6 +24,7 @@ module Gruff
|
|
|
24
24
|
@image = background(columns, rows, scale, theme_options)
|
|
25
25
|
end
|
|
26
26
|
|
|
27
|
+
# @rbs return: void
|
|
27
28
|
def finish
|
|
28
29
|
@draw.draw(@image)
|
|
29
30
|
|
|
@@ -34,12 +35,18 @@ module Gruff
|
|
|
34
35
|
|
|
35
36
|
# @rbs columns: Integer
|
|
36
37
|
# @rbs rows: Integer
|
|
38
|
+
# @rbs return: void
|
|
37
39
|
def transparent_background(columns, rows)
|
|
38
40
|
@image = render_transparent_background(columns, rows)
|
|
39
41
|
end
|
|
40
42
|
|
|
41
43
|
private
|
|
42
44
|
|
|
45
|
+
# @rbs columns: Integer
|
|
46
|
+
# @rbs rows: Integer
|
|
47
|
+
# @rbs scale: Float | Integer
|
|
48
|
+
# @rbs theme_options: ::Hash[Symbol, untyped]
|
|
49
|
+
# @rbs return: void
|
|
43
50
|
def background(columns, rows, scale, theme_options)
|
|
44
51
|
return image_background(scale, *theme_options[:background_image]) if theme_options[:background_image] # steep:ignore
|
|
45
52
|
|
|
@@ -54,6 +61,9 @@ module Gruff
|
|
|
54
61
|
end
|
|
55
62
|
|
|
56
63
|
# Use with a theme to use an image (800x600 original) background.
|
|
64
|
+
# @rbs scale: Float | Integer
|
|
65
|
+
# @rbs image_path: String
|
|
66
|
+
# @rbs return: untyped
|
|
57
67
|
def image_background(scale, image_path)
|
|
58
68
|
image = Magick::Image.read(image_path)
|
|
59
69
|
if scale != 1.0
|
|
@@ -63,6 +73,10 @@ module Gruff
|
|
|
63
73
|
end
|
|
64
74
|
|
|
65
75
|
# Make a new image at the current size with a solid +color+.
|
|
76
|
+
# @rbs columns: Integer
|
|
77
|
+
# @rbs rows: Integer
|
|
78
|
+
# @rbs color: String
|
|
79
|
+
# @rbs return: void
|
|
66
80
|
def solid_background(columns, rows, color)
|
|
67
81
|
Magick::Image.new(columns, rows) do |img|
|
|
68
82
|
img.background_color = color
|
|
@@ -70,6 +84,12 @@ module Gruff
|
|
|
70
84
|
end
|
|
71
85
|
|
|
72
86
|
# Use with a theme definition method to draw a gradated background.
|
|
87
|
+
# @rbs columns: Integer
|
|
88
|
+
# @rbs rows: Integer
|
|
89
|
+
# @rbs top_color: String
|
|
90
|
+
# @rbs bottom_color: String
|
|
91
|
+
# @rbs direct: Symbol
|
|
92
|
+
# @rbs return: void
|
|
73
93
|
def gradated_background(columns, rows, top_color, bottom_color, direct = :top_bottom)
|
|
74
94
|
gradient_fill = begin
|
|
75
95
|
case direct
|
|
@@ -105,6 +125,9 @@ module Gruff
|
|
|
105
125
|
end
|
|
106
126
|
|
|
107
127
|
# Use with a theme to make a transparent background
|
|
128
|
+
# @rbs columns: Integer
|
|
129
|
+
# @rbs rows: Integer
|
|
130
|
+
# @rbs return: void
|
|
108
131
|
def render_transparent_background(columns, rows)
|
|
109
132
|
Magick::Image.new(columns, rows) do |img|
|
|
110
133
|
img.background_color = 'transparent'
|
data/lib/gruff/renderer/text.rb
CHANGED
|
@@ -11,6 +11,7 @@ module Gruff
|
|
|
11
11
|
# @rbs text: String
|
|
12
12
|
# @rbs font: Gruff::Font
|
|
13
13
|
# @rbs rotation: Float | Integer
|
|
14
|
+
# @rbs return: void
|
|
14
15
|
def initialize(renderer, text, font:, rotation: nil)
|
|
15
16
|
@renderer = renderer
|
|
16
17
|
@text = text.to_s
|
|
@@ -19,13 +20,14 @@ module Gruff
|
|
|
19
20
|
end
|
|
20
21
|
|
|
21
22
|
attr_reader :width, :height, :x, :y #: Float | Integer
|
|
22
|
-
attr_reader :gravity
|
|
23
|
+
attr_reader :gravity #: untyped
|
|
23
24
|
|
|
24
25
|
# @rbs width: Float | Integer
|
|
25
26
|
# @rbs height: Float | Integer
|
|
26
27
|
# @rbs x: Float | Integer
|
|
27
28
|
# @rbs y: Float | Integer
|
|
28
29
|
# @rbs gravity: untyped
|
|
30
|
+
# @rbs return: void
|
|
29
31
|
def add_to_render_queue(width, height, x, y, gravity = Magick::NorthGravity)
|
|
30
32
|
@width = width
|
|
31
33
|
@height = height
|
|
@@ -41,6 +43,7 @@ module Gruff
|
|
|
41
43
|
# @rbs x: Float | Integer
|
|
42
44
|
# @rbs y: Float | Integer
|
|
43
45
|
# @rbs gravity: untyped
|
|
46
|
+
# @rbs return: void
|
|
44
47
|
def render(width, height, x, y, gravity = Magick::NorthGravity)
|
|
45
48
|
@renderer.draw.push
|
|
46
49
|
@renderer.draw.rotation = @rotation if @rotation
|
|
@@ -58,6 +61,7 @@ module Gruff
|
|
|
58
61
|
@renderer.draw.pop
|
|
59
62
|
end
|
|
60
63
|
|
|
64
|
+
# @rbs return: untyped
|
|
61
65
|
def metrics
|
|
62
66
|
@renderer.draw.push
|
|
63
67
|
@renderer.draw.font = @font.file_path
|