ruport-util 0.6.0 → 0.7.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.
- 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>
|