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/test/test_report.rb CHANGED
@@ -1,20 +1,5 @@
1
- #tc_report.rb
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 TestReport < Test::Unit::TestCase
28
- include Ruport
12
+ class MyReport < Ruport::Report
13
+
14
+ attr_accessor :data
15
+
16
+ def generate
17
+ data
18
+ end
19
+
20
+ end
29
21
 
30
- def setup
31
- @report = Report.new
22
+ describe 'Report essentials' do
23
+ before :each do
24
+ @report = Ruport::Report.new
32
25
  end
33
26
 
34
- def test_renders_with_shortcuts
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
- assert_equal("not,abc\no,r\none,two\nthr,ee\n",a.to_csv)
29
+ csv = "not,abc\no,r\none,two\nthr,ee\n"
42
30
 
43
- assert_nil nil, a.format
44
- a.to_text
31
+ a.to_csv.should == csv
45
32
 
46
- assert_nil a.format
33
+ SampleReport.generate { |r| r.to_csv.should == csv }
47
34
  end
48
35
 
49
- def test_erb
50
- @report = Report.new
51
- @report.results = "foo"
52
- assert_equal "foo", @report.erb("<%= @results %>")
53
- assert_equal "foo\n4\n---\n", @report.erb("test/samples/foo.rtxt")
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
- class MyReport < Report; end
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
- def test_multi_reports
73
- rep_klass = MyReport.dup
74
-
75
- report1 = rep_klass.new
76
- report2 = rep_klass.new
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
- report1.file = "foo"
79
- report2.file = "bar"
66
+ before :each do
67
+ @my_report = MyReport.new
68
+ end
80
69
 
81
- rep_klass.send(:generate) { file }
70
+ def generate(table)
71
+ @my_report.data = table
72
+ end
82
73
 
83
- expected = %w[foo bar]
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
- rep_klass.run :reports => [report1,report2] do |rep|
86
- assert_equal expected.shift, rep.results
87
- end
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
- def test_timeout
93
- rep_klass = MyReport.dup
94
- rep_klass.send(:generate) { raise }
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
- assert_raises(RuntimeError){
97
- rep_klass.run(:tries => 3, :interval => 1)
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
- assert_raises(Timeout::Error) {
103
- rep_klass.run( :tries => 2,
104
- :timeout => 1,
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
@@ -1,38 +1,41 @@
1
- require "test/init"
2
- require "ruport/util/report_manager"
1
+ require 'test/helper'
3
2
 
4
- class Sample < Ruport::Report; def generate; "Hello Mike"; end; end
5
- class Sample2 < Ruport::Report; def generate; "Hello Joe"; end; end
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
- class FakeModel2;end
10
- class FakeModel3;end
6
+ MikeSample.acts_as_managed_report
7
+ JoeSample.acts_as_managed_report
11
8
 
12
- class TestReportManager < Test::Unit::TestCase
13
-
14
- def test_simple_usage
15
- assert_equal "Hello Mike", Ruport::ReportManager["Sample"].run
16
- assert_equal "Hello Joe", Ruport::ReportManager["Sample2"].run
17
- assert_equal [ Sample, Sample2 ], Ruport::ReportManager.reports
18
- end
19
-
20
- def test_add_models
21
- # we need to do this to make the tests work,no need in production code
22
- klass = Ruport::ReportManager.dup
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
- assert_equal [], klass.models
28
+ manager.models.should be_empty
25
29
 
26
- klass.add_model(FakeModel2)
27
- assert_equal [FakeModel2], klass.models
30
+ manager.add_model FakeModel2
31
+ manager.models.should have(1).model
28
32
 
29
- klass.add_model(FakeModel3)
30
- assert_equal [FakeModel2, FakeModel3], klass.models
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,FakeModel3].each do |m|
34
- assert_equal m, klass[m.name]
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.6.0
7
- date: 2007-05-30 00:00:00 -04:00
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/foo.svg
33
- - example/form.pdf
32
+ - example/data
33
+ - example/data/blank.ods
34
+ - example/mailer.rb
34
35
  - example/form.rb
35
- - example/graph_report.rb
36
+ - example/ods.rb
36
37
  - example/invoice_report.rb
37
- - example/mailer.rb
38
38
  - example/managed_report.rb
39
- - example/out.pdf
39
+ - example/graph_report.rb
40
40
  - lib/ruport
41
41
  - lib/ruport/util
42
- - lib/ruport/util.rb
43
- - lib/ruport/util/bench.rb
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/invoice.rb
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/report_manager.rb
51
- - lib/ruport/util/pdf/form.rb
52
- - test/init.rb
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>