gruff 0.13.0-java → 0.14.0-java
Sign up to get free protection for your applications and to get access to all the features.
- 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/scene.rb
CHANGED
@@ -52,7 +52,7 @@ class Gruff::Scene < Gruff::Base
|
|
52
52
|
# Join all the custom paths and filter out the empty ones
|
53
53
|
image_paths = @layers.map(&:path).reject(&:empty?)
|
54
54
|
images = Magick::ImageList.new(*image_paths)
|
55
|
-
|
55
|
+
renderer.background_image = images.flatten_images
|
56
56
|
end
|
57
57
|
|
58
58
|
def layers=(ordered_list)
|
@@ -132,18 +132,20 @@ class Gruff::Layer
|
|
132
132
|
|
133
133
|
# Choose the appropriate filename for this layer, based on the input
|
134
134
|
def update(value)
|
135
|
-
@selected_filename =
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
135
|
+
@selected_filename = begin
|
136
|
+
case value.to_s
|
137
|
+
when /^(true|false)$/
|
138
|
+
select_boolean value
|
139
|
+
when /^(\w|\s)+$/
|
140
|
+
select_string value
|
141
|
+
when /^-?(\d+\.)?\d+$/
|
142
|
+
select_numeric value
|
143
|
+
when /(\d\d):(\d\d):\d\d/
|
144
|
+
select_time "#{Regexp.last_match(1)}#{Regexp.last_match(2)}"
|
145
|
+
else
|
146
|
+
select_default
|
147
|
+
end
|
148
|
+
end
|
147
149
|
# Finally, try to use 'default' if we're still blank
|
148
150
|
@selected_filename ||= select_default
|
149
151
|
end
|
data/lib/gruff/side_bar.rb
CHANGED
@@ -36,33 +36,24 @@ class Gruff::SideBar < Gruff::Base
|
|
36
36
|
# Prevent drawing of column labels left of a side bar graph. Default is +false+.
|
37
37
|
attr_writer :hide_labels
|
38
38
|
|
39
|
-
|
39
|
+
# With Side Bars use the data label for the marker value to the left of the bar.
|
40
|
+
# @deprecated
|
41
|
+
def use_data_label=(_value)
|
42
|
+
warn '#use_data_label is deprecated. It is no longer effective.'
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def initialize_attributes
|
40
48
|
super
|
41
49
|
@bar_spacing = 0.9
|
42
50
|
@group_spacing = 10
|
43
51
|
@label_formatting = nil
|
44
52
|
@show_labels_for_bar_values = false
|
45
53
|
@hide_labels = false
|
46
|
-
end
|
47
|
-
private :initialize_ivars
|
48
|
-
|
49
|
-
def draw
|
50
54
|
@has_left_labels = true
|
51
|
-
super
|
52
|
-
|
53
|
-
return unless data_given?
|
54
|
-
|
55
|
-
draw_bars
|
56
55
|
end
|
57
56
|
|
58
|
-
# With Side Bars use the data label for the marker value to the left of the bar.
|
59
|
-
# @deprecated
|
60
|
-
def use_data_label=(_value)
|
61
|
-
warn '#use_data_label is deprecated. It is no longer effective.'
|
62
|
-
end
|
63
|
-
|
64
|
-
protected
|
65
|
-
|
66
57
|
def hide_labels?
|
67
58
|
@hide_labels
|
68
59
|
end
|
@@ -75,12 +66,10 @@ protected
|
|
75
66
|
@hide_line_markers
|
76
67
|
end
|
77
68
|
|
78
|
-
private
|
79
|
-
|
80
69
|
# Value to avoid completely overwriting the coordinate axis
|
81
70
|
AXIS_MARGIN = 0.5
|
82
71
|
|
83
|
-
def
|
72
|
+
def draw_graph
|
84
73
|
# Setup spacing.
|
85
74
|
#
|
86
75
|
bars_width = (@graph_height - calculate_spacing) / column_count.to_f
|
@@ -93,11 +82,6 @@ private
|
|
93
82
|
minimum_value: minimum_value, maximum_value: maximum_value, spread: @spread
|
94
83
|
)
|
95
84
|
|
96
|
-
# if we're a side stacked bar then we don't need to draw ourself at all
|
97
|
-
# because sometimes (due to different heights/min/max) you can actually
|
98
|
-
# see both graphs and it looks like crap
|
99
|
-
return if is_a?(Gruff::SideStackedBar)
|
100
|
-
|
101
85
|
store.norm_data.each_with_index do |data_row, row_index|
|
102
86
|
data_row.points.each_with_index do |data_point, point_index|
|
103
87
|
group_spacing = @group_spacing * @scale * point_index
|
@@ -107,7 +91,7 @@ private
|
|
107
91
|
|
108
92
|
left_x, right_x = conversion.get_top_bottom_scaled(data_point).sort
|
109
93
|
|
110
|
-
rect_renderer = Gruff::Renderer::Rectangle.new(color: data_row.color)
|
94
|
+
rect_renderer = Gruff::Renderer::Rectangle.new(renderer, color: data_row.color)
|
111
95
|
rect_renderer.render(left_x + AXIS_MARGIN, left_y, right_x + AXIS_MARGIN, right_y)
|
112
96
|
|
113
97
|
# Calculate center based on bar_width and current row
|
@@ -118,7 +102,7 @@ private
|
|
118
102
|
if @show_labels_for_bar_values
|
119
103
|
bar_value_label = Gruff::BarValueLabel::SideBar.new([left_x, left_y, right_x, right_y], store.data[row_index].points[point_index])
|
120
104
|
bar_value_label.prepare_rendering(@label_formatting, bar_width) do |x, y, text|
|
121
|
-
draw_value_label(x, y, text
|
105
|
+
draw_value_label(x, y, text)
|
122
106
|
end
|
123
107
|
end
|
124
108
|
end
|
@@ -139,14 +123,14 @@ private
|
|
139
123
|
line_diff = (@graph_right - @graph_left) / number_of_lines
|
140
124
|
x = @graph_right - (line_diff * index) - 1
|
141
125
|
|
142
|
-
line_renderer = Gruff::Renderer::Line.new(color: @marker_color, shadow_color: @marker_shadow_color)
|
126
|
+
line_renderer = Gruff::Renderer::Line.new(renderer, color: @marker_color, shadow_color: @marker_shadow_color)
|
143
127
|
line_renderer.render(x, @graph_bottom, x, @graph_top)
|
144
128
|
|
145
129
|
unless @hide_line_numbers
|
146
130
|
diff = index - number_of_lines
|
147
131
|
marker_label = BigDecimal(diff.abs.to_s) * BigDecimal(increment.to_s) + BigDecimal(minimum_value.to_s)
|
148
132
|
label = x_axis_label(marker_label, @increment)
|
149
|
-
text_renderer = Gruff::Renderer::Text.new(label, font: @
|
133
|
+
text_renderer = Gruff::Renderer::Text.new(renderer, label, font: @marker_font)
|
150
134
|
text_renderer.add_to_render_queue(0, 0, x, @graph_bottom + LABEL_MARGIN, Magick::CenterGravity)
|
151
135
|
end
|
152
136
|
end
|
@@ -39,24 +39,23 @@ class Gruff::SideStackedBar < Gruff::SideBar
|
|
39
39
|
# Prevent drawing of column labels left of a side stacked bar graph. Default is +false+.
|
40
40
|
attr_writer :hide_labels
|
41
41
|
|
42
|
-
|
42
|
+
private
|
43
|
+
|
44
|
+
def initialize_attributes
|
43
45
|
super
|
44
46
|
@bar_spacing = 0.9
|
45
47
|
@segment_spacing = 2.0
|
46
48
|
@label_formatting = nil
|
47
49
|
@show_labels_for_bar_values = false
|
48
50
|
@hide_labels = false
|
51
|
+
@has_left_labels = true
|
49
52
|
end
|
50
|
-
private :initialize_ivars
|
51
53
|
|
52
|
-
def
|
53
|
-
@has_left_labels = true
|
54
|
+
def setup_data
|
54
55
|
calculate_maximum_by_stack
|
55
56
|
super
|
56
57
|
end
|
57
58
|
|
58
|
-
protected
|
59
|
-
|
60
59
|
def hide_labels?
|
61
60
|
@hide_labels
|
62
61
|
end
|
@@ -69,9 +68,7 @@ protected
|
|
69
68
|
@hide_line_markers
|
70
69
|
end
|
71
70
|
|
72
|
-
|
73
|
-
|
74
|
-
def draw_bars
|
71
|
+
def draw_graph
|
75
72
|
# Setup spacing.
|
76
73
|
#
|
77
74
|
# Columns sit stacked.
|
@@ -105,7 +102,7 @@ private
|
|
105
102
|
# that shouldn't even be there being drawn on top of the existing
|
106
103
|
# bar - this is bad
|
107
104
|
if data_point != 0
|
108
|
-
rect_renderer = Gruff::Renderer::Rectangle.new(color: data_row.color)
|
105
|
+
rect_renderer = Gruff::Renderer::Rectangle.new(renderer, color: data_row.color)
|
109
106
|
rect_renderer.render(left_x, left_y, right_x, right_y)
|
110
107
|
# Calculate center based on bar_width and current row
|
111
108
|
end
|
@@ -118,7 +115,7 @@ private
|
|
118
115
|
|
119
116
|
if @show_labels_for_bar_values
|
120
117
|
stack_bar_value_label.prepare_rendering(@label_formatting, bar_width) do |x, y, text|
|
121
|
-
draw_value_label(x, y, text
|
118
|
+
draw_value_label(x, y, text)
|
122
119
|
end
|
123
120
|
end
|
124
121
|
end
|
data/lib/gruff/spider.rb
CHANGED
@@ -20,7 +20,7 @@ class Gruff::Spider < Gruff::Base
|
|
20
20
|
attr_writer :rotation
|
21
21
|
|
22
22
|
def transparent_background=(value)
|
23
|
-
|
23
|
+
renderer.transparent_background(@columns, @rows) if value
|
24
24
|
end
|
25
25
|
|
26
26
|
def hide_text=(value)
|
@@ -32,22 +32,21 @@ class Gruff::Spider < Gruff::Base
|
|
32
32
|
@max_value = max_value
|
33
33
|
end
|
34
34
|
|
35
|
-
|
35
|
+
private
|
36
|
+
|
37
|
+
def initialize_attributes
|
36
38
|
super
|
37
39
|
@hide_legend = true
|
38
40
|
@hide_axes = false
|
39
41
|
@hide_text = false
|
40
42
|
@rotation = 0
|
41
|
-
|
42
|
-
private :initialize_ivars
|
43
|
+
@marker_font.bold = true
|
43
44
|
|
44
|
-
def draw
|
45
45
|
@hide_line_markers = true
|
46
|
+
@hide_line_markers.freeze
|
47
|
+
end
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
-
return unless data_given?
|
50
|
-
|
49
|
+
def draw_graph
|
51
50
|
# Setup basic positioning
|
52
51
|
radius = @graph_height / 2.0
|
53
52
|
center_x = @graph_left + (@graph_width / 2.0)
|
@@ -64,8 +63,6 @@ class Gruff::Spider < Gruff::Base
|
|
64
63
|
draw_polygon(center_x, center_y, additive_angle)
|
65
64
|
end
|
66
65
|
|
67
|
-
private
|
68
|
-
|
69
66
|
def normalize_points(value)
|
70
67
|
value * @unit_length
|
71
68
|
end
|
@@ -77,9 +74,7 @@ private
|
|
77
74
|
x = x_offset + ((radius + r_offset) * Math.cos(angle))
|
78
75
|
y = y_offset + ((radius + r_offset) * Math.sin(angle))
|
79
76
|
|
80
|
-
|
81
|
-
text_renderer = Gruff::Renderer::Text.new(amount, font: @font, size: @legend_font_size, color: @marker_color, weight: Magick::BoldWeight)
|
82
|
-
text_renderer.add_to_render_queue(0, 0, x, y, Magick::CenterGravity)
|
77
|
+
draw_label_at(1.0, 1.0, x, y, amount, Magick::CenterGravity)
|
83
78
|
end
|
84
79
|
|
85
80
|
def draw_axes(center_x, center_y, radius, additive_angle, line_color = nil)
|
@@ -91,7 +86,7 @@ private
|
|
91
86
|
x_offset = radius * Math.cos(current_angle)
|
92
87
|
y_offset = radius * Math.sin(current_angle)
|
93
88
|
|
94
|
-
Gruff::Renderer::Line.new(color: line_color || data_row.color, width: 5.0)
|
89
|
+
Gruff::Renderer::Line.new(renderer, color: line_color || data_row.color, width: 5.0)
|
95
90
|
.render(center_x, center_y, center_x + x_offset, center_y + y_offset)
|
96
91
|
|
97
92
|
draw_label(center_x, center_y, current_angle, radius, data_row.label.to_s) unless @hide_text
|
@@ -110,7 +105,7 @@ private
|
|
110
105
|
current_angle += additive_angle
|
111
106
|
end
|
112
107
|
|
113
|
-
Gruff::Renderer::Polygon.new(color: color || @marker_color, opacity: 0.4).render(points)
|
108
|
+
Gruff::Renderer::Polygon.new(renderer, color: color || @marker_color, opacity: 0.4).render(points)
|
114
109
|
end
|
115
110
|
|
116
111
|
def sums_for_spider
|
data/lib/gruff/stacked_area.rb
CHANGED
@@ -12,27 +12,26 @@
|
|
12
12
|
#
|
13
13
|
class Gruff::StackedArea < Gruff::Base
|
14
14
|
include StackedMixin
|
15
|
-
attr_writer :last_series_goes_on_bottom
|
16
15
|
|
17
|
-
|
18
|
-
|
19
|
-
|
16
|
+
# @deprecated
|
17
|
+
def last_series_goes_on_bottom=(_value)
|
18
|
+
warn '#last_series_goes_on_bottom is deprecated. It is no longer effective.'
|
20
19
|
end
|
21
|
-
private :initialize_ivars
|
22
20
|
|
23
|
-
|
21
|
+
private
|
22
|
+
|
23
|
+
def setup_data
|
24
24
|
calculate_maximum_by_stack
|
25
25
|
super
|
26
|
+
end
|
26
27
|
|
27
|
-
|
28
|
-
|
28
|
+
def draw_graph
|
29
29
|
x_increment = @graph_width / (column_count - 1).to_f
|
30
30
|
|
31
31
|
height = Array.new(column_count, 0)
|
32
32
|
|
33
33
|
data_points = nil
|
34
|
-
|
35
|
-
store.norm_data.public_send(iterator) do |data_row|
|
34
|
+
store.norm_data.each do |data_row|
|
36
35
|
prev_data_points = data_points
|
37
36
|
data_points = []
|
38
37
|
|
@@ -64,7 +63,7 @@ class Gruff::StackedArea < Gruff::Base
|
|
64
63
|
poly_points << data_points[0]
|
65
64
|
poly_points << data_points[1]
|
66
65
|
|
67
|
-
Gruff::Renderer::Polygon.new(color: data_row.color).render(poly_points)
|
66
|
+
Gruff::Renderer::Polygon.new(renderer, color: data_row.color).render(poly_points)
|
68
67
|
end
|
69
68
|
end
|
70
69
|
end
|
data/lib/gruff/stacked_bar.rb
CHANGED
@@ -30,7 +30,9 @@ class Gruff::StackedBar < Gruff::Base
|
|
30
30
|
# Prevent drawing of column labels below a stacked bar graph. Default is +false+.
|
31
31
|
attr_writer :hide_labels
|
32
32
|
|
33
|
-
|
33
|
+
private
|
34
|
+
|
35
|
+
def initialize_attributes
|
34
36
|
super
|
35
37
|
@bar_spacing = 0.9
|
36
38
|
@segment_spacing = 2
|
@@ -38,14 +40,14 @@ class Gruff::StackedBar < Gruff::Base
|
|
38
40
|
@show_labels_for_bar_values = false
|
39
41
|
@hide_labels = false
|
40
42
|
end
|
41
|
-
private :initialize_ivars
|
42
43
|
|
43
|
-
|
44
|
-
def draw
|
44
|
+
def setup_data
|
45
45
|
calculate_maximum_by_stack
|
46
46
|
super
|
47
|
-
|
47
|
+
end
|
48
48
|
|
49
|
+
# Draws a bar graph, but multiple sets are stacked on top of each other.
|
50
|
+
def draw_graph
|
49
51
|
# Setup spacing.
|
50
52
|
#
|
51
53
|
# Columns sit stacked.
|
@@ -70,7 +72,7 @@ class Gruff::StackedBar < Gruff::Base
|
|
70
72
|
# update the total height of the current stacked bar
|
71
73
|
height[point_index] += (data_point * @graph_height)
|
72
74
|
|
73
|
-
rect_renderer = Gruff::Renderer::Rectangle.new(color: data_row.color)
|
75
|
+
rect_renderer = Gruff::Renderer::Rectangle.new(renderer, color: data_row.color)
|
74
76
|
rect_renderer.render(left_x, left_y, right_x, right_y)
|
75
77
|
|
76
78
|
# Calculate center based on bar_width and current row
|
@@ -84,13 +86,11 @@ class Gruff::StackedBar < Gruff::Base
|
|
84
86
|
|
85
87
|
if @show_labels_for_bar_values
|
86
88
|
stack_bar_value_label.prepare_rendering(@label_formatting, bar_width) do |x, y, text|
|
87
|
-
draw_value_label(x, y, text
|
89
|
+
draw_value_label(x, y, text)
|
88
90
|
end
|
89
91
|
end
|
90
92
|
end
|
91
93
|
|
92
|
-
protected
|
93
|
-
|
94
94
|
def hide_labels?
|
95
95
|
@hide_labels
|
96
96
|
end
|
data/lib/gruff/store/store.rb
CHANGED
@@ -3,27 +3,23 @@
|
|
3
3
|
module Gruff
|
4
4
|
# @private
|
5
5
|
class Store
|
6
|
-
attr_reader :data
|
6
|
+
attr_reader :data
|
7
7
|
|
8
8
|
def initialize(data_class)
|
9
9
|
@data_class = data_class
|
10
10
|
@data = []
|
11
|
-
@norm_data = []
|
12
|
-
@normalized = false
|
13
11
|
end
|
14
12
|
|
15
13
|
def add(*args)
|
16
14
|
@data << @data_class.new(*args)
|
17
15
|
end
|
18
16
|
|
19
|
-
def
|
20
|
-
|
21
|
-
|
22
|
-
@norm_data << data_row.normalize(**keywords)
|
23
|
-
end
|
17
|
+
def norm_data
|
18
|
+
@norm_data || []
|
19
|
+
end
|
24
20
|
|
25
|
-
|
26
|
-
|
21
|
+
def normalize(**keywords)
|
22
|
+
@norm_data = @data.map { |data_row| data_row.normalize(**keywords) }
|
27
23
|
end
|
28
24
|
|
29
25
|
def empty?
|
data/lib/gruff/themes.rb
CHANGED
@@ -16,7 +16,7 @@ module Gruff
|
|
16
16
|
marker_color: 'white',
|
17
17
|
font_color: 'white',
|
18
18
|
background_colors: %w[black #4a465a]
|
19
|
-
}
|
19
|
+
}.freeze
|
20
20
|
|
21
21
|
# A color scheme plucked from the colors on the popular usability blog.
|
22
22
|
THIRTYSEVEN_SIGNALS = {
|
@@ -32,7 +32,7 @@ module Gruff
|
|
32
32
|
marker_color: 'black',
|
33
33
|
font_color: 'black',
|
34
34
|
background_colors: %w[#d1edf5 white]
|
35
|
-
}
|
35
|
+
}.freeze
|
36
36
|
|
37
37
|
# A color scheme from the colors used on the 2005 Rails keynote
|
38
38
|
# presentation at RubyConf.
|
@@ -49,7 +49,7 @@ module Gruff
|
|
49
49
|
marker_color: 'white',
|
50
50
|
font_color: 'white',
|
51
51
|
background_colors: %w[#0083a3 #0083a3]
|
52
|
-
}
|
52
|
+
}.freeze
|
53
53
|
|
54
54
|
# A color scheme similar to that used on the popular podcast site.
|
55
55
|
ODEO = {
|
@@ -65,7 +65,7 @@ module Gruff
|
|
65
65
|
marker_color: 'white',
|
66
66
|
font_color: 'white',
|
67
67
|
background_colors: %w[#ff47a4 #ff1f81]
|
68
|
-
}
|
68
|
+
}.freeze
|
69
69
|
|
70
70
|
# A pastel theme
|
71
71
|
PASTEL = {
|
@@ -81,7 +81,7 @@ module Gruff
|
|
81
81
|
marker_color: '#aea9a9', # Grey
|
82
82
|
font_color: 'black',
|
83
83
|
background_colors: 'white'
|
84
|
-
}
|
84
|
+
}.freeze
|
85
85
|
|
86
86
|
# A greyscale theme
|
87
87
|
GREYSCALE = {
|
@@ -96,6 +96,6 @@ module Gruff
|
|
96
96
|
marker_color: '#aea9a9', # Grey
|
97
97
|
font_color: 'black',
|
98
98
|
background_colors: 'white'
|
99
|
-
}
|
99
|
+
}.freeze
|
100
100
|
end
|
101
101
|
end
|