ruport 0.8.14 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README +42 -107
- data/Rakefile +29 -32
- data/examples/centered_pdf_text_box.rb +13 -19
- data/examples/example.csv +3 -0
- data/examples/line_plotter.rb +15 -15
- data/examples/pdf_complex_report.rb +10 -23
- data/examples/pdf_table_with_title.rb +12 -12
- data/examples/rope_examples/itunes/Rakefile +22 -1
- data/examples/rope_examples/itunes/config/environment.rb +4 -0
- data/examples/rope_examples/itunes/lib/init.rb +32 -2
- data/examples/rope_examples/itunes/util/build +50 -16
- data/examples/rope_examples/sales_report/README +1 -1
- data/examples/rope_examples/sales_report/Rakefile +22 -1
- data/examples/rope_examples/sales_report/config/environment.rb +4 -0
- data/examples/rope_examples/sales_report/lib/init.rb +32 -2
- data/examples/rope_examples/sales_report/lib/reports/sales.rb +10 -16
- data/examples/rope_examples/sales_report/util/build +50 -16
- data/examples/row_renderer.rb +39 -0
- data/examples/ruport_list/png_embed.rb +61 -0
- data/examples/ruport_list/roadmap.png +0 -0
- data/examples/sample.rb +16 -0
- data/examples/simple_pdf_lines.rb +24 -0
- data/lib/ruport.rb +143 -57
- data/lib/ruport/acts_as_reportable.rb +246 -0
- data/lib/ruport/data.rb +1 -2
- data/lib/ruport/data/grouping.rb +311 -0
- data/lib/ruport/data/record.rb +113 -84
- data/lib/ruport/data/table.rb +275 -174
- data/lib/ruport/formatter.rb +149 -0
- data/lib/ruport/formatter/csv.rb +87 -0
- data/lib/ruport/formatter/html.rb +89 -0
- data/lib/ruport/formatter/pdf.rb +357 -0
- data/lib/ruport/formatter/text.rb +151 -0
- data/lib/ruport/generator.rb +127 -30
- data/lib/ruport/query.rb +46 -99
- data/lib/ruport/renderer.rb +238 -194
- data/lib/ruport/renderer/grouping.rb +67 -0
- data/lib/ruport/renderer/table.rb +25 -98
- data/lib/ruport/report.rb +45 -96
- data/test/acts_as_reportable_test.rb +229 -0
- data/test/csv_formatter_test.rb +97 -0
- data/test/{_test_database.rb → database_test_.rb} +0 -0
- data/test/grouping_test.rb +305 -0
- data/test/html_formatter_test.rb +104 -0
- data/test/pdf_formatter_test.rb +25 -0
- data/test/{test_query.rb → query_test.rb} +32 -121
- data/test/{test_record.rb → record_test.rb} +40 -23
- data/test/renderer_test.rb +344 -0
- data/test/{test_report.rb → report_test.rb} +74 -44
- data/test/samples/ticket_count.csv +124 -0
- data/test/{test_sql_split.rb → sql_split_test.rb} +0 -0
- data/test/{test_table.rb → table_test.rb} +255 -44
- data/test/text_formatter_test.rb +144 -0
- data/util/bench/data/record/bench_as_vs_to.rb +17 -0
- data/util/bench/data/record/bench_constructor.rb +46 -0
- data/util/bench/data/record/bench_indexing.rb +65 -0
- data/util/bench/data/record/bench_reorder.rb +35 -0
- data/util/bench/data/record/bench_to_a.rb +19 -0
- data/util/bench/data/table/bench_column_manip.rb +103 -0
- data/util/bench/data/table/bench_dup.rb +24 -0
- data/util/bench/data/table/bench_init.rb +67 -0
- data/util/bench/data/table/bench_manip.rb +125 -0
- data/util/bench/formatter/bench_csv.rb +14 -0
- data/util/bench/formatter/bench_html.rb +14 -0
- data/util/bench/formatter/bench_pdf.rb +14 -0
- data/util/bench/formatter/bench_text.rb +14 -0
- data/util/bench/samples/tattle.csv +1237 -0
- metadata +121 -143
- data/TODO +0 -21
- data/examples/invoice.rb +0 -142
- data/examples/invoice_report.rb +0 -29
- data/examples/line_graph.rb +0 -38
- data/examples/rope_examples/itunes/config/ruport_config.rb +0 -8
- data/examples/rope_examples/sales_report/config/ruport_config.rb +0 -8
- data/lib/ruport/attempt.rb +0 -63
- data/lib/ruport/config.rb +0 -204
- data/lib/ruport/data/groupable.rb +0 -93
- data/lib/ruport/data/taggable.rb +0 -80
- data/lib/ruport/format.rb +0 -1
- data/lib/ruport/format/csv.rb +0 -29
- data/lib/ruport/format/html.rb +0 -42
- data/lib/ruport/format/latex.rb +0 -47
- data/lib/ruport/format/pdf.rb +0 -233
- data/lib/ruport/format/plugin.rb +0 -31
- data/lib/ruport/format/svg.rb +0 -60
- data/lib/ruport/format/text.rb +0 -103
- data/lib/ruport/format/xml.rb +0 -32
- data/lib/ruport/layout.rb +0 -1
- data/lib/ruport/layout/component.rb +0 -7
- data/lib/ruport/mailer.rb +0 -99
- data/lib/ruport/renderer/graph.rb +0 -46
- data/lib/ruport/report/graph.rb +0 -14
- data/lib/ruport/system_extensions.rb +0 -71
- data/test/test_config.rb +0 -88
- data/test/test_format_text.rb +0 -63
- data/test/test_graph_renderer.rb +0 -97
- data/test/test_groupable.rb +0 -56
- data/test/test_mailer.rb +0 -170
- data/test/test_renderer.rb +0 -151
- data/test/test_ruport.rb +0 -58
- data/test/test_table_renderer.rb +0 -141
- data/test/test_taggable.rb +0 -52
@@ -0,0 +1,25 @@
|
|
1
|
+
require "test/unit"
|
2
|
+
require "ruport"
|
3
|
+
|
4
|
+
begin
|
5
|
+
require "rubygems"
|
6
|
+
rescue LoadError
|
7
|
+
nil
|
8
|
+
end
|
9
|
+
|
10
|
+
class TestFormatPDF < Test::Unit::TestCase
|
11
|
+
|
12
|
+
def test_render_pdf_basic
|
13
|
+
begin
|
14
|
+
quiet { require "pdf/writer" }
|
15
|
+
rescue LoadError
|
16
|
+
warn "skipping pdf test"; return
|
17
|
+
end
|
18
|
+
data = [[1,2],[3,4]].to_table
|
19
|
+
assert_raise(RuntimeError) { data.to_pdf }
|
20
|
+
|
21
|
+
data.column_names = %w[a b]
|
22
|
+
assert_nothing_raised { data.to_pdf }
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -22,8 +22,8 @@
|
|
22
22
|
:alternative => {
|
23
23
|
:dsn => "ruport:test2", :user => "sandal", :password => "harmonix" },
|
24
24
|
}
|
25
|
-
Ruport::
|
26
|
-
Ruport::
|
25
|
+
Ruport::Query.add_source :default, @sources[:default]
|
26
|
+
Ruport::Query.add_source :alternative, @sources[:alternative]
|
27
27
|
|
28
28
|
@columns = %w(a b c)
|
29
29
|
@data = [ [[1,2,3],[4,5,6],[7,8,9]],
|
@@ -38,22 +38,17 @@
|
|
38
38
|
:plain => Ruport::Query.new(@sql[0]),
|
39
39
|
:sourced => Ruport::Query.new(@sql[0], :source => :alternative),
|
40
40
|
:paramed => Ruport::Query.new(@sql[0], :params => [ 42 ]),
|
41
|
-
:
|
42
|
-
:uncached => Ruport::Query.new(@sql[0], :cache_enabled => false),
|
43
|
-
:precached => Ruport::Query.new(@sql[0], :cache_enabled => true),
|
44
|
-
:raw => Ruport::Query.new(@sql[0], :raw_data => true),
|
45
|
-
:unraw => Ruport::Query.new(@sql[0], :raw_data => false),
|
41
|
+
:raw => Ruport::Query.new(@sql[0], :row_type => :raw),
|
46
42
|
:resultless => Ruport::Query.new(@sql[1]),
|
47
43
|
:multi => Ruport::Query.new(@sql[2]),
|
48
44
|
:mixed => Ruport::Query.new(@sql[3]),
|
49
45
|
}
|
50
|
-
@query[:precached].cached_data = @data[0]
|
51
46
|
end
|
52
47
|
|
53
48
|
if Object.const_defined? :Mocha and Object.const_defined? :DBI
|
54
49
|
|
55
50
|
def test_execute
|
56
|
-
query = @query[:
|
51
|
+
query = @query[:plain]
|
57
52
|
setup_mock_dbi(1)
|
58
53
|
|
59
54
|
assert_equal nil, query.execute
|
@@ -74,26 +69,6 @@
|
|
74
69
|
assert_equal nil, query.execute
|
75
70
|
end
|
76
71
|
|
77
|
-
def test_result_cache_disabled
|
78
|
-
query = @query[:uncached]
|
79
|
-
setup_mock_dbi(3)
|
80
|
-
|
81
|
-
assert_nothing_raised { query.result }
|
82
|
-
assert_equal @data[1], get_raw(query.result)
|
83
|
-
assert_equal @data[2], get_raw(query.result)
|
84
|
-
|
85
|
-
end
|
86
|
-
|
87
|
-
def test_result_cache_enabled
|
88
|
-
query = @query[:cached]
|
89
|
-
|
90
|
-
setup_mock_dbi(1)
|
91
|
-
|
92
|
-
assert_nothing_raised { query.result }
|
93
|
-
assert_equal @data[0], get_raw(query.result)
|
94
|
-
assert_equal @data[0], get_raw(query.result)
|
95
|
-
end
|
96
|
-
|
97
72
|
def test_result_resultless
|
98
73
|
query = @query[:resultless]
|
99
74
|
setup_mock_dbi(1, :resultless => true, :sql => @sql[1])
|
@@ -108,13 +83,6 @@
|
|
108
83
|
assert_equal @data[1], get_raw(query.result)
|
109
84
|
end
|
110
85
|
|
111
|
-
def test_result_raw_disabled
|
112
|
-
query = @query[:unraw]
|
113
|
-
setup_mock_dbi(1)
|
114
|
-
|
115
|
-
assert_equal @data[0].to_table(@columns), query.result
|
116
|
-
end
|
117
|
-
|
118
86
|
def test_result_raw_enabled
|
119
87
|
query = @query[:raw]
|
120
88
|
setup_mock_dbi(1)
|
@@ -122,49 +90,6 @@
|
|
122
90
|
assert_equal @data[0], query.result
|
123
91
|
end
|
124
92
|
|
125
|
-
def test_update_cache
|
126
|
-
query = @query[:cached]
|
127
|
-
setup_mock_dbi(2)
|
128
|
-
|
129
|
-
assert_equal @data[0], get_raw(query.result)
|
130
|
-
query.update_cache
|
131
|
-
assert_equal @data[1], get_raw(query.cached_data)
|
132
|
-
assert_equal @data[1], get_raw(query.result)
|
133
|
-
end
|
134
|
-
|
135
|
-
def test_clear_cache
|
136
|
-
query = @query[:cached]
|
137
|
-
setup_mock_dbi(2)
|
138
|
-
|
139
|
-
assert_equal @data[0], get_raw(query.result)
|
140
|
-
|
141
|
-
query.clear_cache
|
142
|
-
assert_equal nil, query.cached_data
|
143
|
-
assert_equal @data[1], get_raw(query.result)
|
144
|
-
end
|
145
|
-
|
146
|
-
def test_disable_caching
|
147
|
-
query = @query[:cached]
|
148
|
-
setup_mock_dbi(3)
|
149
|
-
|
150
|
-
assert_equal @data[0], get_raw(query.result)
|
151
|
-
assert_equal @data[0], get_raw(query.result)
|
152
|
-
query.disable_caching
|
153
|
-
assert_equal @data[1], get_raw(query.result)
|
154
|
-
assert_equal @data[2], get_raw(query.result)
|
155
|
-
end
|
156
|
-
|
157
|
-
def test_enable_caching
|
158
|
-
query = @query[:uncached]
|
159
|
-
setup_mock_dbi(3)
|
160
|
-
|
161
|
-
assert_equal @data[0], get_raw(query.result)
|
162
|
-
assert_equal @data[1], get_raw(query.result)
|
163
|
-
query.enable_caching
|
164
|
-
assert_equal @data[2], get_raw(query.result)
|
165
|
-
assert_equal @data[2], get_raw(query.result)
|
166
|
-
end
|
167
|
-
|
168
93
|
def test_load_file
|
169
94
|
File.expects(:read).
|
170
95
|
with("query_test.sql").
|
@@ -174,32 +99,18 @@
|
|
174
99
|
assert_equal "select * from foo", query.sql
|
175
100
|
end
|
176
101
|
|
177
|
-
def test_load_file_erb
|
178
|
-
@table = 'bar'
|
179
|
-
File.expects(:read).
|
180
|
-
with("query_test.sql").
|
181
|
-
returns("select * from <%= @table %>\n")
|
182
|
-
|
183
|
-
query = Ruport::Query.new "query_test.sql", :binding => binding
|
184
|
-
assert_equal "select * from bar", query.sql
|
185
|
-
end
|
186
|
-
|
187
102
|
def test_load_file_not_found
|
188
103
|
File.expects(:read).
|
189
104
|
with("query_test.sql").
|
190
105
|
raises(Errno::ENOENT)
|
191
|
-
Ruport.expects(:log).
|
192
|
-
with("Could not open query_test.sql",
|
193
|
-
:status => :fatal, :exception => LoadError).
|
194
|
-
raises(LoadError)
|
195
106
|
|
196
107
|
assert_raises LoadError do
|
197
108
|
query = Ruport::Query.new "query_test.sql"
|
198
109
|
end
|
199
110
|
end
|
200
111
|
|
201
|
-
def
|
202
|
-
query = @query[:
|
112
|
+
def test_each
|
113
|
+
query = @query[:plain]
|
203
114
|
setup_mock_dbi(2)
|
204
115
|
|
205
116
|
result = []; query.each { |r| result << r.to_a }
|
@@ -208,18 +119,7 @@
|
|
208
119
|
result = []; query.each { |r| result << r.to_a }
|
209
120
|
assert_equal @data[1], result
|
210
121
|
end
|
211
|
-
|
212
|
-
def test_each_cache_enabled
|
213
|
-
query = @query[:cached]
|
214
|
-
setup_mock_dbi(1)
|
215
|
-
|
216
|
-
result = []; query.each { |r| result << r.to_a }
|
217
|
-
assert_equal @data[0], result
|
218
|
-
|
219
|
-
result = []; query.each { |r| result << r.to_a }
|
220
|
-
assert_equal @data[0], result
|
221
|
-
end
|
222
|
-
|
122
|
+
|
223
123
|
def test_each_multi
|
224
124
|
query = @query[:multi]
|
225
125
|
setup_mock_dbi(2)
|
@@ -231,13 +131,11 @@
|
|
231
131
|
end
|
232
132
|
|
233
133
|
def test_each_without_block
|
234
|
-
assert_raise (LocalJumpError) { @query[:
|
134
|
+
assert_raise (LocalJumpError) { @query[:plain].each }
|
235
135
|
end
|
236
136
|
|
237
137
|
def test_select_source
|
238
|
-
query = @query[:
|
239
|
-
assert_equal @sources[:default], get_query_source(query)
|
240
|
-
|
138
|
+
query = @query[:plain]
|
241
139
|
query.select_source :alternative
|
242
140
|
assert_equal @sources[:alternative], get_query_source(query)
|
243
141
|
|
@@ -258,15 +156,6 @@
|
|
258
156
|
assert_equal @sources[:alternative], get_query_source(query2)
|
259
157
|
end
|
260
158
|
|
261
|
-
def test_generator
|
262
|
-
query = @query[:precached]
|
263
|
-
gen = query.generator
|
264
|
-
assert_equal @data[0][0], gen.next
|
265
|
-
assert_equal @data[0][1], gen.next
|
266
|
-
assert_equal @data[0][2], gen.next
|
267
|
-
assert_raise(EOFError) { gen.next }
|
268
|
-
end
|
269
|
-
|
270
159
|
if Object.const_defined? :Mocha and Object.const_defined? :DBI
|
271
160
|
|
272
161
|
def test_to_table
|
@@ -285,6 +174,29 @@
|
|
285
174
|
csv = @data[0].to_table(@columns).as(:csv)
|
286
175
|
assert_equal csv, query.to_csv
|
287
176
|
end
|
177
|
+
|
178
|
+
def test_missing_dsn
|
179
|
+
assert_raise(ArgumentError) {
|
180
|
+
Ruport::Query.add_source :foo, :user => "root", :password => "fff"
|
181
|
+
}
|
182
|
+
assert_nothing_raised { Ruport::Query.add_source :bar, :dsn => "..." }
|
183
|
+
end
|
184
|
+
|
185
|
+
def test_new_defaults
|
186
|
+
Ruport::Query.add_source :default, :dsn => "dbi:mysql:test",
|
187
|
+
:user => "root",
|
188
|
+
:password => ""
|
189
|
+
assert_equal("dbi:mysql:test", Ruport::Query.default_source.dsn)
|
190
|
+
assert_equal("root", Ruport::Query.default_source.user)
|
191
|
+
assert_equal("", Ruport::Query.default_source.password)
|
192
|
+
end
|
193
|
+
|
194
|
+
def test_multiple_sources
|
195
|
+
Ruport::Query.add_source :foo, :dsn => "dbi:mysql:test"
|
196
|
+
Ruport::Query.add_source :bar, :dsn => "dbi:mysql:test2"
|
197
|
+
assert_equal("dbi:mysql:test", Ruport::Query.sources[:foo].dsn)
|
198
|
+
assert_equal("dbi:mysql:test2", Ruport::Query.sources[:bar].dsn)
|
199
|
+
end
|
288
200
|
|
289
201
|
end
|
290
202
|
|
@@ -330,5 +242,4 @@
|
|
330
242
|
def get_raw(table)
|
331
243
|
table.map { |row| row.to_a }
|
332
244
|
end
|
333
|
-
|
334
245
|
end
|
@@ -94,9 +94,9 @@ class TestRecord < Test::Unit::TestCase
|
|
94
94
|
assert_equal [1,2,3,4], @record.to_a
|
95
95
|
end
|
96
96
|
|
97
|
-
def
|
98
|
-
assert_nothing_raised { @record.
|
99
|
-
assert_equal({ "a" => 1, "b" => 2, "c" => 3, "d" => 4 }, @record.
|
97
|
+
def test_to_hash
|
98
|
+
assert_nothing_raised { @record.to_hash }
|
99
|
+
assert_equal({ "a" => 1, "b" => 2, "c" => 3, "d" => 4 }, @record.to_hash)
|
100
100
|
end
|
101
101
|
|
102
102
|
def test_rename_attribute
|
@@ -172,13 +172,9 @@ class TestRecord < Test::Unit::TestCase
|
|
172
172
|
rec2["b"] = 7
|
173
173
|
rec2[2] = 9
|
174
174
|
|
175
|
-
rec2.tag(:apple)
|
176
175
|
|
177
176
|
assert_equal [1,2,3,4], rec1.to_a
|
178
177
|
assert_equal [5,7,9,4], rec2.to_a
|
179
|
-
|
180
|
-
assert_equal Set.new([]), rec1.tags
|
181
|
-
assert_equal Set.new([:apple]), rec2.tags
|
182
178
|
end
|
183
179
|
|
184
180
|
def test_records_with_same_attrs_and_data_hash_the_same
|
@@ -201,7 +197,7 @@ class TestRecord < Test::Unit::TestCase
|
|
201
197
|
assert_equal 3,r.length
|
202
198
|
assert_equal 3,r.size
|
203
199
|
end
|
204
|
-
|
200
|
+
|
205
201
|
def test_reindex
|
206
202
|
assert_equal %w[a b c d], @record.attributes
|
207
203
|
#old_object_id = @record.instance_variable_get(:@attributes).object_id
|
@@ -211,7 +207,28 @@ class TestRecord < Test::Unit::TestCase
|
|
211
207
|
|
212
208
|
new_object_id = @record.instance_variable_get(:@attributes).object_id
|
213
209
|
assert_equal a.object_id, new_object_id
|
214
|
-
end
|
210
|
+
end
|
211
|
+
|
212
|
+
def test_record_as
|
213
|
+
rendered_row = @record.as(:text)
|
214
|
+
assert_equal("| 1 | 2 | 3 | 4 |\n", rendered_row)
|
215
|
+
end
|
216
|
+
|
217
|
+
def test_to_hack
|
218
|
+
rendered_row = @record.to_text
|
219
|
+
assert_equal("| 1 | 2 | 3 | 4 |\n", rendered_row)
|
220
|
+
|
221
|
+
rendered_row = @record.to_csv(:format_options => { :col_sep => "\t"})
|
222
|
+
assert_equal("1\t2\t3\t4\n",rendered_row)
|
223
|
+
end
|
224
|
+
|
225
|
+
def test_as_throws_proper_errors
|
226
|
+
a = Record.new({ "a" => 1, "b" => 2 })
|
227
|
+
assert_nothing_raised { a.as(:csv) }
|
228
|
+
assert_nothing_raised { a.to_csv }
|
229
|
+
assert_raises(Ruport::Renderer::UnknownFormatError) { a.as(:nothing) }
|
230
|
+
assert_raises(Ruport::Renderer::UnknownFormatError) { a.to_nothing }
|
231
|
+
end
|
215
232
|
|
216
233
|
#----------------------------------------------------------------------
|
217
234
|
# BUG Traps
|
@@ -231,15 +248,6 @@ class TestRecord < Test::Unit::TestCase
|
|
231
248
|
assert_equal 1, a["a"]
|
232
249
|
end
|
233
250
|
|
234
|
-
def test_ensure_tags_get_duped
|
235
|
-
a = Record.new([1,2,3])
|
236
|
-
a.tag :foo
|
237
|
-
assert a.tags.include?(:foo)
|
238
|
-
b = a.dup
|
239
|
-
assert b.tags.include?(:foo)
|
240
|
-
assert_not_same a.tags, b.tags
|
241
|
-
end
|
242
|
-
|
243
251
|
# Ticket #172
|
244
252
|
def test_ensure_get_really_indifferent
|
245
253
|
a = Record.new({"a" => 1, "b" => 2})
|
@@ -250,12 +258,14 @@ class TestRecord < Test::Unit::TestCase
|
|
250
258
|
assert_equal(2,a.get(:b))
|
251
259
|
end
|
252
260
|
|
253
|
-
def
|
261
|
+
def test_ensure_attributes_not_broken_by_to_hack
|
262
|
+
record = Ruport::Data::Record.new [1,2], :attributes => %w[a to_something]
|
263
|
+
assert_equal 2, record.to_something
|
264
|
+
end
|
265
|
+
|
266
|
+
def test_ensure_get_throws_argument_error
|
254
267
|
a = Record.new({"a" => 1, "b" => 2})
|
255
|
-
|
256
|
-
b = Record.new({"a" => 1, "b" => 2},:attributes => %w[a b])
|
257
|
-
assert_equal 2, a.get(1)
|
258
|
-
assert_equal 1, a.get(0)
|
268
|
+
assert_raises(ArgumentError) { a.get([]) }
|
259
269
|
end
|
260
270
|
|
261
271
|
def test_ensure_delete_removes_attribute
|
@@ -282,4 +292,11 @@ class TestRecord < Test::Unit::TestCase
|
|
282
292
|
assert_equal(["a","b","c"], a.attributes)
|
283
293
|
end
|
284
294
|
|
295
|
+
class MyRecordSub < Ruport::Data::Record; end
|
296
|
+
|
297
|
+
def test_ensure_record_subclasses_render_properly
|
298
|
+
a = MyRecordSub.new [1,2,3]
|
299
|
+
assert_equal "1,2,3\n", a.to_csv
|
300
|
+
end
|
301
|
+
|
285
302
|
end
|
@@ -0,0 +1,344 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require 'ruport'
|
3
|
+
|
4
|
+
|
5
|
+
class TrivialRenderer < Ruport::Renderer
|
6
|
+
|
7
|
+
def run
|
8
|
+
formatter do
|
9
|
+
build_header
|
10
|
+
build_body
|
11
|
+
build_footer
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
class YetAnotherRenderer < Ruport::Renderer
|
18
|
+
stage :header,:body,:footer
|
19
|
+
end
|
20
|
+
|
21
|
+
class DummyText < Ruport::Formatter
|
22
|
+
|
23
|
+
renders :text, :for => TrivialRenderer
|
24
|
+
|
25
|
+
def prepare_document
|
26
|
+
output << "p"
|
27
|
+
end
|
28
|
+
|
29
|
+
def build_header
|
30
|
+
output << "header\n"
|
31
|
+
end
|
32
|
+
|
33
|
+
def build_body
|
34
|
+
output << "body\n"
|
35
|
+
end
|
36
|
+
|
37
|
+
def build_footer
|
38
|
+
output << "footer\n"
|
39
|
+
end
|
40
|
+
|
41
|
+
def finalize_document
|
42
|
+
output << "f"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class WithLayout < DummyText
|
47
|
+
renders :text_with_layout, :for => YetAnotherRenderer
|
48
|
+
|
49
|
+
def layout
|
50
|
+
output << "---\n"
|
51
|
+
yield
|
52
|
+
output << "---\n"
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
|
57
|
+
class TrivialRenderer2 < TrivialRenderer; end
|
58
|
+
|
59
|
+
class MultiPurposeFormatter < Ruport::Formatter
|
60
|
+
|
61
|
+
renders [:html,:text], :for => TrivialRenderer2
|
62
|
+
|
63
|
+
def build_header
|
64
|
+
a = 10
|
65
|
+
|
66
|
+
text { output << "Foo: #{a}\n" }
|
67
|
+
html { output << "<b>Foo: #{a}</b>\n" }
|
68
|
+
end
|
69
|
+
|
70
|
+
def build_body
|
71
|
+
html { output << "<pre>\n" }
|
72
|
+
output << options.body_text
|
73
|
+
html { output << "\n</pre>\n" }
|
74
|
+
end
|
75
|
+
|
76
|
+
def build_footer; end
|
77
|
+
end
|
78
|
+
|
79
|
+
|
80
|
+
# FIXME: come up with a better name
|
81
|
+
class RendererWithHelpers < Ruport::Renderer
|
82
|
+
|
83
|
+
add_format DummyText, :text
|
84
|
+
|
85
|
+
prepare :document
|
86
|
+
|
87
|
+
option :subtitle, :subsubtitle
|
88
|
+
|
89
|
+
stage :header
|
90
|
+
stage :body
|
91
|
+
stage :footer
|
92
|
+
|
93
|
+
finalize :document
|
94
|
+
|
95
|
+
def setup
|
96
|
+
options.apple = true
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
class RendererWithRunHook < Ruport::Renderer
|
102
|
+
|
103
|
+
include AutoRunner
|
104
|
+
|
105
|
+
add_format DummyText, :text
|
106
|
+
|
107
|
+
required_option :foo,:bar
|
108
|
+
stage :header
|
109
|
+
stage :body
|
110
|
+
stage :footer
|
111
|
+
|
112
|
+
def run
|
113
|
+
formatter.output << "|"
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
117
|
+
|
118
|
+
class RendererWithHelperModule < TrivialRenderer2
|
119
|
+
|
120
|
+
add_format DummyText, :stub
|
121
|
+
|
122
|
+
module Helpers
|
123
|
+
def say_hello
|
124
|
+
"Hello Dolly"
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
class TestRenderer < Test::Unit::TestCase
|
130
|
+
|
131
|
+
def test_multi_purpose
|
132
|
+
text = TrivialRenderer2.render_text(:body_text => "foo")
|
133
|
+
assert_equal "Foo: 10\nfoo", text
|
134
|
+
html = TrivialRenderer2.render_html(:body_text => "bar")
|
135
|
+
assert_equal "<b>Foo: 10</b>\n<pre>\nbar\n</pre>\n",html
|
136
|
+
end
|
137
|
+
|
138
|
+
|
139
|
+
def test_renderer_with_run_hooks
|
140
|
+
assert_equal "|header\nbody\nfooter\n",
|
141
|
+
RendererWithRunHook.render_text(:foo => "bar",:bar => "baz")
|
142
|
+
end
|
143
|
+
|
144
|
+
def test_method_missing_hack_formatter
|
145
|
+
assert_equal [:html,:text], MultiPurposeFormatter.formats
|
146
|
+
|
147
|
+
a = MultiPurposeFormatter.new
|
148
|
+
a.format = :html
|
149
|
+
|
150
|
+
visited = false
|
151
|
+
a.html { visited = true }
|
152
|
+
|
153
|
+
assert visited
|
154
|
+
|
155
|
+
visited = false
|
156
|
+
a.text { visited = true }
|
157
|
+
assert !visited
|
158
|
+
|
159
|
+
assert_raises(NoMethodError) do
|
160
|
+
a.pdf { 'do nothing' }
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
def test_hash_options_setters
|
165
|
+
a = RendererWithHelpers.render(:text, :subtitle => "foo",
|
166
|
+
:subsubtitle => "bar") { |r|
|
167
|
+
assert_equal "foo", r.options.subtitle
|
168
|
+
assert_equal "bar", r.options.subsubtitle
|
169
|
+
}
|
170
|
+
end
|
171
|
+
|
172
|
+
def test_data_accessors
|
173
|
+
a = RendererWithHelpers.render(:text, :data => [1,2,4]) { |r|
|
174
|
+
assert_equal [1,2,4], r.data
|
175
|
+
}
|
176
|
+
|
177
|
+
b = RendererWithHelpers.render_text(%w[a b c]) { |r|
|
178
|
+
assert_equal %w[a b c], r.data
|
179
|
+
}
|
180
|
+
|
181
|
+
c = RendererWithHelpers.render_text(%w[a b f],:snapper => :red) { |r|
|
182
|
+
assert_equal %w[a b f], r.data
|
183
|
+
assert_equal :red, r.options.snapper
|
184
|
+
}
|
185
|
+
end
|
186
|
+
|
187
|
+
def test_using_io
|
188
|
+
require "stringio"
|
189
|
+
out = StringIO.new
|
190
|
+
a = TrivialRenderer.render(:text) { |r| r.io = out }
|
191
|
+
out.rewind
|
192
|
+
assert_equal "header\nbody\nfooter\n", out.read
|
193
|
+
assert_equal "", out.read
|
194
|
+
end
|
195
|
+
|
196
|
+
def test_trivial
|
197
|
+
actual = TrivialRenderer.render(:text)
|
198
|
+
assert_equal "header\nbody\nfooter\n", actual
|
199
|
+
end
|
200
|
+
|
201
|
+
def test_formats
|
202
|
+
assert_equal( {}, Ruport::Renderer.formats )
|
203
|
+
assert_equal( { :text => DummyText },TrivialRenderer.formats )
|
204
|
+
end
|
205
|
+
|
206
|
+
def test_stage_helper
|
207
|
+
assert RendererWithHelpers.stages.include?('body')
|
208
|
+
end
|
209
|
+
|
210
|
+
def test_finalize_helper
|
211
|
+
assert_equal :document, RendererWithHelpers.final_stage
|
212
|
+
end
|
213
|
+
|
214
|
+
def test_prepare_helper
|
215
|
+
assert_equal :document, RendererWithHelpers.first_stage
|
216
|
+
end
|
217
|
+
|
218
|
+
def test_finalize_again
|
219
|
+
assert_raise(Ruport::Renderer::StageAlreadyDefinedError) {
|
220
|
+
RendererWithHelpers.finalize :report
|
221
|
+
}
|
222
|
+
end
|
223
|
+
|
224
|
+
def test_prepare_again
|
225
|
+
assert_raise(Ruport::Renderer::StageAlreadyDefinedError) {
|
226
|
+
RendererWithHelpers.prepare :foo
|
227
|
+
}
|
228
|
+
end
|
229
|
+
|
230
|
+
def test_renderer_using_helpers
|
231
|
+
actual = RendererWithHelpers.render(:text)
|
232
|
+
assert_equal "pheader\nbody\nfooter\nf", actual
|
233
|
+
|
234
|
+
actual = RendererWithHelpers.render_text
|
235
|
+
assert_equal "pheader\nbody\nfooter\nf", actual
|
236
|
+
end
|
237
|
+
|
238
|
+
def test_setup
|
239
|
+
actual = false
|
240
|
+
RendererWithHelpers.render_text { |r|
|
241
|
+
actual = r.options.apple
|
242
|
+
}
|
243
|
+
assert actual
|
244
|
+
end
|
245
|
+
|
246
|
+
def test_option_helper
|
247
|
+
RendererWithHelpers.render_text do |r|
|
248
|
+
r.subtitle = "Test Report"
|
249
|
+
assert_equal "Test Report", r.options.subtitle
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
def test_required_option_helper
|
254
|
+
a = RendererWithHelpers.dup
|
255
|
+
a.required_option :title
|
256
|
+
|
257
|
+
a.render_text do |r|
|
258
|
+
r.title = "Test Report"
|
259
|
+
assert_equal "Test Report", r.options.title
|
260
|
+
end
|
261
|
+
|
262
|
+
end
|
263
|
+
|
264
|
+
def test_without_required_option
|
265
|
+
|
266
|
+
a = RendererWithHelpers.dup
|
267
|
+
a.required_option :title
|
268
|
+
|
269
|
+
assert_raise(Ruport::Renderer::RequiredOptionNotSet) { a.render(:text) }
|
270
|
+
end
|
271
|
+
|
272
|
+
def test_method_missing
|
273
|
+
actual = TrivialRenderer.render_text
|
274
|
+
assert_equal "header\nbody\nfooter\n", actual
|
275
|
+
end
|
276
|
+
|
277
|
+
def test_formatter
|
278
|
+
#RendererWithHelpers.required_option :title
|
279
|
+
|
280
|
+
assert_raise(RuntimeError) { RendererWithHelpers.render(:text) }
|
281
|
+
end
|
282
|
+
|
283
|
+
|
284
|
+
def test_method_missing
|
285
|
+
actual = TrivialRenderer.render_text
|
286
|
+
assert_equal "header\nbody\nfooter\n", actual
|
287
|
+
end
|
288
|
+
|
289
|
+
def test_formatter
|
290
|
+
# normal instance mode
|
291
|
+
|
292
|
+
rend = TrivialRenderer.new
|
293
|
+
rend.send(:use_formatter,:text)
|
294
|
+
|
295
|
+
assert_kind_of Ruport::Formatter, rend.formatter
|
296
|
+
assert_kind_of DummyText, rend.formatter
|
297
|
+
|
298
|
+
# render mode
|
299
|
+
TrivialRenderer.render_text do |r|
|
300
|
+
assert_kind_of Ruport::Formatter, r.formatter
|
301
|
+
assert_kind_of DummyText, r.formatter
|
302
|
+
end
|
303
|
+
|
304
|
+
assert_equal "body\n", rend.formatter { build_body }.output
|
305
|
+
|
306
|
+
rend.formatter.clear_output
|
307
|
+
assert_equal "", rend.formatter.output
|
308
|
+
end
|
309
|
+
|
310
|
+
def test_options_act_like_indifferent_hash
|
311
|
+
opts = Ruport::Renderer::Options.new
|
312
|
+
opts.foo = "bar"
|
313
|
+
assert_equal "bar", opts[:foo]
|
314
|
+
assert_equal "bar", opts["foo"]
|
315
|
+
|
316
|
+
opts["f"] = "bar"
|
317
|
+
assert_equal "bar", opts[:f]
|
318
|
+
assert_equal "bar", opts.f
|
319
|
+
assert_equal "bar", opts["f"]
|
320
|
+
|
321
|
+
opts[:apple] = "banana"
|
322
|
+
assert_equal "banana", opts.apple
|
323
|
+
assert_equal "banana", opts["apple"]
|
324
|
+
assert_equal "banana", opts[:apple]
|
325
|
+
end
|
326
|
+
|
327
|
+
def test_add_format_private
|
328
|
+
assert_raise(NoMethodError) { Ruport::Renderer.add_format }
|
329
|
+
end
|
330
|
+
|
331
|
+
def test_layout
|
332
|
+
assert_equal "---\nheader\nbody\nfooter\n---\n",
|
333
|
+
YetAnotherRenderer.render_text_with_layout
|
334
|
+
end
|
335
|
+
|
336
|
+
def test_renderer_helper_module
|
337
|
+
RendererWithHelperModule.render_stub do |r|
|
338
|
+
assert_equal "Hello Dolly", r.formatter.say_hello
|
339
|
+
end
|
340
|
+
end
|
341
|
+
|
342
|
+
|
343
|
+
|
344
|
+
end
|