ruport 1.4.0 → 1.6.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.
@@ -12,7 +12,7 @@
12
12
  #
13
13
  module Ruport
14
14
  # This class produces HTML output for Ruport's Row, Table, Group, and
15
- # Grouping renderers. It can be subclassed, as it has some helper methods
15
+ # Grouping controllers. It can be subclassed, as it has some helper methods
16
16
  # that might be useful for custom output.
17
17
  #
18
18
  # === Rendering Options
@@ -25,8 +25,8 @@ module Ruport
25
25
  #
26
26
  class Formatter::HTML < Formatter
27
27
 
28
- renders :html, :for => [ Renderer::Row, Renderer::Table,
29
- Renderer::Group, Renderer::Grouping ]
28
+ renders :html, :for => [ Controller::Row, Controller::Table,
29
+ Controller::Group, Controller::Grouping ]
30
30
 
31
31
  # Hook for setting available options using a template. See the template
32
32
  # documentation for the available options and their format.
@@ -48,22 +48,21 @@ module Ruport
48
48
  end
49
49
  end
50
50
 
51
- # Uses the Row renderer to build up the table body.
51
+ # Uses the Row controller to build up the table body.
52
52
  # Replaces nil and empty strings with "&nbsp;"
53
53
  def build_table_body
54
- render_data_by_row do |rend|
55
- r = rend.data
56
- rend.data = r.map { |e| e.to_s.empty? ? "&nbsp;" : e }
54
+ data.each do |row|
55
+ build_row(row.map { |e| e.to_s.empty? ? "&nbsp;" : e })
57
56
  end
58
57
  end
59
58
 
60
59
  # Simply closes the table tag.
61
60
  def build_table_footer
62
- output << "\t</table>"
61
+ output << "\t</table>\n"
63
62
  end
64
63
 
65
64
  # Renders individual rows for the table.
66
- def build_row
65
+ def build_row(data = self.data)
67
66
  output <<
68
67
  "\t\t<tr>\n\t\t\t<td>" +
69
68
  data.to_a.join("</td>\n\t\t\t<td>") +
@@ -77,14 +76,14 @@ module Ruport
77
76
  end
78
77
 
79
78
  # Creates the group body. Since group data is a table, just uses the
80
- # Table renderer.
79
+ # Table controller.
81
80
  #
82
81
  def build_group_body
83
82
  render_table data, options.to_hash
84
83
  end
85
84
 
86
85
  # Generates the body for a grouping. Iterates through the groups and
87
- # renders them using the group renderer.
86
+ # renders them using the group controller.
88
87
  #
89
88
  def build_grouping_body
90
89
  case options.style
@@ -138,7 +137,7 @@ module Ruport
138
137
  "</td>\n\t\t</tr>\n"
139
138
  end
140
139
  end
141
- output << "\t</table>"
140
+ output << "\t</table>\n"
142
141
  end
143
142
 
144
143
  def grouping_columns
@@ -15,7 +15,7 @@
15
15
  module Ruport
16
16
 
17
17
  # This class provides PDF output for Ruport's Table, Group, and Grouping
18
- # renderers. It wraps Austin Ziegler's PDF::Writer to provide a higher
18
+ # controllers. It wraps Austin Ziegler's PDF::Writer to provide a higher
19
19
  # level interface and provides a number of helpers designed to make
20
20
  # generating PDF reports much easier. You will typically want to build
21
21
  # subclasses of this formatter to customize it as needed.
@@ -49,8 +49,8 @@ module Ruport
49
49
  end
50
50
  end
51
51
 
52
- renders :pdf, :for => [ Renderer::Row, Renderer::Table,
53
- Renderer::Group, Renderer::Grouping ]
52
+ renders :pdf, :for => [ Controller::Row, Controller::Table,
53
+ Controller::Group, Controller::Grouping ]
54
54
 
55
55
  attr_writer :pdf_writer
56
56
 
@@ -104,18 +104,18 @@ module Ruport
104
104
  render_pdf unless options.skip_finalize_table
105
105
  end
106
106
 
107
- # Generates a header with the group name for Renderer::Group.
107
+ # Generates a header with the group name for Controller::Group.
108
108
  def build_group_header
109
109
  pad(10) { add_text data.name.to_s, :justification => :center }
110
110
  end
111
111
 
112
- # Renders the group as a table for Renderer::Group.
112
+ # Renders the group as a table for Controller::Group.
113
113
  def build_group_body
114
114
  render_table data, options.to_hash.merge(:formatter => pdf_writer)
115
115
  end
116
116
 
117
117
  # Determines which style to use and renders the main body for
118
- # Renderer::Grouping.
118
+ # Controller::Grouping.
119
119
  def build_grouping_body
120
120
  case options.style
121
121
  when :inline
@@ -382,6 +382,10 @@ module Ruport
382
382
  text_opts[:font_size],
383
383
  text_opts[:angle] || 0)
384
384
  move_cursor_to(ypos)
385
+ end
386
+
387
+ def finalize
388
+ render_pdf
385
389
  end
386
390
  end
387
391
 
@@ -142,7 +142,7 @@ class Ruport::Formatter::TemplateNotDefined < StandardError; end
142
142
  # available to
143
143
  # FasterCSV.new
144
144
  #
145
- class Ruport::Formatter::Template < Ruport::Renderer::Options
145
+ class Ruport::Formatter::Template < Ruport::Controller::Options
146
146
 
147
147
  # Returns all existing templates in a hash keyed by the template names.
148
148
  def self.templates
@@ -13,7 +13,7 @@
13
13
  module Ruport
14
14
 
15
15
  # This class provides text output for Ruport's Row, Table, Group, and
16
- # Grouping renderers
16
+ # Grouping controllers
17
17
  #
18
18
  # It handles things like automatically truncating tables that go off the
19
19
  # edge of the screen in the console, proper column alignment, and pretty
@@ -45,8 +45,8 @@ module Ruport
45
45
  # truncating it. Useful for file output.
46
46
  class Formatter::Text < Formatter
47
47
 
48
- renders [:txt, :text], :for => [ Renderer::Row, Renderer::Table,
49
- Renderer::Group, Renderer::Grouping ]
48
+ renders [:txt, :text], :for => [ Controller::Row, Controller::Table,
49
+ Controller::Group, Controller::Grouping ]
50
50
 
51
51
  # Hook for setting available options using a template. See the template
52
52
  # documentation for the available options and their format.
@@ -94,14 +94,7 @@ module Ruport
94
94
 
95
95
  calculate_max_col_widths unless options.max_col_width
96
96
 
97
- render_data_by_row do |rend|
98
- rend.options do |o|
99
- o.max_col_width = options.max_col_width
100
- o.alignment = options.alignment
101
- o.table_width = options.table_width
102
- o.ignore_table_width = options.ignore_table_width
103
- end
104
- end
97
+ data.each { |row| build_row(row) }
105
98
 
106
99
  output << fit_to_width(hr)
107
100
  end
@@ -114,7 +107,7 @@ module Ruport
114
107
  #
115
108
  # Uses fit_to_width to truncate the row if necessary.
116
109
  #
117
- def build_row
110
+ def build_row(data = self.data)
118
111
  max_col_widths_for_row(data) unless options.max_col_width
119
112
 
120
113
  data.enum_for(:each_with_index).inject(line=[]) { |s,e|
@@ -136,14 +129,14 @@ module Ruport
136
129
  end
137
130
 
138
131
  # Creates the group body. Since group data is a table, just uses the
139
- # Table renderer.
132
+ # Table controller.
140
133
  #
141
134
  def build_group_body
142
135
  render_table data, options
143
136
  end
144
137
 
145
138
  # Generates the body for a grouping. Iterates through the groups and
146
- # renders them using the group renderer.
139
+ # renders them using the group controller.
147
140
  #
148
141
  def build_grouping_body
149
142
  render_inline_grouping(options)
@@ -170,7 +163,7 @@ module Ruport
170
163
  #
171
164
  # Otherwise, uses SystemExtensions to determine terminal width.
172
165
  def width
173
- options.table_width || SystemExtensions.terminal_width
166
+ options.table_width ||= SystemExtensions.terminal_width
174
167
  end
175
168
 
176
169
  # Truncates a string so that it does not exceed Text#width
@@ -14,11 +14,11 @@ require File.join(File.expand_path(File.dirname(__FILE__)), "helpers")
14
14
 
15
15
  #============================================================================
16
16
  # These two renderers represent the two styles that can be used when defining
17
- # renderers in Ruport. The OldSchoolRenderer approach has largely been
17
+ # renderers in Ruport. The OldSchoolController approach has largely been
18
18
  # deprecated, but still has uses in edge cases that we need to support.
19
19
  #============================================================================
20
20
 
21
- class OldSchoolRenderer < Ruport::Renderer
21
+ class OldSchoolController < Ruport::Controller
22
22
 
23
23
  def run
24
24
  formatter do
@@ -30,7 +30,7 @@ class OldSchoolRenderer < Ruport::Renderer
30
30
 
31
31
  end
32
32
 
33
- class VanillaRenderer < Ruport::Renderer
33
+ class VanillaController < Ruport::Controller
34
34
  stage :header,:body,:footer
35
35
  end
36
36
 
@@ -40,7 +40,7 @@ end
40
40
  # be replaced by mock objects in the future.
41
41
  class DummyText < Ruport::Formatter
42
42
 
43
- renders :text, :for => OldSchoolRenderer
43
+ renders :text, :for => OldSchoolController
44
44
 
45
45
  def prepare_document
46
46
  output << "p"
@@ -63,22 +63,54 @@ class DummyText < Ruport::Formatter
63
63
  end
64
64
  end
65
65
 
66
+ # This formatter modifies the (String) data object passed to it
67
+ class Destructive < Ruport::Formatter
68
+
69
+ def prepare_document; end
70
+
71
+ def build_header; end
72
+
73
+ def build_body
74
+ output << "You sent #{data}"
75
+ data.replace("RUBBISH")
76
+ end
77
+
78
+ def build_footer; end
79
+
80
+ def finalize_document; end
81
+ end
82
+
83
+
66
84
  class VanillaBinary < Ruport::Formatter
67
- renders :bin, :for => VanillaRenderer
85
+ renders :bin, :for => VanillaController
68
86
  save_as_binary_file
69
- end
87
+ end
70
88
 
89
+ class SpecialFinalize < Ruport::Formatter
90
+ renders :with_finalize, :for => VanillaController
91
+
92
+ def finalize
93
+ output << "I has been finalized"
94
+ end
95
+ end
71
96
 
72
- class TestRenderer < Test::Unit::TestCase
97
+ class TestController < Test::Unit::TestCase
73
98
 
74
99
  def teardown
75
100
  Ruport::Formatter::Template.instance_variable_set(:@templates, nil)
76
101
  end
77
102
 
78
103
  def test_trivial
79
- actual = OldSchoolRenderer.render(:text)
104
+ actual = OldSchoolController.render(:text)
80
105
  assert_equal "header\nbody\nfooter\n", actual
81
- end
106
+ end
107
+
108
+ context "when running a formatter with custom a finalize method" do
109
+ def specify_finalize_method_should_be_called
110
+ assert_equal "I has been finalized",
111
+ VanillaController.render_with_finalize
112
+ end
113
+ end
82
114
 
83
115
  context "when using templates" do
84
116
  def specify_apply_template_should_be_called
@@ -124,7 +156,7 @@ class TestRenderer < Test::Unit::TestCase
124
156
  def test_using_io
125
157
  require "stringio"
126
158
  out = StringIO.new
127
- a = OldSchoolRenderer.render(:text) { |r| r.io = out }
159
+ a = OldSchoolController.render(:text) { |r| r.io = out }
128
160
  out.rewind
129
161
  assert_equal "header\nbody\nfooter\n", out.read
130
162
  assert_equal "", out.read
@@ -133,12 +165,12 @@ class TestRenderer < Test::Unit::TestCase
133
165
  def test_using_file
134
166
  f = []
135
167
  File.expects(:open).yields(f)
136
- a = OldSchoolRenderer.render(:text, :file => "foo.text")
168
+ a = OldSchoolController.render(:text, :file => "foo.text")
137
169
  assert_equal "header\nbody\nfooter\n", f[0]
138
170
 
139
171
  f = []
140
172
  File.expects(:open).with("blah","wb").yields(f)
141
- VanillaRenderer.render(:bin, :file => "blah")
173
+ VanillaController.render(:bin, :file => "blah")
142
174
  end
143
175
 
144
176
  def test_using_file_via_rendering_tools
@@ -150,25 +182,25 @@ class TestRenderer < Test::Unit::TestCase
150
182
 
151
183
 
152
184
  def test_formats
153
- assert_equal( {}, Ruport::Renderer.formats )
154
- assert_equal( { :text => DummyText },OldSchoolRenderer.formats )
185
+ assert_equal( {}, Ruport::Controller.formats )
186
+ assert_equal( { :text => DummyText },OldSchoolController.formats )
155
187
  end
156
188
 
157
189
  def test_method_missing
158
- actual = OldSchoolRenderer.render_text
190
+ actual = OldSchoolController.render_text
159
191
  assert_equal "header\nbody\nfooter\n", actual
160
192
  end
161
193
 
162
194
  def test_formatter
163
195
  # normal instance mode
164
- rend = OldSchoolRenderer.new
196
+ rend = OldSchoolController.new
165
197
  rend.send(:use_formatter,:text)
166
198
 
167
199
  assert_kind_of Ruport::Formatter, rend.formatter
168
200
  assert_kind_of DummyText, rend.formatter
169
201
 
170
202
  # render mode
171
- OldSchoolRenderer.render_text do |r|
203
+ OldSchoolController.render_text do |r|
172
204
  assert_kind_of Ruport::Formatter, r.formatter
173
205
  assert_kind_of DummyText, r.formatter
174
206
  end
@@ -180,7 +212,7 @@ class TestRenderer < Test::Unit::TestCase
180
212
  end
181
213
 
182
214
  def test_options_act_like_indifferent_hash
183
- opts = Ruport::Renderer::Options.new
215
+ opts = Ruport::Controller::Options.new
184
216
  opts.foo = "bar"
185
217
  assert_equal "bar", opts[:foo]
186
218
  assert_equal "bar", opts["foo"]
@@ -202,7 +234,7 @@ end
202
234
  class TestFormatterUsingBuild < Test::Unit::TestCase
203
235
  # This formatter uses the build syntax
204
236
  class UsesBuild < Ruport::Formatter
205
- renders :text_using_build, :for => VanillaRenderer
237
+ renders :text_using_build, :for => VanillaController
206
238
 
207
239
  build :header do
208
240
  output << "header\n"
@@ -219,8 +251,8 @@ class TestFormatterUsingBuild < Test::Unit::TestCase
219
251
 
220
252
  def test_should_render_using_build_syntax
221
253
  assert_equal "header\nbody\nfooter\n",
222
- VanillaRenderer.render_text_using_build
223
- VanillaRenderer.render_text_using_build do |rend|
254
+ VanillaController.render_text_using_build
255
+ VanillaController.render_text_using_build do |rend|
224
256
  assert rend.formatter.respond_to?(:build_header)
225
257
  assert rend.formatter.respond_to?(:build_body)
226
258
  assert rend.formatter.respond_to?(:build_footer)
@@ -233,7 +265,7 @@ class TestFormatterWithLayout < Test::Unit::TestCase
233
265
  # This formatter is meant to check out a special case in Ruport's renderer,
234
266
  # in which a layout method is called and yielded to when defined
235
267
  class WithLayout < DummyText
236
- renders :text_with_layout, :for => VanillaRenderer
268
+ renders :text_with_layout, :for => VanillaController
237
269
 
238
270
  def layout
239
271
  output << "---\n"
@@ -245,21 +277,22 @@ class TestFormatterWithLayout < Test::Unit::TestCase
245
277
 
246
278
  def test_layout
247
279
  assert_equal "---\nheader\nbody\nfooter\n---\n",
248
- VanillaRenderer.render_text_with_layout
280
+ VanillaController.render_text_with_layout
249
281
  end
250
282
 
251
283
  def test_layout_disabled
252
284
  assert_equal "header\nbody\nfooter\n",
253
- VanillaRenderer.render_text_with_layout(:layout => false)
285
+ VanillaController.render_text_with_layout(:layout => false)
254
286
  end
255
287
 
256
288
  end
257
289
 
258
290
 
259
- class TestRendererWithManyHooks < Test::Unit::TestCase
260
- # This provides a way to check several hooks that Renderer supports
261
- class RendererWithManyHooks < Ruport::Renderer
291
+ class TestControllerWithManyHooks < Test::Unit::TestCase
292
+ # This provides a way to check several hooks that controllers supports
293
+ class ControllerWithManyHooks < Ruport::Controller
262
294
  add_format DummyText, :text
295
+ add_format Destructive, :destructive
263
296
 
264
297
  prepare :document
265
298
 
@@ -276,7 +309,7 @@ class TestRendererWithManyHooks < Test::Unit::TestCase
276
309
  end
277
310
 
278
311
  def test_hash_options_setters
279
- a = RendererWithManyHooks.render(:text, :subtitle => "foo",
312
+ a = ControllerWithManyHooks.render(:text, :subtitle => "foo",
280
313
  :subsubtitle => "bar") { |r|
281
314
  assert_equal "foo", r.options.subtitle
282
315
  assert_equal "bar", r.options.subsubtitle
@@ -284,54 +317,61 @@ class TestRendererWithManyHooks < Test::Unit::TestCase
284
317
  end
285
318
 
286
319
  def test_data_accessors
287
- a = RendererWithManyHooks.render(:text, :data => [1,2,4]) { |r|
320
+ a = ControllerWithManyHooks.render(:text, :data => [1,2,4]) { |r|
288
321
  assert_equal [1,2,4], r.data
289
322
  }
290
323
 
291
- b = RendererWithManyHooks.render_text(%w[a b c]) { |r|
324
+ b = ControllerWithManyHooks.render_text(%w[a b c]) { |r|
292
325
  assert_equal %w[a b c], r.data
293
326
  }
294
327
 
295
- c = RendererWithManyHooks.render_text(%w[a b f],:snapper => :red) { |r|
328
+ c = ControllerWithManyHooks.render_text(%w[a b f],:snapper => :red) { |r|
296
329
  assert_equal %w[a b f], r.data
297
330
  assert_equal :red, r.options.snapper
298
331
  }
299
332
  end
300
333
 
334
+ def test_formatter_data_dup
335
+ source = "some text"
336
+ result = ControllerWithManyHooks.render(:destructive, :data => source)
337
+ assert_equal("You sent some text", result)
338
+ assert_equal("some text", source)
339
+ end
340
+
301
341
  def test_stage_helper
302
- assert RendererWithManyHooks.stages.include?('body')
342
+ assert ControllerWithManyHooks.stages.include?('body')
303
343
  end
304
344
 
305
345
  def test_finalize_helper
306
- assert_equal :document, RendererWithManyHooks.final_stage
346
+ assert_equal :document, ControllerWithManyHooks.final_stage
307
347
  end
308
348
 
309
349
  def test_prepare_helper
310
- assert_equal :document, RendererWithManyHooks.first_stage
350
+ assert_equal :document, ControllerWithManyHooks.first_stage
311
351
  end
312
352
 
313
353
  def test_finalize_again
314
- assert_raise(Ruport::Renderer::StageAlreadyDefinedError) {
315
- RendererWithManyHooks.finalize :report
354
+ assert_raise(Ruport::Controller::StageAlreadyDefinedError) {
355
+ ControllerWithManyHooks.finalize :report
316
356
  }
317
357
  end
318
358
 
319
359
  def test_prepare_again
320
- assert_raise(Ruport::Renderer::StageAlreadyDefinedError) {
321
- RendererWithManyHooks.prepare :foo
360
+ assert_raise(Ruport::Controller::StageAlreadyDefinedError) {
361
+ ControllerWithManyHooks.prepare :foo
322
362
  }
323
363
  end
324
364
 
325
365
  def test_renderer_using_helpers
326
- actual = RendererWithManyHooks.render(:text)
366
+ actual = ControllerWithManyHooks.render(:text)
327
367
  assert_equal "pheader\nbody\nfooter\nf", actual
328
368
 
329
- actual = RendererWithManyHooks.render_text
369
+ actual = ControllerWithManyHooks.render_text
330
370
  assert_equal "pheader\nbody\nfooter\nf", actual
331
371
  end
332
372
 
333
373
  def test_required_option_helper
334
- a = RendererWithManyHooks.dup
374
+ a = ControllerWithManyHooks.dup
335
375
  a.required_option :title
336
376
 
337
377
  a.render_text do |r|
@@ -342,18 +382,18 @@ class TestRendererWithManyHooks < Test::Unit::TestCase
342
382
  end
343
383
 
344
384
  def test_without_required_option
345
- a = RendererWithManyHooks.dup
385
+ a = ControllerWithManyHooks.dup
346
386
  a.required_option :title
347
387
 
348
- assert_raise(Ruport::Renderer::RequiredOptionNotSet) { a.render(:text) }
388
+ assert_raise(Ruport::Controller::RequiredOptionNotSet) { a.render(:text) }
349
389
  end
350
390
 
351
391
  end
352
392
 
353
393
 
354
- class TestRendererWithRunHook < Test::Unit::TestCase
394
+ class TestControllerWithRunHook < Test::Unit::TestCase
355
395
 
356
- class RendererWithRunHook < Ruport::Renderer
396
+ class ControllerWithRunHook < Ruport::Controller
357
397
  add_format DummyText, :text
358
398
 
359
399
  required_option :foo,:bar
@@ -370,15 +410,15 @@ class TestRendererWithRunHook < Test::Unit::TestCase
370
410
 
371
411
  def test_renderer_with_run_hooks
372
412
  assert_equal "|header\nbody\nfooter\n",
373
- RendererWithRunHook.render_text(:foo => "bar",:bar => "baz")
413
+ ControllerWithRunHook.render_text(:foo => "bar",:bar => "baz")
374
414
  end
375
415
 
376
416
  end
377
417
 
378
418
 
379
- class TestRendererWithHelperModule < Test::Unit::TestCase
419
+ class TestControllerWithHelperModule < Test::Unit::TestCase
380
420
 
381
- class RendererWithHelperModule < VanillaRenderer
421
+ class ControllerWithHelperModule < VanillaController
382
422
 
383
423
  add_format DummyText, :stub
384
424
 
@@ -390,7 +430,7 @@ class TestRendererWithHelperModule < Test::Unit::TestCase
390
430
  end
391
431
 
392
432
  def test_renderer_helper_module
393
- RendererWithHelperModule.render_stub do |r|
433
+ ControllerWithHelperModule.render_stub do |r|
394
434
  assert_equal "Hello Dolly", r.formatter.say_hello
395
435
  end
396
436
  end
@@ -398,10 +438,10 @@ end
398
438
 
399
439
 
400
440
  class TestMultiPurposeFormatter < Test::Unit::TestCase
401
- # This provides a way to check the multi-format hooks for the Renderer
441
+ # This provides a way to check the multi-format hooks for the Controller
402
442
  class MultiPurposeFormatter < Ruport::Formatter
403
443
 
404
- renders [:html,:text], :for => VanillaRenderer
444
+ renders [:html,:text], :for => VanillaController
405
445
 
406
446
  def build_header
407
447
  a = 10
@@ -419,9 +459,9 @@ class TestMultiPurposeFormatter < Test::Unit::TestCase
419
459
  end
420
460
 
421
461
  def test_multi_purpose
422
- text = VanillaRenderer.render_text(:body_text => "foo")
462
+ text = VanillaController.render_text(:body_text => "foo")
423
463
  assert_equal "Foo: 10\nfoo", text
424
- html = VanillaRenderer.render_html(:body_text => "bar")
464
+ html = VanillaController.render_html(:body_text => "bar")
425
465
  assert_equal "<b>Foo: 10</b>\n<pre>\nbar\n</pre>\n",html
426
466
  end
427
467
 
@@ -452,7 +492,7 @@ end
452
492
  class TestFormatterErbHelper < Test::Unit::TestCase
453
493
  class ErbFormatter < Ruport::Formatter
454
494
 
455
- renders :terb, :for => VanillaRenderer
495
+ renders :terb, :for => VanillaController
456
496
 
457
497
  def build_body
458
498
  # demonstrate local binding
@@ -470,25 +510,25 @@ class TestFormatterErbHelper < Test::Unit::TestCase
470
510
  #FIXME: need to test file
471
511
 
472
512
  def test_self_bound
473
- assert_equal "Default Binding: bar", VanillaRenderer.render_terb
513
+ assert_equal "Default Binding: bar", VanillaController.render_terb
474
514
  end
475
515
 
476
516
  def test_custom_bound
477
517
  a = [1,2,3]
478
518
  arr_binding = a.instance_eval { binding }
479
519
  assert_equal "Binding Override: 321",
480
- VanillaRenderer.render_terb(:binding => arr_binding)
520
+ VanillaController.render_terb(:binding => arr_binding)
481
521
  end
482
522
  end
483
523
 
484
524
 
485
525
  class TestOptionReaders < Test::Unit::TestCase
486
526
 
487
- class RendererForCheckingOptionReaders < Ruport::Renderer
527
+ class ControllerForCheckingOptionReaders < Ruport::Controller
488
528
  required_option :foo
489
529
  end
490
530
 
491
- class RendererForCheckingPassivity < Ruport::Renderer
531
+ class ControllerForCheckingPassivity < Ruport::Controller
492
532
  def foo
493
533
  "apples"
494
534
  end
@@ -496,10 +536,10 @@ class TestOptionReaders < Test::Unit::TestCase
496
536
  end
497
537
 
498
538
  def setup
499
- @renderer = RendererForCheckingOptionReaders.new
539
+ @renderer = ControllerForCheckingOptionReaders.new
500
540
  @renderer.formatter = Ruport::Formatter.new
501
541
 
502
- @passive = RendererForCheckingPassivity.new
542
+ @passive = ControllerForCheckingPassivity.new
503
543
  @passive.formatter = Ruport::Formatter.new
504
544
  end
505
545
 
@@ -519,7 +559,7 @@ end
519
559
 
520
560
  class TestSetupOrdering < Test::Unit::TestCase
521
561
 
522
- class RendererWithSetup < Ruport::Renderer
562
+ class ControllerWithSetup < Ruport::Controller
523
563
  stage :bar
524
564
  def setup
525
565
  options.foo.capitalize!
@@ -527,7 +567,7 @@ class TestSetupOrdering < Test::Unit::TestCase
527
567
  end
528
568
 
529
569
  class BasicFormatter < Ruport::Formatter
530
- renders :text, :for => RendererWithSetup
570
+ renders :text, :for => ControllerWithSetup
531
571
 
532
572
  def build_bar
533
573
  output << options.foo
@@ -535,24 +575,89 @@ class TestSetupOrdering < Test::Unit::TestCase
535
575
  end
536
576
 
537
577
  def test_render_hash_options_should_be_called_before_setup
538
- assert_equal "Hello", RendererWithSetup.render_text(:foo => "hello")
578
+ assert_equal "Hello", ControllerWithSetup.render_text(:foo => "hello")
539
579
  end
540
580
 
541
581
  def test_render_block_should_be_called_before_setup
542
582
  assert_equal "Hello",
543
- RendererWithSetup.render_text { |r| r.options.foo = "hello" }
583
+ ControllerWithSetup.render_text { |r| r.options.foo = "hello" }
544
584
  end
545
585
 
546
586
  end
547
587
 
548
- class TestRendererHooks < Test::Unit::TestCase
588
+ class CustomFormatter < Ruport::Formatter
589
+ def custom_helper
590
+ output << "Custom!"
591
+ end
592
+ end
593
+
594
+ class ControllerWithAnonymousFormatters < Ruport::Controller
595
+
596
+ stage :report
597
+
598
+ formatter :html do
599
+ build :report do
600
+ output << textile("h1. Hi there")
601
+ end
602
+ end
603
+
604
+ formatter :csv do
605
+ build :report do
606
+ build_row([1,2,3])
607
+ end
608
+ end
609
+
610
+ formatter :pdf do
611
+ build :report do
612
+ add_text "hello world"
613
+ end
614
+ end
615
+
616
+ formatter :text do
617
+ build :report do
618
+ output << "Hello world"
619
+ end
620
+ end
621
+
622
+ formatter :custom => CustomFormatter do
623
+
624
+ build :report do
625
+ output << "This is "
626
+ custom_helper
627
+ end
628
+
629
+ end
630
+
631
+ end
632
+
633
+ class TestAnonymousFormatter < Test::Unit::TestCase
634
+ context "When using built in Ruport formatters" do
635
+
636
+ def specify_text_formatter_shortcut_is_accessible
637
+ assert_equal "Hello world", ControllerWithAnonymousFormatters.render_text
638
+ assert_equal "1,2,3\n", ControllerWithAnonymousFormatters.render_csv
639
+ assert_equal "<h1>Hi there</h1>", ControllerWithAnonymousFormatters.render_html
640
+ assert_not_nil ControllerWithAnonymousFormatters.render_pdf
641
+ end
642
+
643
+ end
644
+
645
+ context "When using custom formatters" do
646
+ def specify_custom_formatter_shortcut_is_accessible
647
+ assert_equal "This is Custom!", ControllerWithAnonymousFormatters.render_custom
648
+ end
649
+ end
650
+
651
+ end
652
+
653
+ class TestControllerHooks < Test::Unit::TestCase
549
654
 
550
655
  context "when renderable_data omitted" do
551
656
 
552
657
  require "mocha"
553
658
 
554
659
  class DummyObject
555
- include Ruport::Renderer::Hooks
660
+ include Ruport::Controller::Hooks
556
661
  renders_as_table
557
662
  end
558
663
 
@@ -560,7 +665,7 @@ class TestRendererHooks < Test::Unit::TestCase
560
665
  a = DummyObject.new
561
666
  rend = mock("renderer")
562
667
  rend.expects(:data=).with(a)
563
- Ruport::Renderer::Table.expects(:render).with(:csv,{}).yields(rend)
668
+ Ruport::Controller::Table.expects(:render).with(:csv,{}).yields(rend)
564
669
  a.as(:csv)
565
670
  end
566
671
 
@@ -569,7 +674,7 @@ class TestRendererHooks < Test::Unit::TestCase
569
674
  context "when using renderable_data" do
570
675
 
571
676
  class DummyObject2
572
- include Ruport::Renderer::Hooks
677
+ include Ruport::Controller::Hooks
573
678
  renders_as_table
574
679
 
575
680
  def renderable_data(format)
@@ -581,12 +686,12 @@ class TestRendererHooks < Test::Unit::TestCase
581
686
  a = DummyObject2.new
582
687
  rend = mock("renderer")
583
688
  rend.expects(:data=).with(1)
584
- Ruport::Renderer::Table.expects(:render).with(:csv,{}).yields(rend)
689
+ Ruport::Controller::Table.expects(:render).with(:csv,{}).yields(rend)
585
690
  a.as(:csv)
586
691
  end
587
692
 
588
693
  class DummyObject3
589
- include Ruport::Renderer::Hooks
694
+ include Ruport::Controller::Hooks
590
695
  renders_as_table
591
696
 
592
697
  def renderable_data
@@ -599,7 +704,7 @@ class TestRendererHooks < Test::Unit::TestCase
599
704
  end
600
705
 
601
706
  class DummyObject4
602
- include Ruport::Renderer::Hooks
707
+ include Ruport::Controller::Hooks
603
708
  renders_as_table
604
709
 
605
710
  def renderable_data(format)
@@ -616,7 +721,7 @@ class TestRendererHooks < Test::Unit::TestCase
616
721
  a = DummyObject4.new
617
722
  rend = mock("renderer")
618
723
  rend.expects(:data=).with(2)
619
- Ruport::Renderer::Table.expects(:render).with(:csv,{}).yields(rend)
724
+ Ruport::Controller::Table.expects(:render).with(:csv,{}).yields(rend)
620
725
  a.as(:csv)
621
726
  end
622
727
 
@@ -626,8 +731,8 @@ class TestRendererHooks < Test::Unit::TestCase
626
731
 
627
732
  def specify_an_unknown_format_error_should_be_raised
628
733
 
629
- assert_raises(Ruport::Renderer::UnknownFormatError) do
630
- Ruport::Renderer.render_foo
734
+ assert_raises(Ruport::Controller::UnknownFormatError) do
735
+ Ruport::Controller.render_foo
631
736
  end
632
737
 
633
738
  end