gruff 0.18.0-java → 0.20.0-java
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.devcontainer/devcontainer.json +26 -0
- data/.github/workflows/ci.yml +8 -8
- data/.rubocop.yml +17 -1
- data/CHANGELOG.md +12 -0
- data/README.md +1 -1
- data/gruff.gemspec +4 -4
- data/lib/gruff/bar.rb +1 -1
- data/lib/gruff/base.rb +9 -9
- data/lib/gruff/bezier.rb +4 -7
- data/lib/gruff/box.rb +4 -4
- data/lib/gruff/candlestick.rb +3 -3
- data/lib/gruff/dot.rb +1 -1
- data/lib/gruff/line.rb +18 -16
- data/lib/gruff/mini/bar.rb +19 -24
- data/lib/gruff/mini/legend.rb +93 -105
- data/lib/gruff/mini/pie.rb +18 -23
- data/lib/gruff/mini/side_bar.rb +18 -23
- data/lib/gruff/net.rb +10 -2
- data/lib/gruff/patch/rmagick.rb +2 -2
- data/lib/gruff/renderer/bezier.rb +1 -1
- data/lib/gruff/renderer/circle.rb +3 -3
- data/lib/gruff/renderer/dash_line.rb +1 -1
- data/lib/gruff/renderer/dot.rb +1 -1
- data/lib/gruff/renderer/line.rb +1 -1
- data/lib/gruff/renderer/polygon.rb +1 -1
- data/lib/gruff/renderer/polyline.rb +4 -2
- data/lib/gruff/scatter.rb +3 -3
- data/lib/gruff/stacked_bar.rb +1 -1
- data/lib/gruff/version.rb +1 -1
- data/lib/gruff.rb +3 -0
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0470a845dea66723f512a991696cefcec76110bc625720c9de2e06b248968dfb
|
4
|
+
data.tar.gz: d6d93d5ac547d1b588e8b936b8faf1bdbdd86b1f6b05859c62569dcc2096ddf0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d57209f9c7dc7d3739feea9d1d1cfb41afd85db57d3723a768c17f37413f689becaabba7a119f33a97ed7e4fab7a4906c8a334a8d230cee537fa164d62cd3f01
|
7
|
+
data.tar.gz: 697e7f71c16e5c8d5351144b5cd9fff0bef80a7d9f2dee100dd5e6f90daf712ca041cf8acd581830de8763b697a9c8b66b7b3ddd51df7cd40ece16fac0bc37f7
|
@@ -0,0 +1,26 @@
|
|
1
|
+
// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
|
2
|
+
// https://github.com/microsoft/vscode-dev-containers/tree/v0.245.0/containers/docker-existing-dockerfile
|
3
|
+
{
|
4
|
+
"name": "Existing Dockerfile",
|
5
|
+
|
6
|
+
// Sets the run context to one level up instead of the .devcontainer folder.
|
7
|
+
"context": "..",
|
8
|
+
|
9
|
+
// Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename.
|
10
|
+
"dockerFile": "../Dockerfile"
|
11
|
+
|
12
|
+
// Use 'forwardPorts' to make a list of ports inside the container available locally.
|
13
|
+
// "forwardPorts": [],
|
14
|
+
|
15
|
+
// Uncomment the next line to run commands after the container is created - for example installing curl.
|
16
|
+
// "postCreateCommand": "apt-get update && apt-get install -y curl",
|
17
|
+
|
18
|
+
// Uncomment when using a ptrace-based debugger like C++, Go, and Rust
|
19
|
+
// "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ],
|
20
|
+
|
21
|
+
// Uncomment to use the Docker CLI from inside the container. See https://aka.ms/vscode-remote/samples/docker-from-docker.
|
22
|
+
// "mounts": [ "source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind" ],
|
23
|
+
|
24
|
+
// Uncomment to connect as a non-root user if you've added one. See https://aka.ms/vscode-remote/containers/non-root.
|
25
|
+
// "remoteUser": "vscode"
|
26
|
+
}
|
data/.github/workflows/ci.yml
CHANGED
@@ -11,17 +11,17 @@ permissions:
|
|
11
11
|
|
12
12
|
jobs:
|
13
13
|
lint:
|
14
|
-
runs-on: ubuntu-
|
14
|
+
runs-on: ubuntu-22.04
|
15
15
|
timeout-minutes: 20
|
16
16
|
name: Lint
|
17
17
|
steps:
|
18
18
|
- uses: actions/checkout@v3
|
19
19
|
with:
|
20
20
|
ref: ${{ github.event.pull_request.head.sha }}
|
21
|
-
- name: Set up Ruby 2.
|
21
|
+
- name: Set up Ruby 2.6
|
22
22
|
uses: ruby/setup-ruby@master
|
23
23
|
with:
|
24
|
-
ruby-version: '2.
|
24
|
+
ruby-version: '2.6'
|
25
25
|
bundler-cache: true
|
26
26
|
- name: Install dependencies
|
27
27
|
run: bundle install --path=vendor/bundle --jobs 4 --retry 3
|
@@ -31,13 +31,13 @@ jobs:
|
|
31
31
|
run: bundle exec rubocop
|
32
32
|
|
33
33
|
test-ruby:
|
34
|
-
runs-on: ubuntu-
|
34
|
+
runs-on: ubuntu-22.04
|
35
35
|
timeout-minutes: 20
|
36
36
|
strategy:
|
37
37
|
matrix:
|
38
|
-
ruby-version: ['2.
|
38
|
+
ruby-version: ['2.6', '2.7', '3.0', '3.1', '3.2']
|
39
39
|
imagemagick-version:
|
40
|
-
- { full: 7.1.0-
|
40
|
+
- { full: 7.1.0-55, major-minor: '7.1' }
|
41
41
|
name: Ruby ${{ matrix.ruby-version }}
|
42
42
|
steps:
|
43
43
|
- uses: actions/checkout@v3
|
@@ -63,11 +63,11 @@ jobs:
|
|
63
63
|
run: bundle exec rake
|
64
64
|
|
65
65
|
test-jruby:
|
66
|
-
runs-on: ubuntu-
|
66
|
+
runs-on: ubuntu-22.04
|
67
67
|
timeout-minutes: 20
|
68
68
|
strategy:
|
69
69
|
matrix:
|
70
|
-
ruby-version: ['9.
|
70
|
+
ruby-version: ['9.3.10.0', '9.4.2.0']
|
71
71
|
name: JRuby ${{ matrix.ruby-version }}
|
72
72
|
steps:
|
73
73
|
- uses: actions/checkout@v3
|
data/.rubocop.yml
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
require:
|
2
|
+
- rubocop-minitest
|
2
3
|
- rubocop-performance
|
3
4
|
- rubocop-rake
|
4
5
|
|
5
6
|
AllCops:
|
6
7
|
EnabledByDefault: true
|
7
|
-
TargetRubyVersion: 2.
|
8
|
+
TargetRubyVersion: 2.6
|
8
9
|
Exclude:
|
9
10
|
- 'vendor/bundle/**/*'
|
10
11
|
- 'rails_generators/gruff/**/*'
|
@@ -12,6 +13,12 @@ AllCops:
|
|
12
13
|
Metrics:
|
13
14
|
Enabled: false
|
14
15
|
|
16
|
+
Gemspec/DependencyVersion:
|
17
|
+
Enabled: false
|
18
|
+
|
19
|
+
Gemspec/DevelopmentDependencies:
|
20
|
+
Enabled: false
|
21
|
+
|
15
22
|
Gemspec/OrderedDependencies:
|
16
23
|
Enabled: false
|
17
24
|
|
@@ -21,6 +28,9 @@ Gemspec/RequiredRubyVersion:
|
|
21
28
|
Layout/AccessModifierIndentation:
|
22
29
|
EnforcedStyle: outdent
|
23
30
|
|
31
|
+
Layout/ClassStructure:
|
32
|
+
Enabled: false
|
33
|
+
|
24
34
|
Layout/FirstMethodArgumentLineBreak:
|
25
35
|
Enabled: false
|
26
36
|
|
@@ -111,11 +121,17 @@ Style/OptionHash:
|
|
111
121
|
Style/RedundantBegin:
|
112
122
|
Enabled: false
|
113
123
|
|
124
|
+
Style/RequireOrder:
|
125
|
+
Enabled: false
|
126
|
+
|
114
127
|
Style/SingleLineBlockParams:
|
115
128
|
Enabled: false
|
116
129
|
|
117
130
|
Style/StructInheritance:
|
118
131
|
Enabled: false
|
119
132
|
|
133
|
+
Style/YodaExpression:
|
134
|
+
Enabled: false
|
135
|
+
|
120
136
|
Performance/ChainArrayAllocation:
|
121
137
|
Enabled: false
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,17 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 0.20.0
|
4
|
+
- Fix legend position when blank labels present (#614)
|
5
|
+
- Fixed NoMethodError (undefined method `format=' for Gruff::Line (#612)
|
6
|
+
- Drop Ruby 2.5 support (#611)
|
7
|
+
- Fix deprecation warning for Base#to_blob (#610)
|
8
|
+
|
9
|
+
## 0.19.0
|
10
|
+
- Draw the graph starting from zero point by default (#609)
|
11
|
+
- Improve joints in Gruff::Net using polyline method (#608)
|
12
|
+
- Improve joints in Gruff::Line using polyline method (#607)
|
13
|
+
- Adjust default font size in Gruff::Mini::{Bar, Pie}
|
14
|
+
|
3
15
|
## 0.18.0
|
4
16
|
- Add Gruff::Bubble (#604)
|
5
17
|
- Rename Gruff::BoxPlot to Gruff::Box (#603)
|
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Gruff Graphs
|
2
2
|
|
3
|
-
[![
|
3
|
+
[![CI](https://github.com/topfunky/gruff/actions/workflows/ci.yml/badge.svg)](https://github.com/topfunky/gruff/actions/workflows/ci.yml)
|
4
4
|
[![Gem Version](https://badge.fury.io/rb/gruff.svg)](https://badge.fury.io/rb/gruff)
|
5
5
|
|
6
6
|
A library for making beautiful graphs.
|
data/gruff.gemspec
CHANGED
@@ -17,19 +17,19 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.summary = 'Beautiful graphs for one or multiple datasets.'
|
18
18
|
s.license = 'MIT'
|
19
19
|
s.executables = s.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
20
|
-
s.specification_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
21
20
|
|
22
21
|
if defined? JRUBY_VERSION
|
23
22
|
s.platform = 'java'
|
24
23
|
s.add_dependency 'rmagick4j'
|
25
24
|
else
|
26
25
|
s.add_dependency 'rmagick', '>= 4.2'
|
27
|
-
s.add_development_dependency 'rubocop', '~> 1.
|
28
|
-
s.add_development_dependency 'rubocop-
|
26
|
+
s.add_development_dependency 'rubocop', '~> 1.50.2'
|
27
|
+
s.add_development_dependency 'rubocop-minitest', '~> 0.30.0'
|
28
|
+
s.add_development_dependency 'rubocop-performance', '~> 1.17.1'
|
29
29
|
s.add_development_dependency 'rubocop-rake', '~> 0.6.0'
|
30
30
|
end
|
31
31
|
s.add_dependency 'histogram'
|
32
|
-
s.required_ruby_version = '>= 2.
|
32
|
+
s.required_ruby_version = '>= 2.6.0'
|
33
33
|
|
34
34
|
s.add_development_dependency 'rake'
|
35
35
|
s.add_development_dependency 'minitest-reporters'
|
data/lib/gruff/bar.rb
CHANGED
@@ -48,7 +48,7 @@ class Gruff::Bar < Gruff::Base
|
|
48
48
|
#
|
49
49
|
# Default value is +0.9+.
|
50
50
|
def spacing_factor=(space_percent)
|
51
|
-
raise ArgumentError, 'spacing_factor must be between 0.00 and 1.00'
|
51
|
+
raise ArgumentError, 'spacing_factor must be between 0.00 and 1.00' if (space_percent < 0) || (space_percent > 1)
|
52
52
|
|
53
53
|
@spacing_factor = (1 - space_percent)
|
54
54
|
end
|
data/lib/gruff/base.rb
CHANGED
@@ -218,7 +218,7 @@ module Gruff
|
|
218
218
|
# g.labels = ['2005', nil, nil, '2006', nil, nil, '2007', nil, nil, '2008'] # same labels for columns
|
219
219
|
def labels=(labels)
|
220
220
|
if labels.is_a?(Array)
|
221
|
-
labels = labels.each_with_index.
|
221
|
+
labels = labels.each_with_index.with_object({}) do |(label, index), hash|
|
222
222
|
hash[index] = label
|
223
223
|
end
|
224
224
|
end
|
@@ -469,7 +469,8 @@ module Gruff
|
|
469
469
|
#
|
470
470
|
# Set it after you have given all your data to the graph object.
|
471
471
|
def minimum_value
|
472
|
-
|
472
|
+
min = [0.0, store.min.to_f].min
|
473
|
+
(@minimum_value || min).to_f
|
473
474
|
end
|
474
475
|
attr_writer :minimum_value
|
475
476
|
|
@@ -521,9 +522,8 @@ module Gruff
|
|
521
522
|
# @deprecated Please use +to_image.to_blob+ instead.
|
522
523
|
def to_blob(image_format = 'PNG')
|
523
524
|
warn '#to_blob is deprecated. Please use `to_image.to_blob` instead'
|
524
|
-
to_image.
|
525
|
-
|
526
|
-
end
|
525
|
+
to_image.format = image_format
|
526
|
+
to_image.to_blob
|
527
527
|
end
|
528
528
|
|
529
529
|
# Draw a graph.
|
@@ -821,7 +821,7 @@ module Gruff
|
|
821
821
|
end
|
822
822
|
|
823
823
|
def clip_value_if_greater_than(value, max_value)
|
824
|
-
value
|
824
|
+
[value, max_value].min
|
825
825
|
end
|
826
826
|
|
827
827
|
def significant(i)
|
@@ -907,7 +907,7 @@ module Gruff
|
|
907
907
|
bottom_label_width = extra_left_room_for_long_label
|
908
908
|
|
909
909
|
margin = line_number_width + y_axis_label_width
|
910
|
-
@left_margin +
|
910
|
+
@left_margin + [margin, bottom_label_width].max
|
911
911
|
end
|
912
912
|
|
913
913
|
def setup_right_margin
|
@@ -1035,7 +1035,7 @@ module Gruff
|
|
1035
1035
|
def calculate_legend_label_widths_for_each_line(legend_labels, legend_square_width)
|
1036
1036
|
label_widths = [[]]
|
1037
1037
|
label_lines = [[]]
|
1038
|
-
legend_labels.each do |label|
|
1038
|
+
legend_labels.reject(&:empty?).each do |label|
|
1039
1039
|
width = calculate_width(@legend_font, label)
|
1040
1040
|
label_width = width + (legend_square_width * 2.7)
|
1041
1041
|
label_widths.last.push label_width
|
@@ -1129,7 +1129,7 @@ module Gruff
|
|
1129
1129
|
-(width / 2.0)
|
1130
1130
|
end
|
1131
1131
|
end
|
1132
|
-
y_offset = (height / 2.0)
|
1132
|
+
y_offset = [(height / 2.0), margin].max
|
1133
1133
|
|
1134
1134
|
[x_offset, y_offset]
|
1135
1135
|
end
|
data/lib/gruff/bezier.rb
CHANGED
@@ -24,6 +24,9 @@ private
|
|
24
24
|
def draw_graph
|
25
25
|
x_increment = (@graph_width / (column_count - 1)).to_f
|
26
26
|
|
27
|
+
renderer_class = RUBY_PLATFORM == 'java' ? Gruff::Renderer::Polyline : Gruff::Renderer::Bezier
|
28
|
+
stroke_width = clip_value_if_greater_than(@columns / (store.norm_data.first[1].size * 4.0), 5.0)
|
29
|
+
|
27
30
|
store.norm_data.each do |data_row|
|
28
31
|
next if data_row[1].empty?
|
29
32
|
|
@@ -45,13 +48,7 @@ private
|
|
45
48
|
draw_label(new_x, index)
|
46
49
|
end
|
47
50
|
|
48
|
-
|
49
|
-
|
50
|
-
if RUBY_PLATFORM == 'java'
|
51
|
-
Gruff::Renderer::Polyline.new(renderer, color: data_row.color, width: stroke_width).render(poly_points)
|
52
|
-
else
|
53
|
-
Gruff::Renderer::Bezier.new(renderer, color: data_row.color, width: stroke_width).render(poly_points)
|
54
|
-
end
|
51
|
+
renderer_class.new(renderer, color: data_row.color, width: stroke_width).render(poly_points)
|
55
52
|
end
|
56
53
|
end
|
57
54
|
end
|
data/lib/gruff/box.rb
CHANGED
@@ -23,7 +23,7 @@ class Gruff::Box < Gruff::Base
|
|
23
23
|
#
|
24
24
|
# Default value is +0.8+.
|
25
25
|
def spacing_factor=(space_percent)
|
26
|
-
raise ArgumentError, 'spacing_factor must be between 0.00 and 1.00'
|
26
|
+
raise ArgumentError, 'spacing_factor must be between 0.00 and 1.00' if (space_percent < 0) || (space_percent > 1)
|
27
27
|
|
28
28
|
@spacing_factor = (1 - space_percent)
|
29
29
|
end
|
@@ -134,7 +134,7 @@ private
|
|
134
134
|
end
|
135
135
|
|
136
136
|
def median
|
137
|
-
if points.
|
137
|
+
if points.empty?
|
138
138
|
0
|
139
139
|
elsif points.size.odd?
|
140
140
|
points[points.size / 2]
|
@@ -144,7 +144,7 @@ private
|
|
144
144
|
end
|
145
145
|
|
146
146
|
def first_quartile
|
147
|
-
if points.
|
147
|
+
if points.empty?
|
148
148
|
0
|
149
149
|
elsif points.size.odd?
|
150
150
|
points[points.size / 4]
|
@@ -154,7 +154,7 @@ private
|
|
154
154
|
end
|
155
155
|
|
156
156
|
def third_quartile
|
157
|
-
if points.
|
157
|
+
if points.empty?
|
158
158
|
0
|
159
159
|
elsif points.size.odd?
|
160
160
|
points[(points.size * 3) / 4]
|
data/lib/gruff/candlestick.rb
CHANGED
@@ -33,7 +33,7 @@ class Gruff::Candlestick < Gruff::Base
|
|
33
33
|
#
|
34
34
|
# Default value is +0.9+.
|
35
35
|
def spacing_factor=(space_percent)
|
36
|
-
raise ArgumentError, 'spacing_factor must be between 0.00 and 1.00'
|
36
|
+
raise ArgumentError, 'spacing_factor must be between 0.00 and 1.00' if (space_percent < 0) || (space_percent > 1)
|
37
37
|
|
38
38
|
@spacing_factor = (1 - space_percent)
|
39
39
|
end
|
@@ -90,10 +90,10 @@ private
|
|
90
90
|
Gruff::Renderer::Rectangle.new(renderer, color: color, opacity: @fill_opacity, width: @stroke_width).render(left_x, open_y, right_x, close_y)
|
91
91
|
|
92
92
|
low_y, = conversion.get_top_bottom_scaled(candlestick.low)
|
93
|
-
y = open_y
|
93
|
+
y = [open_y, close_y].max
|
94
94
|
Gruff::Renderer::Line.new(renderer, color: color, width: @stroke_width).render(center_x, low_y, center_x, y)
|
95
95
|
high_y, = conversion.get_top_bottom_scaled(candlestick.high)
|
96
|
-
y = open_y
|
96
|
+
y = [open_y, close_y].min
|
97
97
|
Gruff::Renderer::Line.new(renderer, color: color, width: @stroke_width).render(center_x, y, center_x, high_y)
|
98
98
|
end
|
99
99
|
end
|
data/lib/gruff/dot.rb
CHANGED
@@ -29,7 +29,7 @@ private
|
|
29
29
|
|
30
30
|
items_width = @graph_height / column_count
|
31
31
|
item_width = items_width * spacing_factor / store.length
|
32
|
-
padding = (items_width * (1 - spacing_factor)) / 2
|
32
|
+
padding = (items_width * (1 - spacing_factor)) / 2.0
|
33
33
|
|
34
34
|
store.norm_data.each_with_index do |data_row, row_index|
|
35
35
|
data_row.points.each_with_index do |data_point, point_index|
|
data/lib/gruff/line.rb
CHANGED
@@ -208,12 +208,15 @@ private
|
|
208
208
|
draw_vertical_reference_line(curr_reference_line) if curr_reference_line.key?(:index)
|
209
209
|
end
|
210
210
|
|
211
|
-
store.norm_data.
|
212
|
-
|
211
|
+
stroke_width = @line_width || clip_value_if_greater_than(@columns / (store.norm_data.first.y_points.size * 4.0), 5.0)
|
212
|
+
circle_radius = @dot_radius || clip_value_if_greater_than(@columns / (store.norm_data.first.y_points.size * 2.5), 5.0)
|
213
213
|
|
214
|
-
|
214
|
+
store.norm_data.each do |data_row|
|
215
|
+
poly_points_group = [[]]
|
215
216
|
|
216
217
|
data_row.coordinates.each_with_index do |(x_data, y_data), index|
|
218
|
+
poly_points = poly_points_group.last
|
219
|
+
|
217
220
|
new_x = begin
|
218
221
|
if x_data.nil?
|
219
222
|
# use the old method: equally spaced points along the x-axis
|
@@ -224,28 +227,27 @@ private
|
|
224
227
|
end
|
225
228
|
draw_label_for_x_data(x_data, new_x, index)
|
226
229
|
|
227
|
-
unless y_data
|
228
|
-
|
230
|
+
unless y_data
|
231
|
+
# we can't draw a line for a null data point, we can still label the axis though.
|
232
|
+
# Split the polygonal line into separate groups of points for polyline.
|
233
|
+
poly_points_group << []
|
229
234
|
next
|
230
235
|
end
|
231
236
|
|
232
237
|
new_y = @graph_top + (@graph_height - (y_data * @graph_height))
|
233
238
|
|
234
|
-
|
235
|
-
|
236
|
-
circle_radius = @dot_radius || clip_value_if_greater_than(@columns / (store.norm_data.first.y_points.size * 2.5), 5.0)
|
239
|
+
poly_points << new_x
|
240
|
+
poly_points << new_y
|
237
241
|
|
238
|
-
if
|
239
|
-
Gruff::Renderer::Line.new(renderer, color: data_row.color, width: stroke_width)
|
240
|
-
.render(prev_x, prev_y, new_x, new_y)
|
241
|
-
end
|
242
|
-
|
243
|
-
if one_point || !@hide_dots
|
242
|
+
if contains_one_point_only?(data_row) || !@hide_dots
|
244
243
|
Gruff::Renderer::Dot.new(renderer, @dot_style, color: data_row.color, width: stroke_width).render(new_x, new_y, circle_radius)
|
245
244
|
end
|
245
|
+
end
|
246
246
|
|
247
|
-
|
248
|
-
|
247
|
+
unless @hide_lines
|
248
|
+
poly_points_group.each do |poly_points|
|
249
|
+
Gruff::Renderer::Polyline.new(renderer, color: data_row.color, width: stroke_width).render(poly_points) unless poly_points.empty?
|
250
|
+
end
|
249
251
|
end
|
250
252
|
end
|
251
253
|
end
|
data/lib/gruff/mini/bar.rb
CHANGED
@@ -12,36 +12,31 @@
|
|
12
12
|
# g.data :Science, [2, 15, 8, 11]
|
13
13
|
# g.write('mini_bar.png')
|
14
14
|
#
|
15
|
-
|
16
|
-
|
17
|
-
# A class for drawing a small bar graph.
|
18
|
-
class Bar < Gruff::Bar
|
19
|
-
private
|
15
|
+
class Gruff::Mini::Bar < Gruff::Bar
|
16
|
+
private
|
20
17
|
|
21
|
-
|
18
|
+
include Gruff::Mini::Legend
|
22
19
|
|
23
|
-
|
24
|
-
|
20
|
+
def initialize_attributes
|
21
|
+
super
|
25
22
|
|
26
|
-
|
27
|
-
|
28
|
-
|
23
|
+
@hide_legend = true
|
24
|
+
@hide_title = true
|
25
|
+
@hide_line_numbers = true
|
29
26
|
|
30
|
-
|
31
|
-
|
27
|
+
@marker_font.size = 50.0
|
28
|
+
@legend_font.size = 50.0
|
32
29
|
|
33
|
-
|
34
|
-
|
30
|
+
@minimum_value = 0.0
|
31
|
+
end
|
35
32
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
33
|
+
def setup_data
|
34
|
+
expand_canvas_for_vertical_legend
|
35
|
+
super
|
36
|
+
end
|
40
37
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
end
|
45
|
-
end
|
38
|
+
def draw_graph
|
39
|
+
super
|
40
|
+
draw_vertical_legend
|
46
41
|
end
|
47
42
|
end
|
data/lib/gruff/mini/legend.rb
CHANGED
@@ -1,110 +1,98 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
module
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
when :right
|
63
|
-
current_x_offset = @original_columns + @left_margin
|
64
|
-
current_y_offset = @top_margin + legend_top_margin
|
65
|
-
else
|
66
|
-
current_x_offset = @legend_left_margin
|
67
|
-
current_y_offset = @original_rows + legend_top_margin
|
68
|
-
end
|
69
|
-
|
70
|
-
@legend_labels.each_with_index do |legend_label, index|
|
71
|
-
# Draw label
|
72
|
-
x_offset = current_x_offset + (legend_square_width * 1.7)
|
73
|
-
label = truncate_legend_label(legend_label, x_offset)
|
74
|
-
text_renderer = Gruff::Renderer::Text.new(renderer, label, font: @legend_font)
|
75
|
-
text_renderer.add_to_render_queue(@raw_columns, 1.0, x_offset, current_y_offset, Magick::WestGravity)
|
76
|
-
|
77
|
-
# Now draw box with color of this dataset
|
78
|
-
rect_renderer = Gruff::Renderer::Rectangle.new(renderer, color: store.data[index].color)
|
79
|
-
rect_renderer.render(current_x_offset,
|
80
|
-
current_y_offset - (legend_square_width / 2.0),
|
81
|
-
current_x_offset + legend_square_width,
|
82
|
-
current_y_offset + (legend_square_width / 2.0))
|
83
|
-
|
84
|
-
current_y_offset += calculate_line_height
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
##
|
89
|
-
# Shorten long labels so they will fit on the canvas.
|
90
|
-
#
|
91
|
-
# Department of Hu...
|
92
|
-
|
93
|
-
def truncate_legend_label(label, x_offset)
|
94
|
-
truncated_label = label.to_s
|
95
|
-
|
96
|
-
font = @legend_font.dup
|
97
|
-
font.size = scale(font.size)
|
98
|
-
max_width = @columns - scale(x_offset) - @right_margin
|
99
|
-
while calculate_width(font, "#{truncated_label}...") > max_width && truncated_label.length > 1
|
100
|
-
truncated_label = truncated_label[0..truncated_label.length - 2]
|
101
|
-
end
|
102
|
-
truncated_label + (truncated_label.length < label.to_s.length ? '...' : '')
|
103
|
-
end
|
104
|
-
|
105
|
-
def scale(value)
|
106
|
-
value * @scale
|
107
|
-
end
|
3
|
+
# A module to handle the small legend.
|
4
|
+
# @private
|
5
|
+
module Gruff::Mini::Legend
|
6
|
+
attr_accessor :hide_mini_legend, :legend_position
|
7
|
+
|
8
|
+
def initialize(*)
|
9
|
+
@hide_mini_legend = false
|
10
|
+
@legend_position = nil
|
11
|
+
super
|
12
|
+
end
|
13
|
+
|
14
|
+
# The canvas needs to be bigger so we can put the legend beneath it.
|
15
|
+
def expand_canvas_for_vertical_legend
|
16
|
+
return if @hide_mini_legend
|
17
|
+
|
18
|
+
@legend_labels = store.data.map(&:label)
|
19
|
+
|
20
|
+
legend_height = scale((store.length * calculate_line_height) + @top_margin + @bottom_margin)
|
21
|
+
|
22
|
+
@original_rows = @raw_rows
|
23
|
+
@original_columns = @raw_columns
|
24
|
+
|
25
|
+
case @legend_position
|
26
|
+
when :right
|
27
|
+
@rows = [@rows, legend_height].max
|
28
|
+
@columns += calculate_legend_width + @left_margin
|
29
|
+
else
|
30
|
+
font = @legend_font.dup
|
31
|
+
font.size = scale(font.size)
|
32
|
+
@rows += store.length * calculate_caps_height(font) * 1.7
|
33
|
+
end
|
34
|
+
|
35
|
+
@renderer = Gruff::Renderer.new(@columns, @rows, @scale, @theme_options)
|
36
|
+
end
|
37
|
+
|
38
|
+
def calculate_line_height
|
39
|
+
calculate_caps_height(@legend_font) * 1.7
|
40
|
+
end
|
41
|
+
|
42
|
+
def calculate_legend_width
|
43
|
+
width = @legend_labels.map { |label| calculate_width(@legend_font, label) }.max
|
44
|
+
scale(width + (40 * 1.7))
|
45
|
+
end
|
46
|
+
|
47
|
+
# Draw the legend beneath the existing graph.
|
48
|
+
def draw_vertical_legend
|
49
|
+
return if @hide_mini_legend
|
50
|
+
|
51
|
+
legend_square_width = 40.0 # small square with color of this item
|
52
|
+
@legend_left_margin = 100.0
|
53
|
+
legend_top_margin = 40.0
|
54
|
+
|
55
|
+
case @legend_position
|
56
|
+
when :right
|
57
|
+
current_x_offset = @original_columns + @left_margin
|
58
|
+
current_y_offset = @top_margin + legend_top_margin
|
59
|
+
else
|
60
|
+
current_x_offset = @legend_left_margin
|
61
|
+
current_y_offset = @original_rows + legend_top_margin
|
108
62
|
end
|
63
|
+
|
64
|
+
@legend_labels.each_with_index do |legend_label, index|
|
65
|
+
# Draw label
|
66
|
+
x_offset = current_x_offset + (legend_square_width * 1.7)
|
67
|
+
label = truncate_legend_label(legend_label, x_offset)
|
68
|
+
text_renderer = Gruff::Renderer::Text.new(renderer, label, font: @legend_font)
|
69
|
+
text_renderer.add_to_render_queue(@raw_columns, 1.0, x_offset, current_y_offset, Magick::WestGravity)
|
70
|
+
|
71
|
+
# Now draw box with color of this dataset
|
72
|
+
rect_renderer = Gruff::Renderer::Rectangle.new(renderer, color: store.data[index].color)
|
73
|
+
rect_renderer.render(current_x_offset,
|
74
|
+
current_y_offset - (legend_square_width / 2.0),
|
75
|
+
current_x_offset + legend_square_width,
|
76
|
+
current_y_offset + (legend_square_width / 2.0))
|
77
|
+
|
78
|
+
current_y_offset += calculate_line_height
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
# Shorten long labels so they will fit on the canvas.
|
83
|
+
def truncate_legend_label(label, x_offset)
|
84
|
+
truncated_label = label.to_s
|
85
|
+
|
86
|
+
font = @legend_font.dup
|
87
|
+
font.size = scale(font.size)
|
88
|
+
max_width = @columns - scale(x_offset) - @right_margin
|
89
|
+
while calculate_width(font, "#{truncated_label}...") > max_width && truncated_label.length > 1
|
90
|
+
truncated_label = truncated_label[0..truncated_label.length - 2]
|
91
|
+
end
|
92
|
+
truncated_label + (truncated_label.length < label.to_s.length ? '...' : '')
|
93
|
+
end
|
94
|
+
|
95
|
+
def scale(value)
|
96
|
+
value * @scale
|
109
97
|
end
|
110
98
|
end
|
data/lib/gruff/mini/pie.rb
CHANGED
@@ -11,34 +11,29 @@
|
|
11
11
|
# g.data 'Hamburgers', 50
|
12
12
|
# g.write("mini_pie_keynote.png")
|
13
13
|
#
|
14
|
-
|
15
|
-
|
16
|
-
# A class for drawing a small pie graph.
|
17
|
-
class Pie < Gruff::Pie
|
18
|
-
private
|
14
|
+
class Gruff::Mini::Pie < Gruff::Pie
|
15
|
+
private
|
19
16
|
|
20
|
-
|
17
|
+
include Gruff::Mini::Legend
|
21
18
|
|
22
|
-
|
23
|
-
|
19
|
+
def initialize_attributes
|
20
|
+
super
|
24
21
|
|
25
|
-
|
26
|
-
|
27
|
-
|
22
|
+
@hide_legend = true
|
23
|
+
@hide_title = true
|
24
|
+
@hide_line_numbers = true
|
28
25
|
|
29
|
-
|
30
|
-
|
31
|
-
|
26
|
+
@marker_font.size = 50.0
|
27
|
+
@legend_font.size = 50.0
|
28
|
+
end
|
32
29
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
30
|
+
def setup_data
|
31
|
+
expand_canvas_for_vertical_legend
|
32
|
+
super
|
33
|
+
end
|
37
34
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end
|
42
|
-
end
|
35
|
+
def draw_graph
|
36
|
+
super
|
37
|
+
draw_vertical_legend
|
43
38
|
end
|
44
39
|
end
|
data/lib/gruff/mini/side_bar.rb
CHANGED
@@ -19,33 +19,28 @@
|
|
19
19
|
# g.data :Science, [2, 15, 8, 11]
|
20
20
|
# g.write('mini_sidebar.png')
|
21
21
|
#
|
22
|
-
|
23
|
-
|
24
|
-
# A class for drawing a small side bar graph.
|
25
|
-
class SideBar < Gruff::SideBar
|
26
|
-
private
|
22
|
+
class Gruff::Mini::SideBar < Gruff::SideBar
|
23
|
+
private
|
27
24
|
|
28
|
-
|
25
|
+
include Gruff::Mini::Legend
|
29
26
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
27
|
+
def initialize_attributes
|
28
|
+
super
|
29
|
+
@hide_legend = true
|
30
|
+
@hide_title = true
|
31
|
+
@hide_line_numbers = true
|
35
32
|
|
36
|
-
|
37
|
-
|
38
|
-
|
33
|
+
@marker_font.size = 50.0
|
34
|
+
@legend_font.size = 50.0
|
35
|
+
end
|
39
36
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
37
|
+
def setup_data
|
38
|
+
expand_canvas_for_vertical_legend
|
39
|
+
super
|
40
|
+
end
|
44
41
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
end
|
49
|
-
end
|
42
|
+
def draw_graph
|
43
|
+
super
|
44
|
+
draw_vertical_legend
|
50
45
|
end
|
51
46
|
end
|
data/lib/gruff/net.rb
CHANGED
@@ -60,6 +60,8 @@ private
|
|
60
60
|
|
61
61
|
def draw_graph
|
62
62
|
store.norm_data.each do |data_row|
|
63
|
+
poly_points = []
|
64
|
+
|
63
65
|
data_row.points.each_with_index do |data_point, index|
|
64
66
|
next if data_point.nil?
|
65
67
|
|
@@ -67,6 +69,10 @@ private
|
|
67
69
|
point_distance = data_point * @radius
|
68
70
|
start_x = @center_x + (Math.sin(rad_pos) * point_distance)
|
69
71
|
start_y = @center_y - (Math.cos(rad_pos) * point_distance)
|
72
|
+
if poly_points.empty?
|
73
|
+
poly_points << start_x
|
74
|
+
poly_points << start_y
|
75
|
+
end
|
70
76
|
|
71
77
|
next_index = index + 1 < data_row.points.length ? index + 1 : 0
|
72
78
|
|
@@ -74,14 +80,16 @@ private
|
|
74
80
|
next_point_distance = data_row.points[next_index] * @radius
|
75
81
|
end_x = @center_x + (Math.sin(next_rad_pos) * next_point_distance)
|
76
82
|
end_y = @center_y - (Math.cos(next_rad_pos) * next_point_distance)
|
77
|
-
|
78
|
-
|
83
|
+
poly_points << end_x
|
84
|
+
poly_points << end_y
|
79
85
|
|
80
86
|
unless @hide_dots
|
81
87
|
circle_renderer = Gruff::Renderer::Circle.new(renderer, color: data_row.color, width: @stroke_width)
|
82
88
|
circle_renderer.render(start_x, start_y, start_x - @circle_radius, start_y)
|
83
89
|
end
|
84
90
|
end
|
91
|
+
|
92
|
+
Gruff::Renderer::Polyline.new(renderer, color: data_row.color, width: @stroke_width).render(poly_points) unless poly_points.empty?
|
85
93
|
end
|
86
94
|
end
|
87
95
|
|
data/lib/gruff/patch/rmagick.rb
CHANGED
@@ -7,8 +7,8 @@ module Magick
|
|
7
7
|
refine Draw do
|
8
8
|
# Additional method to scale annotation text since Draw.scale doesn't.
|
9
9
|
def annotate_scaled(img, width, height, x, y, text, scale)
|
10
|
-
scaled_width = (width * scale)
|
11
|
-
scaled_height = (height * scale)
|
10
|
+
scaled_width = [(width * scale), 1].max
|
11
|
+
scaled_height = [(height * scale), 1].max
|
12
12
|
|
13
13
|
annotate(img,
|
14
14
|
scaled_width, scaled_height,
|
@@ -11,8 +11,8 @@ module Gruff
|
|
11
11
|
|
12
12
|
def render(points)
|
13
13
|
@renderer.draw.push
|
14
|
-
@renderer.draw.stroke(@color)
|
15
14
|
@renderer.draw.stroke_width(@width)
|
15
|
+
@renderer.draw.stroke(@color)
|
16
16
|
@renderer.draw.fill_opacity(0.0)
|
17
17
|
@renderer.draw.bezier(*points)
|
18
18
|
@renderer.draw.pop
|
@@ -12,10 +12,10 @@ module Gruff
|
|
12
12
|
|
13
13
|
def render(origin_x, origin_y, perim_x, perim_y)
|
14
14
|
@renderer.draw.push
|
15
|
-
@renderer.draw.fill(@color)
|
16
|
-
@renderer.draw.fill_opacity(@opacity)
|
17
|
-
@renderer.draw.stroke(@color)
|
18
15
|
@renderer.draw.stroke_width(@width)
|
16
|
+
@renderer.draw.stroke(@color)
|
17
|
+
@renderer.draw.fill_opacity(@opacity)
|
18
|
+
@renderer.draw.fill(@color)
|
19
19
|
@renderer.draw.circle(origin_x, origin_y, perim_x, perim_y)
|
20
20
|
@renderer.draw.pop
|
21
21
|
end
|
@@ -13,9 +13,9 @@ module Gruff
|
|
13
13
|
def render(start_x, start_y, end_x, end_y)
|
14
14
|
@renderer.draw.push
|
15
15
|
@renderer.draw.stroke_color(@color)
|
16
|
-
@renderer.draw.fill_opacity(0.0)
|
17
16
|
@renderer.draw.stroke_dasharray(*@dasharray)
|
18
17
|
@renderer.draw.stroke_width(@width)
|
18
|
+
@renderer.draw.fill_opacity(0.0)
|
19
19
|
@renderer.draw.line(start_x, start_y, end_x, end_y)
|
20
20
|
@renderer.draw.pop
|
21
21
|
end
|
data/lib/gruff/renderer/dot.rb
CHANGED
@@ -15,8 +15,8 @@ module Gruff
|
|
15
15
|
@renderer.draw.push
|
16
16
|
@renderer.draw.stroke_width(@width)
|
17
17
|
@renderer.draw.stroke(@color)
|
18
|
-
@renderer.draw.fill(@color)
|
19
18
|
@renderer.draw.fill_opacity(@opacity)
|
19
|
+
@renderer.draw.fill(@color)
|
20
20
|
case @style.to_sym
|
21
21
|
when :square
|
22
22
|
square(new_x, new_y, radius)
|
data/lib/gruff/renderer/line.rb
CHANGED
@@ -30,9 +30,9 @@ module Gruff
|
|
30
30
|
end
|
31
31
|
|
32
32
|
@renderer.draw.push
|
33
|
+
@renderer.draw.stroke_width(@width) if @width
|
33
34
|
@renderer.draw.stroke(color)
|
34
35
|
@renderer.draw.fill(color)
|
35
|
-
@renderer.draw.stroke_width(@width) if @width
|
36
36
|
@renderer.draw.line(start_x, start_y, end_x, end_y)
|
37
37
|
@renderer.draw.pop
|
38
38
|
end
|
@@ -14,8 +14,8 @@ module Gruff
|
|
14
14
|
@renderer.draw.push
|
15
15
|
@renderer.draw.stroke_width(@width)
|
16
16
|
@renderer.draw.stroke(@color)
|
17
|
-
@renderer.draw.fill(@color)
|
18
17
|
@renderer.draw.fill_opacity(@opacity)
|
18
|
+
@renderer.draw.fill(@color)
|
19
19
|
@renderer.draw.polygon(*points)
|
20
20
|
@renderer.draw.pop
|
21
21
|
end
|
@@ -3,17 +3,19 @@
|
|
3
3
|
module Gruff
|
4
4
|
# @private
|
5
5
|
class Renderer::Polyline
|
6
|
-
def initialize(renderer, color:, width:)
|
6
|
+
def initialize(renderer, color:, width: 1.0, linejoin: 'bevel')
|
7
7
|
@renderer = renderer
|
8
8
|
@color = color
|
9
9
|
@width = width
|
10
|
+
@linejoin = linejoin
|
10
11
|
end
|
11
12
|
|
12
13
|
def render(points)
|
13
14
|
@renderer.draw.push
|
15
|
+
@renderer.draw.stroke_linejoin(@linejoin)
|
16
|
+
@renderer.draw.stroke_width(@width)
|
14
17
|
@renderer.draw.stroke(@color)
|
15
18
|
@renderer.draw.fill('transparent')
|
16
|
-
@renderer.draw.stroke_width(@width)
|
17
19
|
@renderer.draw.polyline(*points)
|
18
20
|
@renderer.draw.pop
|
19
21
|
end
|
data/lib/gruff/scatter.rb
CHANGED
@@ -142,6 +142,9 @@ private
|
|
142
142
|
end
|
143
143
|
|
144
144
|
def draw_graph
|
145
|
+
stroke_width = @stroke_width || clip_value_if_greater_than(@columns / (store.norm_data.first[1].size * 4.0), 5.0)
|
146
|
+
circle_radius = @circle_radius || clip_value_if_greater_than(@columns / (store.norm_data.first[1].size * 2.5), 5.0)
|
147
|
+
|
145
148
|
store.norm_data.each do |data_row|
|
146
149
|
data_row.coordinates.each do |x_value, y_value|
|
147
150
|
next if y_value.nil? || x_value.nil?
|
@@ -149,9 +152,6 @@ private
|
|
149
152
|
new_x = @graph_left + (x_value * @graph_width)
|
150
153
|
new_y = @graph_bottom - (y_value * @graph_height)
|
151
154
|
|
152
|
-
# Reset each time to avoid thin-line errors
|
153
|
-
stroke_width = @stroke_width || clip_value_if_greater_than(@columns / (store.norm_data.first[1].size * 4.0), 5.0)
|
154
|
-
circle_radius = @circle_radius || clip_value_if_greater_than(@columns / (store.norm_data.first[1].size * 2.5), 5.0)
|
155
155
|
Gruff::Renderer::Circle.new(renderer, color: data_row.color, width: stroke_width).render(new_x, new_y, new_x - circle_radius, new_y)
|
156
156
|
end
|
157
157
|
end
|
data/lib/gruff/stacked_bar.rb
CHANGED
@@ -78,7 +78,7 @@ private
|
|
78
78
|
#
|
79
79
|
# Columns sit stacked.
|
80
80
|
bar_width = @graph_width / column_count
|
81
|
-
padding = (bar_width * (1 - @bar_spacing)) / 2
|
81
|
+
padding = (bar_width * (1 - @bar_spacing)) / 2.0
|
82
82
|
|
83
83
|
# Setup the BarConversion Object
|
84
84
|
conversion = Gruff::BarConversion.new(
|
data/lib/gruff/version.rb
CHANGED
data/lib/gruff.rb
CHANGED
@@ -45,6 +45,7 @@ module Gruff
|
|
45
45
|
autoload :Layer, Gruff.libpath('scene')
|
46
46
|
autoload :Themes, Gruff.libpath('themes')
|
47
47
|
|
48
|
+
# @private
|
48
49
|
class Renderer
|
49
50
|
autoload :Bezier, Gruff.libpath('renderer/bezier')
|
50
51
|
autoload :Circle, Gruff.libpath('renderer/circle')
|
@@ -58,12 +59,14 @@ module Gruff
|
|
58
59
|
autoload :Text, Gruff.libpath('renderer/text')
|
59
60
|
end
|
60
61
|
|
62
|
+
# @private
|
61
63
|
class Store
|
62
64
|
autoload :BasicData, Gruff.libpath('store/basic_data')
|
63
65
|
autoload :XYData, Gruff.libpath('store/xy_data')
|
64
66
|
autoload :XYPointsizeData, Gruff.libpath('store/xy_pointsizes_data')
|
65
67
|
end
|
66
68
|
|
69
|
+
# A module for small graphs
|
67
70
|
module Mini
|
68
71
|
autoload :Bar, Gruff.libpath('mini/bar')
|
69
72
|
autoload :Legend, Gruff.libpath('mini/legend')
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gruff
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.20.0
|
5
5
|
platform: java
|
6
6
|
authors:
|
7
7
|
- Geoffrey Grosenbach
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2023-06-04 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -102,6 +102,7 @@ executables: []
|
|
102
102
|
extensions: []
|
103
103
|
extra_rdoc_files: []
|
104
104
|
files:
|
105
|
+
- ".devcontainer/devcontainer.json"
|
105
106
|
- ".editorconfig"
|
106
107
|
- ".github/ISSUE_TEMPLATE.md"
|
107
108
|
- ".github/workflows/ci.yml"
|
@@ -182,14 +183,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
182
183
|
requirements:
|
183
184
|
- - ">="
|
184
185
|
- !ruby/object:Gem::Version
|
185
|
-
version: 2.
|
186
|
+
version: 2.6.0
|
186
187
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
187
188
|
requirements:
|
188
189
|
- - ">="
|
189
190
|
- !ruby/object:Gem::Version
|
190
191
|
version: '0'
|
191
192
|
requirements: []
|
192
|
-
rubygems_version: 3.
|
193
|
+
rubygems_version: 3.3.25
|
193
194
|
signing_key:
|
194
195
|
specification_version: 4
|
195
196
|
summary: Beautiful graphs for one or multiple datasets.
|