svg_charts 1.04 → 2.0
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/Gemfile.lock +1 -1
- data/lib/charts/bar.rb +127 -0
- data/lib/charts/version.rb +1 -1
- data/lib/svg_charts.rb +1 -0
- data/spec/charts/bar_spec.rb +130 -0
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2ef2bf97f73e4421d0c5f21d46c15edc2a17e143
|
4
|
+
data.tar.gz: 53d3e6e0150077460727318a64b8c7b0f2c3dfd5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e479de15f2056ef6447f8ef1248bebb8eb6a6c914643018c9daefe7c6037e02cde5d48a561696ec62dcc4f66ebeb31094fd70e19ae3ea02736c0fff0512ef69d
|
7
|
+
data.tar.gz: bddead4d0d98523a0367c104353f965c8d53336198949c135b67539adb4e2214bfc277703eaf3e24fedba21e83cfd24aa87374e26b6418dc2756620c563ebb5d
|
data/Gemfile.lock
CHANGED
data/lib/charts/bar.rb
ADDED
@@ -0,0 +1,127 @@
|
|
1
|
+
module SVGCharts
|
2
|
+
class Bar
|
3
|
+
include SVGElements
|
4
|
+
|
5
|
+
def initialize(options)
|
6
|
+
validation options, [:width, :height, :y_retreat, :x_retreat]
|
7
|
+
|
8
|
+
@width = options[:width]
|
9
|
+
@height = options[:height]
|
10
|
+
|
11
|
+
@y_retreat = options[:y_retreat]
|
12
|
+
@x_retreat = options[:x_retreat]
|
13
|
+
end
|
14
|
+
|
15
|
+
def scale(options)
|
16
|
+
validation options, [:y_label, :x_label]
|
17
|
+
|
18
|
+
scale = line({
|
19
|
+
:x1 => @x_retreat - 8,
|
20
|
+
:x2 => @x_retreat - 8,
|
21
|
+
:y1 => @y_retreat - 2,
|
22
|
+
:y2 => @height + 13,
|
23
|
+
:line_width => 2,
|
24
|
+
:color => "#aaa"
|
25
|
+
})
|
26
|
+
|
27
|
+
scale << line({
|
28
|
+
:x1 => 0,
|
29
|
+
:x2 => @width,
|
30
|
+
:y1 => @height,
|
31
|
+
:y2 => @height,
|
32
|
+
:line_width => 2,
|
33
|
+
:color => "#aaa"
|
34
|
+
})
|
35
|
+
|
36
|
+
scale << text({
|
37
|
+
:x => @width/2 - (options[:y_label].length * 2),
|
38
|
+
:y => @height + 30,
|
39
|
+
:color => "#bbb",
|
40
|
+
:font_size => 11,
|
41
|
+
:font_weight => "bold",
|
42
|
+
:value => options[:x_label]
|
43
|
+
})
|
44
|
+
|
45
|
+
scale << text_with_rotation({
|
46
|
+
:x => @height/2 - (options[:y_label].length * 2),
|
47
|
+
:y => 8,
|
48
|
+
:color => "#bbb",
|
49
|
+
:font_size => 11,
|
50
|
+
:font_weight => "bold",
|
51
|
+
:rotate => "270 #{@height/2} #{@height/2}",
|
52
|
+
:value => options[:y_label]
|
53
|
+
})
|
54
|
+
|
55
|
+
scale
|
56
|
+
end
|
57
|
+
|
58
|
+
def draw(options)
|
59
|
+
validation options, [:scale, :data, :data_color, :show_scale]
|
60
|
+
|
61
|
+
calculate_coordinates options[:data]
|
62
|
+
|
63
|
+
elements = ""
|
64
|
+
|
65
|
+
@coordinates.each_with_index do |coordinate, i|
|
66
|
+
elements << rect({
|
67
|
+
:x => coordinate[0] * 1.025,
|
68
|
+
:y => coordinate[2],
|
69
|
+
:width => coordinate[1] - coordinate[0],
|
70
|
+
:height => @height - coordinate[2],
|
71
|
+
:color => options[:data_color]
|
72
|
+
})
|
73
|
+
|
74
|
+
elements << text({
|
75
|
+
:x => (((coordinate[1] - coordinate[0]) - options[:scale][i].length)/2) + (coordinate[0] * 1.025) - 10,
|
76
|
+
:y => coordinate[2] - 10,
|
77
|
+
:color => options[:data_color],
|
78
|
+
:font_size => 11,
|
79
|
+
:font_weight => "bold",
|
80
|
+
:value => options[:data][i]
|
81
|
+
})
|
82
|
+
|
83
|
+
if options[:show_scale]
|
84
|
+
elements << text({
|
85
|
+
:x => (((coordinate[1] - coordinate[0]) - options[:scale][i].length)/2) + (coordinate[0] * 1.025) - 10,
|
86
|
+
:y => @height + 12,
|
87
|
+
:color => "#999",
|
88
|
+
:font_size => 10,
|
89
|
+
:font_weight => "normal",
|
90
|
+
:value => options[:scale][i]
|
91
|
+
})
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
elements
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
def calculate_coordinates(data)
|
100
|
+
@coordinates = []
|
101
|
+
|
102
|
+
y_positions = (@height - @y_retreat)/data.max
|
103
|
+
x_positions = (@width - (@x_retreat * 2))/data.size
|
104
|
+
|
105
|
+
data.each_with_index do |value, i|
|
106
|
+
x1 = @x_retreat + (x_positions * i)
|
107
|
+
y1 = @height - (y_positions * value)
|
108
|
+
|
109
|
+
unless data[i + 1].nil?
|
110
|
+
x2 = @x_retreat + (x_positions * (i + 1))
|
111
|
+
else
|
112
|
+
x2 = @width - (@x_retreat + 12)
|
113
|
+
end
|
114
|
+
|
115
|
+
@coordinates << [x1.abs, x2.abs, y1.abs]
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def validation(options, params)
|
120
|
+
raise ArgumentError if options.empty?
|
121
|
+
|
122
|
+
params.each do |key|
|
123
|
+
raise ArgumentError unless options.has_key?(key)
|
124
|
+
end
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
data/lib/charts/version.rb
CHANGED
data/lib/svg_charts.rb
CHANGED
@@ -0,0 +1,130 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe SVGCharts::Bar do
|
4
|
+
context "initialize object" do
|
5
|
+
context "missing parameters" do
|
6
|
+
it "when hash empty" do
|
7
|
+
expect { chart = SVGCharts::Bar.new }.to raise_error(ArgumentError)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "when the hash keys is incomplete" do
|
11
|
+
options = {
|
12
|
+
:width => 300,
|
13
|
+
:height => 300
|
14
|
+
}
|
15
|
+
|
16
|
+
expect { chart = SVGCharts::Bar.new options }.to raise_error(ArgumentError)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def count_words(expression, target)
|
22
|
+
counter = 0
|
23
|
+
|
24
|
+
expression.split.each do |word|
|
25
|
+
counter += 1 if word.include? target
|
26
|
+
end
|
27
|
+
|
28
|
+
counter
|
29
|
+
end
|
30
|
+
|
31
|
+
context "set scale" do
|
32
|
+
before do
|
33
|
+
@svg_chart = SVGCharts::Bar.new({
|
34
|
+
:height => 300,
|
35
|
+
:width => 300,
|
36
|
+
:y_retreat => 20,
|
37
|
+
:x_retreat => 20
|
38
|
+
})
|
39
|
+
end
|
40
|
+
|
41
|
+
context "missing parameters" do
|
42
|
+
it "when hash empty" do
|
43
|
+
expect { chart = @svg_chart.scale }.to raise_error(ArgumentError)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "when the hash keys is incomplete" do
|
47
|
+
options = {
|
48
|
+
:y_label => "First label"
|
49
|
+
}
|
50
|
+
|
51
|
+
expect { chart = @svg_chart.scale options }.to raise_error(ArgumentError)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "when generated" do
|
56
|
+
it "check values" do
|
57
|
+
scale = @svg_chart.scale({
|
58
|
+
:y_label => "Label1",
|
59
|
+
:x_label => "Label2"
|
60
|
+
})
|
61
|
+
|
62
|
+
scale = scale.gsub( /<[^>]*>/, " ").split
|
63
|
+
scale.should include("Label1")
|
64
|
+
scale.should include("Label2")
|
65
|
+
end
|
66
|
+
|
67
|
+
it "check elements" do
|
68
|
+
scale = @svg_chart.scale({
|
69
|
+
:y_label => "Label1",
|
70
|
+
:x_label => "Label2"
|
71
|
+
})
|
72
|
+
|
73
|
+
count_words(scale, "<line").should == 2
|
74
|
+
count_words(scale, "<text").should == 2
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
context "set chart" do
|
80
|
+
before do
|
81
|
+
@svg_chart = SVGCharts::Bar.new({
|
82
|
+
:height => 300,
|
83
|
+
:width => 300,
|
84
|
+
:y_retreat => 20,
|
85
|
+
:x_retreat => 20
|
86
|
+
})
|
87
|
+
end
|
88
|
+
|
89
|
+
context "missing parameters" do
|
90
|
+
it "when hash empty" do
|
91
|
+
expect { chart = @svg_chart.draw }.to raise_error(ArgumentError)
|
92
|
+
end
|
93
|
+
|
94
|
+
it "when the hash keys is incomplete" do
|
95
|
+
options = {
|
96
|
+
:data_color => "#000000",
|
97
|
+
:show_scale => false
|
98
|
+
}
|
99
|
+
|
100
|
+
expect { chart = @svg_chart.draw options }.to raise_error(ArgumentError)
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
context "when generated" do
|
105
|
+
it "check elements with no scale and dashed" do
|
106
|
+
chart = @svg_chart.draw({
|
107
|
+
:scale => ["A", "B", "C"],
|
108
|
+
:data => [10, 20, 30],
|
109
|
+
:data_color => "#000000",
|
110
|
+
:show_scale => false
|
111
|
+
})
|
112
|
+
|
113
|
+
count_words(chart, "<rect").should == 3
|
114
|
+
count_words(chart, "<text").should == 3
|
115
|
+
end
|
116
|
+
|
117
|
+
it "check elements with scale and dashed" do
|
118
|
+
chart = @svg_chart.draw({
|
119
|
+
:scale => ["A", "B", "C"],
|
120
|
+
:data => [10, 20, 30],
|
121
|
+
:data_color => "#000000",
|
122
|
+
:show_scale => true
|
123
|
+
})
|
124
|
+
|
125
|
+
count_words(chart, "<rect").should == 3
|
126
|
+
count_words(chart, "<text").should == 6
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: svg_charts
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '
|
4
|
+
version: '2.0'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rogério Zambon
|
@@ -35,10 +35,12 @@ files:
|
|
35
35
|
- Gemfile
|
36
36
|
- Gemfile.lock
|
37
37
|
- README.md
|
38
|
+
- lib/charts/bar.rb
|
38
39
|
- lib/charts/elements.rb
|
39
40
|
- lib/charts/line.rb
|
40
41
|
- lib/charts/version.rb
|
41
42
|
- lib/svg_charts.rb
|
43
|
+
- spec/charts/bar_spec.rb
|
42
44
|
- spec/charts/line_spec.rb
|
43
45
|
- spec/spec_helper.rb
|
44
46
|
- svg_charts.gemspec
|