Changeset 1278
- Timestamp:
- 02/19/08 06:13:18 (9 months ago)
- Files:
-
- ruport/branches/brian/exp-renderer-instance/lib/ruport/renderer.rb (modified) (9 diffs)
- ruport/branches/brian/exp-renderer-instance/test/csv_formatter_test.rb (modified) (2 diffs)
- ruport/branches/brian/exp-renderer-instance/test/html_formatter_test.rb (modified) (2 diffs)
- ruport/branches/brian/exp-renderer-instance/test/pdf_formatter_test.rb (modified) (2 diffs)
- ruport/branches/brian/exp-renderer-instance/test/renderer_test.rb (modified) (10 diffs)
- ruport/branches/brian/exp-renderer-instance/test/text_formatter_test.rb (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
ruport/branches/brian/exp-renderer-instance/lib/ruport/renderer.rb
r1262 r1278 322 322 # sets the data and options, and then does the following process: 323 323 # 324 # * If a block is given, yield the Renderer instance. 325 # * Check the presence of any required options. 326 # * If a setup() method is defined on the Renderer, call it. 327 # * Create a formatter. 324 328 # * If the renderer contains a module Helpers, mix it in to the instance. 325 # * If a block is given, yield the Renderer instance.326 # * If a setup() method is defined on the Renderer, call it.327 329 # * Call the run() method. 328 330 # * If the :file option is set to a file name, appends output to the file. … … 331 333 # Please see the examples/ directory for custom renderer examples, because 332 334 # this is not nearly as complicated as it sounds in most cases. 333 def render(format, add_options=nil) 334 rend = build(format, add_options) { |r| 335 yield(r) if block_given? 336 r.setup if r.respond_to? :setup 337 } 338 rend.run 339 rend.formatter.save_output(rend.options.file) if rend.options.file 340 return rend.formatter.output 335 def render(format, add_options={}, &blk) 336 rend = new(add_options, &blk) 337 rend.as(format) 341 338 end 342 339 … … 354 351 end 355 352 356 private357 358 # Creates a new instance of the renderer and sets it to use the specified359 # formatter (by name). If a block is given, the renderer instance is360 # yielded.361 #362 # Returns the renderer instance.363 #364 def build(format, add_options=nil)365 rend = self.new366 367 rend.send(:use_formatter, format)368 rend.send(:options=, options.dup)369 if rend.class.const_defined? :Helpers370 rend.formatter.extend(rend.class.const_get(:Helpers))371 end372 if add_options.kind_of?(Hash)373 d = add_options.delete(:data)374 rend.data = d if d375 add_options.each {|k,v| rend.options.send("#{k}=",v) }376 end377 378 yield(rend) if block_given?379 return rend380 end381 382 353 # Allows you to register a format with the renderer. 383 354 # … … 401 372 attr_writer :formatter 402 373 403 # The +data+ that has been passed to the active formatter.374 # The +data+ that will be passed to the formatter. 404 375 def data 405 formatter.data406 end 407 408 # Sets +data+ attribute on the active formatter.376 @options.data 377 end 378 379 # Sets +data+ to be passed to the formatter. 409 380 def data=(val) 410 formatter.data = val411 end 412 413 # Renderer::Options object w hich is shared with the current formatter.381 @options.data = val 382 end 383 384 # Renderer::Options object within this Renderer 414 385 def options 415 yield(formatter.options) if block_given? 416 formatter.options 417 end 418 386 yield(@options) if block_given? 387 @options 388 end 389 390 # Creates a new instance of the renderer, sets its options, yields self 391 # if block given to allow additional initialization. Then validates the 392 # presence of required options, and calls the 'setup' method if present. 393 # 394 # At this point no formatter is involved. This is so that you can 395 # get a renderer to perform work, and then afterwards choose which 396 # format(s) you want to output this work as. 397 # 398 def initialize(add_options={}) 399 @options = self.class.options.dup 400 add_options.each {|k,v| @options.send("#{k}=",v) } 401 402 yield self if block_given? 403 404 unless self.class.required_options.nil? 405 self.class.required_options.each do |opt| 406 if @options.__send__(opt).nil? 407 raise RequiredOptionNotSet, "Required option #{opt} not set" 408 end 409 end 410 end 411 412 setup if respond_to? :setup 413 end 414 415 # Given this existing renderer object, create and run an appropriate 416 # formatter. If the :file option is set to a file name, appends output 417 # to the file. Return the results of formatter.output 418 # 419 # If a block is given, yield the renderer to it after the formatter 420 # has been created (for backwards compatibility) 421 def as(format, add_options={}) 422 with_formatter(format, add_options) do |formatter| 423 yield formatter if block_given? 424 run 425 formatter.save_output(formatter.options.file) if formatter.options.file 426 return formatter.output 427 end 428 end 429 419 430 # Call the _run_ method. You can override this method in your custom 420 431 # renderer if you need to define other actions. 432 # 433 # By the time this method is called, the formatter object has been created. 421 434 def run 422 435 _run_ … … 429 442 # 430 443 def io=(obj) 431 options.io=obj444 @options.io=obj 432 445 end 433 446 … … 436 449 # If a block is given, it is evaluated in the context of the formatter. 437 450 def formatter(&block) 438 @formatter.instance_eval(&block) if block 451 if block 452 raise "No formatter instance" unless @formatter 453 @formatter.instance_eval(&block) 454 end 439 455 return @formatter 440 456 end … … 453 469 private 454 470 471 # Create a formatter then yield to the block. 472 def with_formatter(format, add_options={}) 473 use_formatter(format) 474 formatter.options = @options.dup 475 add_options.each {|k,v| formatter.options.send("#{k}=",v) } 476 477 if self.class.const_defined? :Helpers 478 formatter.extend(self.class.const_get(:Helpers)) 479 end 480 481 yield formatter if block_given? 482 483 return formatter 484 end 485 455 486 # Called automatically when the report is rendered. Uses the 456 487 # data collected from the earlier methods. 488 # 489 # The formatter must have been created before this method is called 457 490 def _run_ 458 unless self.class.required_options.nil? 459 self.class.required_options.each do |opt| 460 if options.__send__(opt).nil? 461 raise RequiredOptionNotSet, "Required option #{opt} not set" 462 end 463 end 464 end 465 466 if formatter.respond_to?(:apply_template) && options.template != false 467 formatter.apply_template if options.template || 491 d = formatter.options.to_hash.delete(:data) 492 formatter.data = d if d 493 494 if formatter.respond_to?(:apply_template) && formatter.options.template != false 495 formatter.apply_template if formatter.options.template || 468 496 Ruport::Formatter::Template.default 469 497 end … … 471 499 prepare self.class.first_stage if self.class.first_stage 472 500 473 if formatter.respond_to?(:layout) && options.layout != false501 if formatter.respond_to?(:layout) && formatter.options.layout != false 474 502 formatter.layout do execute_stages end 475 503 else … … 501 529 502 530 def options=(o) 503 formatter.options = o531 @options = o 504 532 end 505 533 ruport/branches/brian/exp-renderer-instance/test/csv_formatter_test.rb
r1226 r1278 66 66 opts = nil 67 67 table = Table(%w[a b c]) 68 table.to_csv( 68 rend = table.class.renderer.new( 69 :data => table, 69 70 :template => :simple, 70 71 :table_format => { … … 75 76 :show_headings => true 76 77 } 77 ) do |r| 78 opts = r.options 78 ) 79 rend.as(:csv) do |f| 80 opts = f.options 79 81 end 80 82 ruport/branches/brian/exp-renderer-instance/test/html_formatter_test.rb
r1226 r1278 61 61 opts = nil 62 62 table = Table(%w[a b c]) 63 table.to_html( 63 rend = table.class.renderer.new( 64 :data => table, 64 65 :template => :simple, 65 66 :table_format => { … … 70 71 :show_headings => true 71 72 } 72 ) do |r| 73 opts = r.options 73 ) 74 rend.as(:html) do |f| 75 opts = f.options 74 76 end 75 77 ruport/branches/brian/exp-renderer-instance/test/pdf_formatter_test.rb
r1236 r1278 93 93 opts = nil 94 94 table = Table(%w[a b c]) 95 table.to_pdf( 95 rend = table.class.renderer.new( 96 :data => table, 96 97 :template => :simple, 97 98 :page_format => { … … 117 118 :style => :inline 118 119 } 119 ) do |r| 120 opts = r.options 120 ) 121 rend.as(:pdf) do |f| 122 opts = f.options 121 123 end 122 124 ruport/branches/brian/exp-renderer-instance/test/renderer_test.rb
r1262 r1278 102 102 def specify_apply_template_should_be_called 103 103 Ruport::Formatter::Template.create(:stub) 104 Table(%w[a b c]).to_csv(:template => :stub) do |r| 105 r.formatter.expects(:apply_template) 104 table = Table(%w[a b c]) 105 rend = table.class.renderer.new(:data => table) 106 rend.as(:csv, :template => :stub) do |formatter| 107 formatter.expects(:apply_template) 106 108 end 107 109 end … … 117 119 def specify_default_template_should_be_called 118 120 Ruport::Formatter::Template.create(:default) 119 Table(%w[a b c]).to_csv do |r| 120 r.formatter.expects(:apply_template) 121 assert r.formatter.template == Ruport::Formatter::Template[:default] 121 table = Table(%w[a b c]) 122 rend = table.class.renderer.new(:data => table) 123 rend.as(:csv) do |formatter| 124 formatter.expects(:apply_template) 125 assert formatter.template == Ruport::Formatter::Template[:default] 122 126 end 123 127 end … … 126 130 Ruport::Formatter::Template.create(:default) 127 131 Ruport::Formatter::Template.create(:stub) 128 Table(%w[a b c]).to_csv(:template => :stub) do |r| 129 r.formatter.expects(:apply_template) 130 assert r.formatter.template == Ruport::Formatter::Template[:stub] 132 table = Table(%w[a b c]) 133 rend = table.class.renderer.new(:data => table) 134 rend.as(:csv, :template => :stub) do |formatter| 135 formatter.expects(:apply_template) 136 assert formatter.template == Ruport::Formatter::Template[:stub] 131 137 end 132 138 end … … 134 140 def specify_should_be_able_to_disable_templates 135 141 Ruport::Formatter::Template.create(:default) 136 Table(%w[a b c]).to_csv(:template => false) do |r| 137 r.formatter.expects(:apply_template).never 142 table = Table(%w[a b c]) 143 rend = table.class.renderer.new(:data => table) 144 rend.as(:csv, :template => false) do |formatter| 145 formatter.expects(:apply_template).never 138 146 end 139 147 end … … 187 195 188 196 # render mode 189 OldSchoolRenderer. render_text do |r|190 assert_kind_of Ruport::Formatter, r.formatter191 assert_kind_of DummyText, r.formatter197 OldSchoolRenderer.new.as(:text) do |formatter| 198 assert_kind_of Ruport::Formatter, formatter 199 assert_kind_of DummyText, formatter 192 200 end 193 201 … … 239 247 assert_equal "header\nbody\nfooter\n", 240 248 VanillaRenderer.render_text_using_build 241 VanillaRenderer. render_text_using_build do |rend|242 assert rend.formatter.respond_to?(:build_header)243 assert rend.formatter.respond_to?(:build_body)244 assert rend.formatter.respond_to?(:build_footer)249 VanillaRenderer.new.as(:text_using_build) do |formatter| 250 assert formatter.respond_to?(:build_header) 251 assert formatter.respond_to?(:build_body) 252 assert formatter.respond_to?(:build_footer) 245 253 end 246 254 end … … 417 425 418 426 def test_renderer_helper_module 419 RendererWithHelperModule. render_stub do |r|420 assert_equal "Hello Dolly", r.formatter.say_hello427 RendererWithHelperModule.new.as(:stub) do |f| 428 assert_equal "Hello Dolly", f.say_hello 421 429 end 422 430 end … … 516 524 517 525 class RendererForCheckingPassivity < Ruport::Renderer 526 add_format DummyText, :stub 527 518 528 def foo 519 529 "apples" … … 523 533 524 534 def setup 525 @renderer = RendererForCheckingOptionReaders.new 526 @renderer.formatter = Ruport::Formatter.new 527 528 @passive = RendererForCheckingPassivity.new 529 @passive.formatter = Ruport::Formatter.new 535 @renderer = RendererForCheckingOptionReaders.new(:foo=>123) 536 @passive = RendererForCheckingPassivity.new(:foo=>123) 530 537 end 531 538 532 539 def test_options_are_readable 540 assert_equal 123, @renderer.foo 533 541 @renderer.foo = 5 534 542 assert_equal 5, @renderer.foo … … 539 547 assert_equal "apples", @passive.foo 540 548 assert_equal 5, @passive.options.foo 541 assert_equal 5, @passive.formatter.options.foo 549 @passive.as(:stub) do |f| 550 assert_equal 5, f.options.foo 551 end 542 552 end 543 553 ruport/branches/brian/exp-renderer-instance/test/text_formatter_test.rb
r1226 r1278 97 97 opts = nil 98 98 table = Table(%w[a b c]) 99 table.to_text( 99 rend = table.class.renderer.new( 100 :data => table, 100 101 :template => :simple, 101 102 :table_format => { … … 111 112 :show_headings => true 112 113 } 113 ) do |r| 114 opts = r.options 114 ) 115 rend.as(:text) do |f| 116 opts = f.options 115 117 end 116 118
