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/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>