Changeset 1263

Show
Ignore:
Timestamp:
02/04/08 03:54:39 (10 months ago)
Author:
brian
Message:

Push data.dup down into the formatter, so that well-behaved formatters may choose not to do it.

Add test case to ensure the dup is taking place.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • ruport/branches/1.4/lib/ruport/formatter.rb

    r1231 r1263  
    137137    
    138138    # Set by the <tt>:data</tt> attribute from Renderer#render 
    139     attr_accessor :data               
     139    attr_reader :data               
    140140     
    141141    # Set automatically by Renderer#render(format) or Renderer#render_format 
     
    202202    end  
    203203 
     204    # Sets the data object, making a local copy using #dup. This may have 
     205    # a significant overhead for large tables, so formatters which don't 
     206    # modify the data object may wish to override this. 
     207    def data=(val) 
     208      @data = val.dup 
     209    end 
     210 
    204211    # Clears the output. 
    205212    def clear_output 
  • ruport/branches/1.4/lib/ruport/renderer.rb

    r1237 r1263  
    409409  # Sets +data+ attribute on the active formatter. 
    410410  def data=(val) 
    411     formatter.data = val.dup  
     411    formatter.data = val 
    412412  end 
    413413 
  • ruport/branches/1.4/test/renderer_test.rb

    r1237 r1263  
    6464end    
    6565 
     66# This formatter modifies the (String) data object passed to it 
     67class 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 
     81end 
     82 
     83 
    6684class VanillaBinary < Ruport::Formatter 
    6785  renders :bin, :for => VanillaRenderer 
     
    261279  class RendererWithManyHooks < Ruport::Renderer 
    262280    add_format DummyText, :text 
     281    add_format Destructive, :destructive 
    263282 
    264283    prepare :document 
     
    297316     assert_equal :red, r.options.snapper 
    298317   } 
     318  end 
     319 
     320  def test_formatter_data_dup 
     321    source = "some text" 
     322    result = RendererWithManyHooks.render(:destructive, :data => source) 
     323    assert_equal("You sent some text", result) 
     324    assert_equal("some text", source) 
    299325  end 
    300326