gruff 0.13.0-java → 0.14.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/workflows/ci.yml +66 -0
- data/.rubocop.yml +6 -10
- data/.rubocop_todo.yml +19 -85
- data/CHANGELOG.md +10 -0
- data/README.md +6 -7
- data/gruff.gemspec +2 -4
- data/lib/gruff.rb +1 -0
- data/lib/gruff/accumulator_bar.rb +3 -1
- data/lib/gruff/area.rb +5 -8
- data/lib/gruff/bar.rb +19 -23
- data/lib/gruff/base.rb +134 -96
- data/lib/gruff/bezier.rb +4 -6
- data/lib/gruff/bullet.rb +11 -10
- data/lib/gruff/dot.rb +10 -10
- data/lib/gruff/font.rb +39 -0
- data/lib/gruff/helper/stacked_mixin.rb +1 -2
- data/lib/gruff/histogram.rb +9 -7
- data/lib/gruff/line.rb +55 -46
- data/lib/gruff/mini/bar.rb +9 -6
- data/lib/gruff/mini/legend.rb +12 -8
- data/lib/gruff/mini/pie.rb +9 -6
- data/lib/gruff/mini/side_bar.rb +9 -6
- data/lib/gruff/net.rb +9 -15
- data/lib/gruff/patch/string.rb +1 -1
- data/lib/gruff/pie.rb +23 -65
- data/lib/gruff/renderer/bezier.rb +8 -9
- data/lib/gruff/renderer/circle.rb +8 -9
- data/lib/gruff/renderer/dash_line.rb +9 -10
- data/lib/gruff/renderer/dot.rb +13 -14
- data/lib/gruff/renderer/ellipse.rb +8 -9
- data/lib/gruff/renderer/line.rb +8 -9
- data/lib/gruff/renderer/polygon.rb +9 -10
- data/lib/gruff/renderer/polyline.rb +8 -9
- data/lib/gruff/renderer/rectangle.rb +7 -8
- data/lib/gruff/renderer/renderer.rb +21 -36
- data/lib/gruff/renderer/text.rb +21 -37
- data/lib/gruff/scatter.rb +41 -46
- data/lib/gruff/scene.rb +15 -13
- data/lib/gruff/side_bar.rb +14 -30
- data/lib/gruff/side_stacked_bar.rb +8 -11
- data/lib/gruff/spider.rb +11 -16
- data/lib/gruff/stacked_area.rb +10 -11
- data/lib/gruff/stacked_bar.rb +9 -9
- data/lib/gruff/store/store.rb +6 -10
- data/lib/gruff/themes.rb +6 -6
- data/lib/gruff/version.rb +1 -1
- data/rails_generators/gruff/templates/controller.rb +1 -1
- metadata +4 -21
- data/.travis.yml +0 -23
- data/assets/plastik/blue.png +0 -0
- data/assets/plastik/green.png +0 -0
- data/assets/plastik/red.png +0 -0
- data/lib/gruff/photo_bar.rb +0 -93
data/lib/gruff/mini/pie.rb
CHANGED
@@ -15,25 +15,28 @@ module Gruff
|
|
15
15
|
module Mini
|
16
16
|
# A class for drawing a small pie graph.
|
17
17
|
class Pie < Gruff::Pie
|
18
|
+
private
|
19
|
+
|
18
20
|
include Gruff::Mini::Legend
|
19
21
|
|
20
|
-
def
|
22
|
+
def initialize_attributes
|
21
23
|
super
|
22
24
|
|
23
25
|
@hide_legend = true
|
24
26
|
@hide_title = true
|
25
27
|
@hide_line_numbers = true
|
26
28
|
|
27
|
-
@
|
28
|
-
@
|
29
|
+
@marker_font.size = 60.0
|
30
|
+
@legend_font.size = 60.0
|
29
31
|
end
|
30
|
-
private :initialize_ivars
|
31
32
|
|
32
|
-
def
|
33
|
+
def setup_data
|
33
34
|
expand_canvas_for_vertical_legend
|
34
|
-
|
35
35
|
super
|
36
|
+
end
|
36
37
|
|
38
|
+
def draw_graph
|
39
|
+
super
|
37
40
|
draw_vertical_legend
|
38
41
|
end
|
39
42
|
end
|
data/lib/gruff/mini/side_bar.rb
CHANGED
@@ -23,24 +23,27 @@ module Gruff
|
|
23
23
|
module Mini
|
24
24
|
# A class for drawing a small side bar graph.
|
25
25
|
class SideBar < Gruff::SideBar
|
26
|
+
private
|
27
|
+
|
26
28
|
include Gruff::Mini::Legend
|
27
29
|
|
28
|
-
def
|
30
|
+
def initialize_attributes
|
29
31
|
super
|
30
32
|
@hide_legend = true
|
31
33
|
@hide_title = true
|
32
34
|
@hide_line_numbers = true
|
33
35
|
|
34
|
-
@
|
35
|
-
@
|
36
|
+
@marker_font.size = 50.0
|
37
|
+
@legend_font.size = 50.0
|
36
38
|
end
|
37
|
-
private :initialize_ivars
|
38
39
|
|
39
|
-
def
|
40
|
+
def setup_data
|
40
41
|
expand_canvas_for_vertical_legend
|
41
|
-
|
42
42
|
super
|
43
|
+
end
|
43
44
|
|
45
|
+
def draw_graph
|
46
|
+
super
|
44
47
|
draw_vertical_legend
|
45
48
|
end
|
46
49
|
end
|
data/lib/gruff/net.rb
CHANGED
@@ -30,7 +30,9 @@ class Gruff::Net < Gruff::Base
|
|
30
30
|
attr_writer :line_width
|
31
31
|
attr_writer :dot_radius
|
32
32
|
|
33
|
-
|
33
|
+
private
|
34
|
+
|
35
|
+
def initialize_attributes
|
34
36
|
super
|
35
37
|
|
36
38
|
@hide_dots = false
|
@@ -38,14 +40,10 @@ class Gruff::Net < Gruff::Base
|
|
38
40
|
@dot_radius = nil
|
39
41
|
@hide_line_numbers = true
|
40
42
|
@sorted_drawing = true
|
43
|
+
@marker_font.bold = true
|
41
44
|
end
|
42
|
-
private :initialize_ivars
|
43
|
-
|
44
|
-
def draw
|
45
|
-
super
|
46
|
-
|
47
|
-
return unless data_given?
|
48
45
|
|
46
|
+
def draw_graph
|
49
47
|
store.norm_data.each do |data_row|
|
50
48
|
data_row.points.each_with_index do |data_point, index|
|
51
49
|
next if data_point.nil?
|
@@ -62,18 +60,16 @@ class Gruff::Net < Gruff::Base
|
|
62
60
|
end_x = @center_x + Math.sin(next_rad_pos) * next_point_distance
|
63
61
|
end_y = @center_y - Math.cos(next_rad_pos) * next_point_distance
|
64
62
|
|
65
|
-
Gruff::Renderer::Line.new(color: data_row.color, width: @stroke_width).render(start_x, start_y, end_x, end_y)
|
63
|
+
Gruff::Renderer::Line.new(renderer, color: data_row.color, width: @stroke_width).render(start_x, start_y, end_x, end_y)
|
66
64
|
|
67
65
|
unless @hide_dots
|
68
|
-
circle_renderer = Gruff::Renderer::Circle.new(color: data_row.color, width: @stroke_width)
|
66
|
+
circle_renderer = Gruff::Renderer::Circle.new(renderer, color: data_row.color, width: @stroke_width)
|
69
67
|
circle_renderer.render(start_x, start_y, start_x - @circle_radius, start_y)
|
70
68
|
end
|
71
69
|
end
|
72
70
|
end
|
73
71
|
end
|
74
72
|
|
75
|
-
private
|
76
|
-
|
77
73
|
def setup_drawing
|
78
74
|
super
|
79
75
|
|
@@ -92,7 +88,7 @@ private
|
|
92
88
|
(0..column_count - 1).each do |index|
|
93
89
|
rad_pos = index * Math::PI * 2 / column_count
|
94
90
|
|
95
|
-
Gruff::Renderer::Line.new(color: @marker_color)
|
91
|
+
Gruff::Renderer::Line.new(renderer, color: @marker_color)
|
96
92
|
.render(@center_x, @center_y, @center_x + Math.sin(rad_pos) * @radius, @center_y - Math.cos(rad_pos) * @radius)
|
97
93
|
|
98
94
|
marker_label = @labels[index] ? @labels[index].to_s : '000'
|
@@ -106,8 +102,6 @@ private
|
|
106
102
|
x = x_offset + (radius + LABEL_MARGIN) * Math.sin(deg2rad(angle))
|
107
103
|
y = y_offset - (radius + LABEL_MARGIN) * Math.cos(deg2rad(angle))
|
108
104
|
|
109
|
-
|
110
|
-
text_renderer = Gruff::Renderer::Text.new(amount, font: @font, size: 20, color: @marker_color, weight: Magick::BoldWeight)
|
111
|
-
text_renderer.add_to_render_queue(0, 0, x, y, Magick::CenterGravity)
|
105
|
+
draw_label_at(1.0, 1.0, x, y, amount, Magick::CenterGravity)
|
112
106
|
end
|
113
107
|
end
|
data/lib/gruff/patch/string.rb
CHANGED
@@ -5,7 +5,7 @@ module String::GruffCommify
|
|
5
5
|
THOUSAND_SEPARATOR = ','
|
6
6
|
|
7
7
|
refine String do
|
8
|
-
#Taken from http://codesnippets.joyent.com/posts/show/330
|
8
|
+
# Taken from http://codesnippets.joyent.com/posts/show/330
|
9
9
|
def commify(delimiter = THOUSAND_SEPARATOR)
|
10
10
|
gsub(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1#{delimiter}")
|
11
11
|
end
|
data/lib/gruff/pie.rb
CHANGED
@@ -18,6 +18,9 @@ class Gruff::Pie < Gruff::Base
|
|
18
18
|
# or at another angle. Default is +0.0+, which starts at 3 o'clock.
|
19
19
|
attr_writer :zero_degree
|
20
20
|
|
21
|
+
# Set the number output format lambda.
|
22
|
+
attr_writer :label_formatting
|
23
|
+
|
21
24
|
# Do not show labels for slices that are less than this percent. Use 0 to always show all labels.
|
22
25
|
# Defaults to +0+.
|
23
26
|
attr_writer :hide_labels_less_than
|
@@ -29,39 +32,30 @@ class Gruff::Pie < Gruff::Base
|
|
29
32
|
## Use values instead of percentages.
|
30
33
|
attr_writer :show_values_as_labels
|
31
34
|
|
35
|
+
private
|
36
|
+
|
32
37
|
def initialize_store
|
33
38
|
@store = Gruff::Store.new(Gruff::Store::CustomData)
|
34
39
|
end
|
35
|
-
private :initialize_store
|
36
40
|
|
37
|
-
def
|
41
|
+
def initialize_attributes
|
38
42
|
super
|
39
43
|
@zero_degree = 0.0
|
40
44
|
@hide_labels_less_than = 0.0
|
41
45
|
@text_offset_percentage = DEFAULT_TEXT_OFFSET_PERCENTAGE
|
42
46
|
@show_values_as_labels = false
|
43
|
-
|
44
|
-
private :initialize_ivars
|
47
|
+
@marker_font.bold = true
|
45
48
|
|
46
|
-
|
47
|
-
|
48
|
-
zero_degree: @zero_degree,
|
49
|
-
hide_labels_less_than: @hide_labels_less_than,
|
50
|
-
text_offset_percentage: @text_offset_percentage,
|
51
|
-
show_values_as_labels: @show_values_as_labels
|
52
|
-
}
|
53
|
-
end
|
54
|
-
|
55
|
-
def draw
|
56
|
-
hide_line_markers
|
57
|
-
|
58
|
-
super
|
49
|
+
@hide_line_markers = true
|
50
|
+
@hide_line_markers.freeze
|
59
51
|
|
60
|
-
|
52
|
+
@label_formatting = ->(value, percentage) { @show_values_as_labels ? value.to_s : "#{percentage}%" }
|
53
|
+
end
|
61
54
|
|
55
|
+
def draw_graph
|
62
56
|
slices.each do |slice|
|
63
57
|
if slice.value > 0
|
64
|
-
Gruff::Renderer::Ellipse.new(color: slice.color, width: radius)
|
58
|
+
Gruff::Renderer::Ellipse.new(renderer, color: slice.color, width: radius)
|
65
59
|
.render(center_x, center_y, radius / 2.0, radius / 2.0, chart_degrees, chart_degrees + slice.degrees + 0.5)
|
66
60
|
process_label_for slice
|
67
61
|
update_chart_degrees_with slice.degrees
|
@@ -69,11 +63,9 @@ class Gruff::Pie < Gruff::Base
|
|
69
63
|
end
|
70
64
|
end
|
71
65
|
|
72
|
-
private
|
73
|
-
|
74
66
|
def slices
|
75
67
|
@slices ||= begin
|
76
|
-
slices = store.data.map { |data|
|
68
|
+
slices = store.data.map { |data| Gruff::Pie::PieSlice.new(data.label, data.points.first, data.color) }
|
77
69
|
|
78
70
|
slices.sort_by(&:value) if @sort
|
79
71
|
|
@@ -84,18 +76,10 @@ private
|
|
84
76
|
|
85
77
|
# General Helper Methods
|
86
78
|
|
87
|
-
def hide_line_markers
|
88
|
-
@hide_line_markers = true
|
89
|
-
end
|
90
|
-
|
91
79
|
def update_chart_degrees_with(degrees)
|
92
80
|
@chart_degrees = chart_degrees + degrees
|
93
81
|
end
|
94
82
|
|
95
|
-
def slice_class
|
96
|
-
PieSlice
|
97
|
-
end
|
98
|
-
|
99
83
|
# Spatial Value-Related Methods
|
100
84
|
|
101
85
|
def chart_degrees
|
@@ -103,13 +87,8 @@ private
|
|
103
87
|
end
|
104
88
|
|
105
89
|
attr_reader :graph_height
|
106
|
-
|
107
90
|
attr_reader :graph_width
|
108
91
|
|
109
|
-
def diameter
|
110
|
-
graph_height
|
111
|
-
end
|
112
|
-
|
113
92
|
def half_width
|
114
93
|
graph_width / 2.0
|
115
94
|
end
|
@@ -147,8 +126,8 @@ private
|
|
147
126
|
def process_label_for(slice)
|
148
127
|
if slice.percentage >= @hide_labels_less_than
|
149
128
|
x, y = label_coordinates_for slice
|
150
|
-
|
151
|
-
|
129
|
+
label = @label_formatting.call(slice.value, slice.percentage)
|
130
|
+
draw_label_at(1.0, 1.0, x, y, label, Magick::CenterGravity)
|
152
131
|
end
|
153
132
|
end
|
154
133
|
|
@@ -166,45 +145,24 @@ private
|
|
166
145
|
center_y + (radius_offset * Math.sin(deg2rad(angle)))
|
167
146
|
end
|
168
147
|
|
169
|
-
# Drawing-Related Methods
|
170
|
-
|
171
|
-
def draw_label(x, y, value)
|
172
|
-
text_renderer = Gruff::Renderer::Text.new(value, font: @font, size: @marker_font_size, color: @font_color, weight: Magick::BoldWeight)
|
173
|
-
text_renderer.add_to_render_queue(0, 0, x, y, Magick::CenterGravity)
|
174
|
-
end
|
175
|
-
|
176
148
|
# Helper Classes
|
177
149
|
#
|
178
150
|
# @private
|
179
|
-
class PieSlice < Struct.new(:
|
151
|
+
class PieSlice < Struct.new(:label, :value, :color)
|
180
152
|
attr_accessor :total
|
181
153
|
|
182
|
-
def name
|
183
|
-
data_array[0]
|
184
|
-
end
|
185
|
-
|
186
|
-
def value
|
187
|
-
data_array[1].first
|
188
|
-
end
|
189
|
-
|
190
|
-
def color
|
191
|
-
data_array[2]
|
192
|
-
end
|
193
|
-
|
194
|
-
def size
|
195
|
-
@size ||= value / total
|
196
|
-
end
|
197
|
-
|
198
154
|
def percentage
|
199
|
-
|
155
|
+
(size * 100.0).round
|
200
156
|
end
|
201
157
|
|
202
158
|
def degrees
|
203
|
-
|
159
|
+
size * 360.0
|
204
160
|
end
|
205
161
|
|
206
|
-
|
207
|
-
|
162
|
+
private
|
163
|
+
|
164
|
+
def size
|
165
|
+
value / total
|
208
166
|
end
|
209
167
|
end
|
210
168
|
end
|
@@ -3,20 +3,19 @@
|
|
3
3
|
module Gruff
|
4
4
|
# @private
|
5
5
|
class Renderer::Bezier
|
6
|
-
def initialize(color:, width: 1.0)
|
6
|
+
def initialize(renderer, color:, width: 1.0)
|
7
|
+
@renderer = renderer
|
7
8
|
@color = color
|
8
9
|
@width = width
|
9
10
|
end
|
10
11
|
|
11
12
|
def render(points)
|
12
|
-
draw
|
13
|
-
|
14
|
-
draw.
|
15
|
-
draw.
|
16
|
-
draw.
|
17
|
-
draw.
|
18
|
-
draw.bezier(*points)
|
19
|
-
draw.pop
|
13
|
+
@renderer.draw.push
|
14
|
+
@renderer.draw.stroke(@color)
|
15
|
+
@renderer.draw.stroke_width(@width)
|
16
|
+
@renderer.draw.fill_opacity(0.0)
|
17
|
+
@renderer.draw.bezier(*points)
|
18
|
+
@renderer.draw.pop
|
20
19
|
end
|
21
20
|
end
|
22
21
|
end
|
@@ -3,20 +3,19 @@
|
|
3
3
|
module Gruff
|
4
4
|
# @private
|
5
5
|
class Renderer::Circle
|
6
|
-
def initialize(color:, width: 1.0)
|
6
|
+
def initialize(renderer, color:, width: 1.0)
|
7
|
+
@renderer = renderer
|
7
8
|
@color = color
|
8
9
|
@width = width
|
9
10
|
end
|
10
11
|
|
11
12
|
def render(origin_x, origin_y, perim_x, perim_y)
|
12
|
-
draw
|
13
|
-
|
14
|
-
draw.
|
15
|
-
draw.
|
16
|
-
draw.
|
17
|
-
draw.
|
18
|
-
draw.circle(origin_x, origin_y, perim_x, perim_y)
|
19
|
-
draw.pop
|
13
|
+
@renderer.draw.push
|
14
|
+
@renderer.draw.fill(@color)
|
15
|
+
@renderer.draw.stroke(@color)
|
16
|
+
@renderer.draw.stroke_width(@width)
|
17
|
+
@renderer.draw.circle(origin_x, origin_y, perim_x, perim_y)
|
18
|
+
@renderer.draw.pop
|
20
19
|
end
|
21
20
|
end
|
22
21
|
end
|
@@ -3,21 +3,20 @@
|
|
3
3
|
module Gruff
|
4
4
|
# @private
|
5
5
|
class Renderer::DashLine
|
6
|
-
def initialize(color:, width:)
|
6
|
+
def initialize(renderer, color:, width:)
|
7
|
+
@renderer = renderer
|
7
8
|
@color = color
|
8
9
|
@width = width
|
9
10
|
end
|
10
11
|
|
11
12
|
def render(start_x, start_y, end_x, end_y)
|
12
|
-
draw
|
13
|
-
|
14
|
-
draw.
|
15
|
-
draw.
|
16
|
-
draw.
|
17
|
-
draw.
|
18
|
-
draw.
|
19
|
-
draw.line(start_x, start_y, end_x, end_y)
|
20
|
-
draw.pop
|
13
|
+
@renderer.draw.push
|
14
|
+
@renderer.draw.stroke_color(@color)
|
15
|
+
@renderer.draw.fill_opacity(0.0)
|
16
|
+
@renderer.draw.stroke_dasharray(10, 20)
|
17
|
+
@renderer.draw.stroke_width(@width)
|
18
|
+
@renderer.draw.line(start_x, start_y, end_x, end_y)
|
19
|
+
@renderer.draw.pop
|
21
20
|
end
|
22
21
|
end
|
23
22
|
end
|
data/lib/gruff/renderer/dot.rb
CHANGED
@@ -3,38 +3,37 @@
|
|
3
3
|
module Gruff
|
4
4
|
# @private
|
5
5
|
class Renderer::Dot
|
6
|
-
def initialize(style, color:, width: 1.0)
|
6
|
+
def initialize(renderer, style, color:, width: 1.0)
|
7
|
+
@renderer = renderer
|
7
8
|
@style = style
|
8
9
|
@color = color
|
9
10
|
@width = width
|
10
11
|
end
|
11
12
|
|
12
13
|
def render(new_x, new_y, circle_radius)
|
13
|
-
draw
|
14
|
-
|
15
|
-
|
16
|
-
draw.
|
17
|
-
draw.stroke(@color)
|
18
|
-
draw.fill(@color)
|
14
|
+
# @renderer.draw.push # TODO
|
15
|
+
@renderer.draw.stroke_width(@width)
|
16
|
+
@renderer.draw.stroke(@color)
|
17
|
+
@renderer.draw.fill(@color)
|
19
18
|
if @style.to_s == 'square'
|
20
|
-
square(
|
19
|
+
square(new_x, new_y, circle_radius)
|
21
20
|
else
|
22
|
-
circle(
|
21
|
+
circle(new_x, new_y, circle_radius)
|
23
22
|
end
|
24
|
-
# draw.pop # TODO
|
23
|
+
# @renderer.draw.pop # TODO
|
25
24
|
end
|
26
25
|
|
27
|
-
def circle(
|
28
|
-
draw.circle(new_x, new_y, new_x - circle_radius, new_y)
|
26
|
+
def circle(new_x, new_y, circle_radius)
|
27
|
+
@renderer.draw.circle(new_x, new_y, new_x - circle_radius, new_y)
|
29
28
|
end
|
30
29
|
|
31
|
-
def square(
|
30
|
+
def square(new_x, new_y, circle_radius)
|
32
31
|
offset = (circle_radius * 0.8).to_i
|
33
32
|
corner1 = new_x - offset
|
34
33
|
corner2 = new_y - offset
|
35
34
|
corner3 = new_x + offset
|
36
35
|
corner4 = new_y + offset
|
37
|
-
draw.rectangle(corner1, corner2, corner3, corner4)
|
36
|
+
@renderer.draw.rectangle(corner1, corner2, corner3, corner4)
|
38
37
|
end
|
39
38
|
end
|
40
39
|
end
|