ruport-util 0.6.0 → 0.7.0
Sign up to get free protection for your applications and to get access to all the features.
- data/INSTALL +8 -7
- data/Rakefile +66 -11
- data/bin/csv2ods +53 -0
- data/example/data/blank.ods +0 -0
- data/example/graph_report.rb +6 -2
- data/example/invoice_report.rb +2 -1
- data/example/mailer.rb +7 -7
- data/example/managed_report.rb +5 -5
- data/example/ods.rb +12 -0
- data/lib/ruport/util/generator.rb +2 -11
- data/lib/ruport/util/graph.rb +8 -0
- data/lib/ruport/util/ods.rb +80 -0
- data/lib/ruport/util/report.rb +33 -299
- data/lib/ruport/util/report_manager.rb +2 -3
- data/lib/ruport/util.rb +9 -1
- data/test/helper/layout.rb +55 -0
- data/test/helper/wrap.rb +190 -0
- data/test/helper.rb +27 -0
- data/test/test_format_ods.rb +46 -0
- data/test/test_graph_renderer.rb +21 -31
- data/test/test_invoice.rb +30 -28
- data/test/test_mailer.rb +116 -159
- data/test/test_report.rb +80 -183
- data/test/test_report_manager.rb +32 -29
- metadata +30 -22
- data/example/foo.svg +0 -83
- data/example/form.pdf +0 -160
- data/example/out.pdf +0 -229
- data/test/init.rb +0 -7
data/test/test_report.rb
CHANGED
@@ -1,20 +1,5 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
# Created by Gregory Thomas Brown on 2005-08-09
|
4
|
-
# Copyright 2005 (Gregory Brown) All rights reserved.
|
5
|
-
|
6
|
-
require "test/unit"
|
7
|
-
begin; require "rubygems"; rescue LoadError; nil; end
|
8
|
-
require "ruport"
|
9
|
-
require "ruport/util/report"
|
10
|
-
|
11
|
-
begin
|
12
|
-
require 'mocha'
|
13
|
-
require 'stubba'
|
14
|
-
require 'net/smtp'
|
15
|
-
rescue LoadError
|
16
|
-
$stderr.puts "Warning: Mocha not found -- skipping some Report tests"
|
17
|
-
end
|
1
|
+
require 'test/helper'
|
2
|
+
require 'net/smtp'
|
18
3
|
|
19
4
|
class SampleReport < Ruport::Report
|
20
5
|
renders_with Ruport::Renderer::Table
|
@@ -24,195 +9,107 @@ class SampleReport < Ruport::Report
|
|
24
9
|
end
|
25
10
|
end
|
26
11
|
|
27
|
-
class
|
28
|
-
|
12
|
+
class MyReport < Ruport::Report
|
13
|
+
|
14
|
+
attr_accessor :data
|
15
|
+
|
16
|
+
def generate
|
17
|
+
data
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
29
21
|
|
30
|
-
|
31
|
-
|
22
|
+
describe 'Report essentials' do
|
23
|
+
before :each do
|
24
|
+
@report = Ruport::Report.new
|
32
25
|
end
|
33
26
|
|
34
|
-
|
35
|
-
a = SampleReport.new(:csv)
|
36
|
-
assert_equal("not,abc\no,r\none,two\nthr,ee\n",a.run)
|
37
|
-
assert_equal("not,abc\no,r\none,two\nthr,ee\n",SampleReport.as(:csv))
|
38
|
-
assert_equal("not,abc\no,r\none,two\nthr,ee\n",SampleReport.to_csv)
|
39
|
-
assert_equal("not,abc\no,r\none,two\nthr,ee\n",a.to_csv)
|
27
|
+
it 'should render with shortcuts' do
|
40
28
|
a = SampleReport.new
|
41
|
-
|
29
|
+
csv = "not,abc\no,r\none,two\nthr,ee\n"
|
42
30
|
|
43
|
-
|
44
|
-
a.to_text
|
31
|
+
a.to_csv.should == csv
|
45
32
|
|
46
|
-
|
33
|
+
SampleReport.generate { |r| r.to_csv.should == csv }
|
47
34
|
end
|
48
35
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
36
|
+
end
|
37
|
+
|
38
|
+
describe 'Writing Report to files' do
|
39
|
+
def file_mock(mode, filename, content)
|
40
|
+
file = mock("File #{filename}")
|
41
|
+
|
42
|
+
file.should_receive(:<<).
|
43
|
+
with(content).and_return(file)
|
44
|
+
|
45
|
+
File.should_receive(:open).
|
46
|
+
with(filename, mode).once.
|
47
|
+
and_yield(file)
|
54
48
|
end
|
55
49
|
|
56
|
-
|
57
|
-
|
58
|
-
def test_klass_methods
|
59
|
-
rep_klass = MyReport.dup
|
60
|
-
rep_klass.send(:prepare) { self.file = "foo.csv" }
|
61
|
-
rep_klass.send(:generate) { "hello dolly" }
|
62
|
-
rep_klass.send(:cleanup) { @foo = "bar" }
|
63
|
-
report = rep_klass.new
|
64
|
-
report.run { |rep|
|
65
|
-
assert_equal("foo.csv",rep.file)
|
66
|
-
assert_equal("hello dolly",rep.results)
|
67
|
-
assert_equal(nil,rep.instance_eval("@foo"))
|
68
|
-
}
|
69
|
-
assert_equal("bar",report.instance_eval("@foo"))
|
50
|
+
before :each do
|
51
|
+
@report = SampleReport.new
|
70
52
|
end
|
71
53
|
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
54
|
+
it 'should write correctly to files' do
|
55
|
+
file_mock(mode = 'w', filename = 'foo.csv',
|
56
|
+
content = "not,abc\no,r\none,two\nthr,ee\n")
|
57
|
+
@report.save_as(filename).should_not be_nil
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe 'MyReport rendering' do
|
62
|
+
before :all do
|
63
|
+
@table = [[1,2,3],[4,5,6]].to_table(%w[a b c])
|
64
|
+
end
|
77
65
|
|
78
|
-
|
79
|
-
|
66
|
+
before :each do
|
67
|
+
@my_report = MyReport.new
|
68
|
+
end
|
80
69
|
|
81
|
-
|
70
|
+
def generate(table)
|
71
|
+
@my_report.data = table
|
72
|
+
end
|
82
73
|
|
83
|
-
|
74
|
+
it 'should renders_with Renderer::Table' do
|
75
|
+
MyReport.renders_with Ruport::Renderer::Table
|
76
|
+
generate @table
|
77
|
+
@my_report.to_csv.should == "a,b,c\n1,2,3\n4,5,6\n"
|
78
|
+
end
|
84
79
|
|
85
|
-
|
86
|
-
|
87
|
-
|
80
|
+
it 'should renders_with Renderer::Table and optional headers' do
|
81
|
+
MyReport.renders_with Ruport::Renderer::Table, :show_table_headers => false
|
82
|
+
generate @table
|
88
83
|
|
84
|
+
@my_report.to_csv.should == "1,2,3\n4,5,6\n"
|
85
|
+
@my_report.to_csv(:show_table_headers => true).should == "a,b,c\n1,2,3\n4,5,6\n"
|
89
86
|
end
|
90
87
|
|
88
|
+
it 'should render as table' do
|
89
|
+
MyReport.renders_as_table
|
90
|
+
generate @table
|
91
91
|
|
92
|
-
|
93
|
-
|
94
|
-
|
92
|
+
@my_report.to_csv.should == "a,b,c\n1,2,3\n4,5,6\n"
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'should render as row' do
|
96
|
+
MyReport.renders_as_row
|
97
|
+
generate @table[0]
|
95
98
|
|
96
|
-
|
97
|
-
|
98
|
-
}
|
99
|
-
|
100
|
-
rep_klass.send(:generate) { sleep 1.1 }
|
99
|
+
@my_report.to_csv.should == "1,2,3\n"
|
100
|
+
end
|
101
101
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
:interval => 1,
|
106
|
-
:log_level => :log_only)
|
107
|
-
}
|
102
|
+
it 'should render as group' do
|
103
|
+
MyReport.renders_as_group
|
104
|
+
generate @table.to_group('foo')
|
108
105
|
|
106
|
+
@my_report.to_csv.should == "foo\n\na,b,c\n1,2,3\n4,5,6\n"
|
109
107
|
end
|
110
|
-
|
111
|
-
def test_return_value
|
112
|
-
rep_klass = MyReport.dup
|
113
|
-
rep_klass.send(:generate) { "hello dolly" }
|
114
|
-
|
115
|
-
# single report
|
116
|
-
assert_equal "hello dolly", rep_klass.run
|
117
|
-
|
118
|
-
# multiple reports
|
119
|
-
assert_equal ["hello dolly", "hello dolly"],
|
120
|
-
rep_klass.run(:reports => [rep_klass.new,rep_klass.new])
|
121
|
-
end
|
122
|
-
|
123
|
-
def test_write_to_file
|
124
|
-
return unless Object.const_defined? :Mocha
|
125
|
-
file = mock("file")
|
126
|
-
|
127
|
-
File.expects(:open).
|
128
|
-
with("foo.csv","w").yields(file).returns(file).at_least_once
|
129
|
-
|
130
|
-
file.expects(:<<).
|
131
|
-
with("results").returns(file).at_least_once
|
132
|
-
|
133
|
-
@report = Report.new
|
134
|
-
assert @report.write("foo.csv", "results")
|
135
|
-
end
|
136
|
-
|
137
|
-
def test_append_to_file
|
138
|
-
return unless Object.const_defined? :Mocha
|
139
|
-
file = mock("file")
|
140
|
-
|
141
|
-
File.expects(:open).
|
142
|
-
with("foo.csv","a").yields(file).returns(file).at_least_once
|
143
|
-
|
144
|
-
file.expects(:<<).
|
145
|
-
with("results").returns(file).at_least_once
|
146
|
-
|
147
|
-
@report = Report.new
|
148
|
-
assert @report.append("foo.csv", "results")
|
149
|
-
end
|
150
|
-
|
151
|
-
def test_load_csv
|
152
|
-
expected = [%w[a b c],['d', nil, 'e']].to_table(%w[col1 col2 col3])
|
153
|
-
|
154
|
-
@report = Report.new
|
155
|
-
table = @report.load_csv("test/samples/data.csv")
|
156
|
-
|
157
|
-
assert_equal expected, table
|
158
|
-
end
|
159
|
-
|
160
|
-
def test_load_csv_as_array
|
161
|
-
expected = [%w[a b c],['d', nil, 'e']]
|
162
|
-
|
163
|
-
@report = Report.new
|
164
|
-
array = @report.load_csv("test/samples/data.csv", :as => :array)
|
165
|
-
|
166
|
-
assert_equal expected, array
|
167
|
-
end
|
168
|
-
|
169
|
-
def test_renders_with
|
170
|
-
klass = MyReport.dup
|
171
|
-
klass.renders_with Ruport::Renderer::Table
|
172
|
-
klass.send(:generate) { [[1,2,3],[4,5,6]].to_table(%w[a b c]) }
|
173
|
-
a = klass.new(:csv)
|
174
|
-
assert_equal "a,b,c\n1,2,3\n4,5,6\n", a.run
|
175
|
-
|
176
|
-
klass.renders_with Ruport::Renderer::Table, :show_table_headers => false
|
177
|
-
a = klass.new(:csv)
|
178
|
-
assert_equal "1,2,3\n4,5,6\n", a.run
|
179
|
-
assert_equal "a,b,c\n1,2,3\n4,5,6\n", a.run(:show_table_headers => true)
|
180
|
-
|
181
|
-
|
182
|
-
end
|
183
|
-
|
184
|
-
def test_renders_as_table
|
185
|
-
klass = MyReport.dup
|
186
|
-
klass.renders_as_table
|
187
|
-
klass.send(:generate) { [[1,2,3],[4,5,6]].to_table(%w[a b c]) }
|
188
|
-
a = klass.new(:csv)
|
189
|
-
assert_equal "a,b,c\n1,2,3\n4,5,6\n", a.run
|
190
|
-
end
|
191
|
-
|
192
|
-
def test_renders_as_row
|
193
|
-
klass = MyReport.dup
|
194
|
-
klass.renders_as_row
|
195
|
-
klass.send(:generate) { [[1,2,3]].to_table(%w[a b c])[0] }
|
196
|
-
a = klass.new(:csv)
|
197
|
-
assert_equal "1,2,3\n", a.run
|
198
|
-
end
|
199
|
-
|
200
|
-
def test_renders_as_group
|
201
|
-
klass = MyReport.dup
|
202
|
-
klass.renders_as_group
|
203
|
-
klass.send(:generate) { [[1,2,3]].to_table(%w[a b c]).to_group("foo") }
|
204
|
-
a = klass.new(:csv)
|
205
|
-
assert_equal "foo\n\na,b,c\n1,2,3\n", a.run
|
206
|
-
end
|
207
|
-
|
208
|
-
def test_renders_as_grouping
|
209
|
-
klass = MyReport.dup
|
210
|
-
klass.renders_as_grouping
|
211
|
-
klass.send(:generate) {
|
212
|
-
Grouping([[1,2,3],[4,5,6]].to_table(%w[a b c]),:by => "a")
|
213
|
-
}
|
214
|
-
a = klass.new(:csv)
|
215
|
-
assert_equal "1\n\nb,c\n2,3\n\n4\n\nb,c\n5,6\n\n", a.run
|
216
|
-
end
|
217
108
|
|
109
|
+
it 'should render as grouping' do
|
110
|
+
MyReport.renders_as_grouping
|
111
|
+
generate Grouping(@table, :by => 'a')
|
112
|
+
|
113
|
+
@my_report.to_csv.should == "1\n\nb,c\n2,3\n\n4\n\nb,c\n5,6\n\n"
|
114
|
+
end
|
218
115
|
end
|
data/test/test_report_manager.rb
CHANGED
@@ -1,38 +1,41 @@
|
|
1
|
-
require
|
2
|
-
require "ruport/util/report_manager"
|
1
|
+
require 'test/helper'
|
3
2
|
|
4
|
-
class
|
5
|
-
class
|
6
|
-
Sample.acts_as_managed_report
|
7
|
-
Sample2.acts_as_managed_report
|
3
|
+
class MikeSample < Ruport::Report; def generate; "Hello Mike"; end; end
|
4
|
+
class JoeSample < Ruport::Report; def generate; "Hello Joe"; end; end
|
8
5
|
|
9
|
-
|
10
|
-
|
6
|
+
MikeSample.acts_as_managed_report
|
7
|
+
JoeSample.acts_as_managed_report
|
11
8
|
|
12
|
-
class
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
9
|
+
class FakeModel2; end
|
10
|
+
class FakeModel3; end
|
11
|
+
|
12
|
+
describe 'ReportManager' do
|
13
|
+
before :all do
|
14
|
+
@manager = Ruport::ReportManager
|
15
|
+
end
|
16
|
+
|
17
|
+
it 'should handle reports' do
|
18
|
+
@manager['MikeSample'].should == MikeSample
|
19
|
+
@manager['JoeSample'].should == JoeSample
|
20
|
+
|
21
|
+
[ MikeSample, JoeSample ].should == @manager.reports
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'should add models' do
|
25
|
+
# only for testing, no need for it in production code
|
26
|
+
manager = @manager.dup
|
23
27
|
|
24
|
-
|
28
|
+
manager.models.should be_empty
|
25
29
|
|
26
|
-
|
27
|
-
|
30
|
+
manager.add_model FakeModel2
|
31
|
+
manager.models.should have(1).model
|
28
32
|
|
29
|
-
|
30
|
-
|
33
|
+
manager.add_model FakeModel3
|
34
|
+
manager.models.should have(2).models
|
31
35
|
|
32
36
|
# let's make sure we can still grab these by name (a string)
|
33
|
-
[FakeModel2,
|
34
|
-
|
37
|
+
[ FakeModel2, FakeModel2 ].each do |model|
|
38
|
+
manager[model.name].should == model
|
35
39
|
end
|
36
|
-
end
|
37
|
-
|
38
|
-
end
|
40
|
+
end
|
41
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: ruport-util
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2007-
|
6
|
+
version: 0.7.0
|
7
|
+
date: 2007-06-07 00:00:00 -04:00
|
8
8
|
summary: A set of tools and helper libs for Ruby Reports
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -29,44 +29,51 @@ post_install_message:
|
|
29
29
|
authors:
|
30
30
|
- Gregory Brown
|
31
31
|
files:
|
32
|
-
- example/
|
33
|
-
- example/
|
32
|
+
- example/data
|
33
|
+
- example/data/blank.ods
|
34
|
+
- example/mailer.rb
|
34
35
|
- example/form.rb
|
35
|
-
- example/
|
36
|
+
- example/ods.rb
|
36
37
|
- example/invoice_report.rb
|
37
|
-
- example/mailer.rb
|
38
38
|
- example/managed_report.rb
|
39
|
-
- example/
|
39
|
+
- example/graph_report.rb
|
40
40
|
- lib/ruport
|
41
41
|
- lib/ruport/util
|
42
|
-
- lib/ruport/util
|
43
|
-
- lib/ruport/util/
|
42
|
+
- lib/ruport/util/pdf
|
43
|
+
- lib/ruport/util/pdf/form.rb
|
44
44
|
- lib/ruport/util/generator.rb
|
45
|
+
- lib/ruport/util/bench.rb
|
45
46
|
- lib/ruport/util/graph.rb
|
46
|
-
- lib/ruport/util/
|
47
|
+
- lib/ruport/util/ods.rb
|
48
|
+
- lib/ruport/util/report_manager.rb
|
47
49
|
- lib/ruport/util/mailer.rb
|
48
|
-
- lib/ruport/util/pdf
|
49
50
|
- lib/ruport/util/report.rb
|
50
|
-
- lib/ruport/util/
|
51
|
-
- lib/ruport/util
|
52
|
-
- test/
|
51
|
+
- lib/ruport/util/invoice.rb
|
52
|
+
- lib/ruport/util.rb
|
53
|
+
- test/helper
|
54
|
+
- test/helper/layout.rb
|
55
|
+
- test/helper/wrap.rb
|
53
56
|
- test/samples
|
54
|
-
- test/test_graph_renderer.rb
|
55
|
-
- test/test_invoice.rb
|
56
|
-
- test/test_mailer.rb
|
57
|
-
- test/test_report.rb
|
58
|
-
- test/test_report_manager.rb
|
59
57
|
- test/samples/data.csv
|
60
58
|
- test/samples/foo.rtxt
|
59
|
+
- test/test_mailer.rb
|
60
|
+
- test/helper.rb
|
61
|
+
- test/test_report_manager.rb
|
62
|
+
- test/test_graph_renderer.rb
|
63
|
+
- test/test_report.rb
|
64
|
+
- test/test_invoice.rb
|
65
|
+
- test/test_format_ods.rb
|
66
|
+
- bin/csv2ods
|
61
67
|
- bin/rope
|
62
68
|
- Rakefile
|
63
69
|
- INSTALL
|
64
70
|
test_files:
|
65
|
-
- test/test_graph_renderer.rb
|
66
|
-
- test/test_invoice.rb
|
67
71
|
- test/test_mailer.rb
|
68
|
-
- test/test_report.rb
|
69
72
|
- test/test_report_manager.rb
|
73
|
+
- test/test_graph_renderer.rb
|
74
|
+
- test/test_report.rb
|
75
|
+
- test/test_invoice.rb
|
76
|
+
- test/test_format_ods.rb
|
70
77
|
rdoc_options:
|
71
78
|
- --title
|
72
79
|
- ruport-util Documentation
|
@@ -77,6 +84,7 @@ extra_rdoc_files:
|
|
77
84
|
- INSTALL
|
78
85
|
executables:
|
79
86
|
- rope
|
87
|
+
- csv2ods
|
80
88
|
extensions: []
|
81
89
|
|
82
90
|
requirements: []
|
data/example/foo.svg
DELETED
@@ -1,83 +0,0 @@
|
|
1
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
-
<?DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd" type=""?>
|
3
|
-
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="300" width="500">
|
4
|
-
<g id="scruffy_graph">
|
5
|
-
<g transform="translate(0.0, 0.0)" id="background">
|
6
|
-
<defs>
|
7
|
-
<linearGradient y2="100%" x1="0%" x2="0%" id="BackgroundGradient" y1="0%">
|
8
|
-
<stop stop-color="black" offset="5%"/>
|
9
|
-
<stop stop-color="#4A465A" offset="95%"/>
|
10
|
-
</linearGradient>
|
11
|
-
</defs>
|
12
|
-
<rect x="0" y="0" height="300.0" width="500.0" fill="url(#BackgroundGradient)"/>
|
13
|
-
</g>
|
14
|
-
<g transform="translate(25.0, 6.0)" id="title">
|
15
|
-
<text x="225.0" font-size="21.0" text-anchor="middle" y="21.0" class="title" stroke-width="0" fill="white" stroke="none"></text>
|
16
|
-
</g>
|
17
|
-
<g transform="translate(10.0, 78.0)" id="view">
|
18
|
-
<g>
|
19
|
-
<g transform="translate(0.0, 3.96)" id="values">
|
20
|
-
<text x="80.1" font-size="14.0976" text-anchor="end" y="176.22" fill="white">0</text>
|
21
|
-
<text x="80.1" font-size="14.0976" text-anchor="end" y="132.165" fill="white">18</text>
|
22
|
-
<text x="80.1" font-size="14.0976" text-anchor="end" y="88.11" fill="white">35</text>
|
23
|
-
<text x="80.1" font-size="14.0976" text-anchor="end" y="44.055" fill="white">52</text>
|
24
|
-
<text x="80.1" font-size="14.0976" text-anchor="end" y="0.0" fill="white">70</text>
|
25
|
-
</g>
|
26
|
-
<g transform="translate(89.0, 0.0)" id="grid">
|
27
|
-
<line y2="0.0" x1="0" x2="356.0" style="stroke: white; stroke-width: 2;" y1="0.0"/>
|
28
|
-
<line y2="44.055" x1="0" x2="356.0" style="stroke: white; stroke-width: 2;" y1="44.055"/>
|
29
|
-
<line y2="88.11" x1="0" x2="356.0" style="stroke: white; stroke-width: 2;" y1="88.11"/>
|
30
|
-
<line y2="132.165" x1="0" x2="356.0" style="stroke: white; stroke-width: 2;" y1="132.165"/>
|
31
|
-
<line y2="176.22" x1="0" x2="356.0" style="stroke: white; stroke-width: 2;" y1="176.22"/>
|
32
|
-
</g>
|
33
|
-
<g transform="translate(89.0, 182.16)" id="labels">
|
34
|
-
<text x="0.0" font-size="14.256" text-anchor="middle" y="15.84" fill="white">a</text>
|
35
|
-
<text x="89.0" font-size="14.256" text-anchor="middle" y="15.84" fill="white">b</text>
|
36
|
-
<text x="178.0" font-size="14.256" text-anchor="middle" y="15.84" fill="white">c</text>
|
37
|
-
<text x="267.0" font-size="14.256" text-anchor="middle" y="15.84" fill="white">d</text>
|
38
|
-
<text x="356.0" font-size="14.256" text-anchor="middle" y="15.84" fill="white">e</text>
|
39
|
-
</g>
|
40
|
-
<g transform="translate(89.0, 0.0)" id="graphs">
|
41
|
-
<g class="graph_layer" id="component_graphs_graph_0">
|
42
|
-
<g class="shadow" transform="translate(0.8811, 0.8811)">
|
43
|
-
<polyline points="0.0,173.702571428571 89.0,171.185142857143 178.0,168.667714285714 267.0,166.150285714286 356.0,163.632857142857" stroke-width="3.5244" style="fill-opacity: 0; stroke-opacity: 0.35" fill="transparent" stroke="black"/>
|
44
|
-
<circle cx="0.0" cy="175.288551428571" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
45
|
-
<circle cx="89.0" cy="172.771122857143" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
46
|
-
<circle cx="178.0" cy="170.253694285714" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
47
|
-
<circle cx="267.0" cy="167.736265714286" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
48
|
-
<circle cx="356.0" cy="165.218837142857" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
49
|
-
</g>
|
50
|
-
<polyline points="0.0,173.702571428571 89.0,171.185142857143 178.0,168.667714285714 267.0,166.150285714286 356.0,163.632857142857" stroke-width="3.5244" fill="none" stroke="#6886B4"/>
|
51
|
-
<circle cx="0.0" cy="173.702571428571" style="stroke-width: 3.5244; stroke: #6886B4; fill: #6886B4" r="3.5244"/>
|
52
|
-
<circle cx="89.0" cy="171.185142857143" style="stroke-width: 3.5244; stroke: #6886B4; fill: #6886B4" r="3.5244"/>
|
53
|
-
<circle cx="178.0" cy="168.667714285714" style="stroke-width: 3.5244; stroke: #6886B4; fill: #6886B4" r="3.5244"/>
|
54
|
-
<circle cx="267.0" cy="166.150285714286" style="stroke-width: 3.5244; stroke: #6886B4; fill: #6886B4" r="3.5244"/>
|
55
|
-
<circle cx="356.0" cy="163.632857142857" style="stroke-width: 3.5244; stroke: #6886B4; fill: #6886B4" r="3.5244"/>
|
56
|
-
</g>
|
57
|
-
<g class="graph_layer" id="component_graphs_graph_1">
|
58
|
-
<g class="shadow" transform="translate(0.8811, 0.8811)">
|
59
|
-
<polyline points="0.0,148.528285714286 89.0,120.836571428571 178.0,0.0 267.0,171.185142857143 356.0,128.388857142857" stroke-width="3.5244" style="fill-opacity: 0; stroke-opacity: 0.35" fill="transparent" stroke="black"/>
|
60
|
-
<circle cx="0.0" cy="150.114265714286" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
61
|
-
<circle cx="89.0" cy="122.422551428571" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
62
|
-
<circle cx="178.0" cy="1.58598" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
63
|
-
<circle cx="267.0" cy="172.771122857143" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
64
|
-
<circle cx="356.0" cy="129.974837142857" style="stroke-width: 3.5244; stroke: black; opacity: 0.35;" r="3.5244"/>
|
65
|
-
</g>
|
66
|
-
<polyline points="0.0,148.528285714286 89.0,120.836571428571 178.0,0.0 267.0,171.185142857143 356.0,128.388857142857" stroke-width="3.5244" fill="none" stroke="#FDD84E"/>
|
67
|
-
<circle cx="0.0" cy="148.528285714286" style="stroke-width: 3.5244; stroke: #FDD84E; fill: #FDD84E" r="3.5244"/>
|
68
|
-
<circle cx="89.0" cy="120.836571428571" style="stroke-width: 3.5244; stroke: #FDD84E; fill: #FDD84E" r="3.5244"/>
|
69
|
-
<circle cx="178.0" cy="0.0" style="stroke-width: 3.5244; stroke: #FDD84E; fill: #FDD84E" r="3.5244"/>
|
70
|
-
<circle cx="267.0" cy="171.185142857143" style="stroke-width: 3.5244; stroke: #FDD84E; fill: #FDD84E" r="3.5244"/>
|
71
|
-
<circle cx="356.0" cy="128.388857142857" style="stroke-width: 3.5244; stroke: #FDD84E; fill: #FDD84E" r="3.5244"/>
|
72
|
-
</g>
|
73
|
-
</g>
|
74
|
-
</g>
|
75
|
-
</g>
|
76
|
-
<g transform="translate(25.0, 39.0)" id="legend">
|
77
|
-
<rect x="180.0" y="4.5" height="9.0" width="10.8" fill="#6886B4"/>
|
78
|
-
<text x="198.0" font-size="14.4" y="14.4" fill="white">foo</text>
|
79
|
-
<rect x="234.0" y="4.5" height="9.0" width="10.8" fill="#FDD84E"/>
|
80
|
-
<text x="252.0" font-size="14.4" y="14.4" fill="white">bar</text>
|
81
|
-
</g>
|
82
|
-
</g>
|
83
|
-
</svg>
|