Ticket #12: tarantula_less_mem.patch

File tarantula_less_mem.patch, 7.0 kB (added by someone23, 5 months ago)

reduce memory usage by writing html detail pages incrementally, also made console reporting more Reporter-like

  • tarantula.orig/lib/relevance/tarantula/crawler.rb

    old new  
    2021    @links_to_crawl = [] 
    2122    @forms_to_crawl = [] 
    2223    @referrers = {} 
    23     @skip_uri_patterns =
     24    @skip_uri_patterns = 
    2425      /^javascript/, 
    2526      /^mailto/, 
    26       /^http/,                                       
     27      /^http/, 
    2728    ] 
    2829    self.transform_url_patterns = [ 
    2930      [/#.*$/, ''] 
    3031    ] 
    31     @reporters = [
     32    @reporters = [Relevance::Tarantula::IOReporter.new($stderr)
    3233    @decoder = HTMLEntities.new 
    33      
    3434  end 
    3535   
    3636  def method_missing(meth, *args) 
     
    7487  end   
    7588   
    7689  def save_result(result) 
    77     return if result.nil? 
    78     collection = result.success ? successes : failures 
    79     collection << result 
     90    reporters.each do |reporter| 
     91      reporter.report(result) 
     92    end 
    8093  end 
    8194   
    8295  def handle_link_results(link, response) 
     
    178195  end 
    179196 
    180197  def generate_reports 
    181     FileUtils.mkdir_p(report_dir) 
     198    errors = [] 
    182199    reporters.each do |reporter| 
    183       reporter.report(report_dir, self) 
    184     end 
    185   end 
    186    
    187   def report_to_console 
    188     unless (failures).empty? 
    189       $stderr.puts "****** FAILURES" 
    190       failures.each do |failure| 
    191         $stderr.puts "#{failure.code}: #{failure.url}" 
     200      begin 
     201        reporter.finish_report 
     202      rescue RuntimeError => e 
     203        errors << e 
    192204      end 
    193       raise "#{failures.size} failures" 
     205    end 
     206    unless errors.empty? 
     207      raise errors.map(&:message).join("\n") 
    194208    end 
    195209  end 
    196210   
    197211  def report_results 
    198     puts "Writing results to #{report_dir}" 
    199212    generate_reports 
    200     report_to_console 
    201213  end 
    202214   
    203215  def total_links_count 
  • tarantula.orig/lib/relevance/tarantula/html_reporter.rb

    old new  
    11class Relevance::Tarantula::HtmlReporter 
     2   
    23  include Relevance::Tarantula 
    3   attr_accessor :basedir, :results  
     4  attr_accessor :basedir, :results 
    45  delegate :successes, :failures, :to => :results 
    5   def self.report(basedir, results) 
    6     self.new(basedir, results) 
    7   end 
    8  
    9   def initialize(basedir, results) 
     6   
     7  HtmlResultOverview = Struct.new(:code, :url, :description, :method, :referrer, :file_name) 
     8   
     9  def initialize(basedir) 
    1010    @basedir = basedir 
    11     @results = results 
    12     copy_styles 
    13     create_index 
    14     create_detail_reports 
     11    @results = Struct.new(:successes, :failures).new([], []) 
     12    FileUtils.mkdir_p(@basedir) 
    1513  end 
    1614   
    17   def template(name) 
    18     File.read(File.join(File.dirname(__FILE__), name)) 
     15  def report(result) 
     16    return if result.nil? 
     17     
     18    create_detail_report(result) 
     19     
     20    collection = result.success ? results.successes : results.failures 
     21    collection << HtmlResultOverview.new( 
     22      result.code, result.url, result.description, result.method, result.referrer, result.file_name 
     23    ) 
    1924  end 
    2025   
    21   def output(name, body) 
    22     File.open(File.join(basedir, name), "w") do |file| 
    23       file.write body 
    24     end 
    25   end       
     26  def finish_report 
     27    puts "Writing results to #{basedir}" 
     28    copy_styles 
     29    create_index 
     30  end 
    2631   
    2732  def copy_styles 
    2833    # not using cp_r because it picks up .svn crap 
     
    4449    template = ERB.new(template("index.html.erb")) 
    4550    output("index.html", template.result(binding)) 
    4651  end 
    47  
    48   def create_detail_reports 
    49     template = ERB.new(template("detail.html.erb")) 
    50     results.successes.each do |result| 
    51       output(result.file_name, template.result(result.send(:binding))) 
    52     end 
    53     results.failures.each do |result
    54       output(result.file_name, template.result(result.send(:binding))) 
     52   
     53  def template(name) 
     54    File.read(File.join(File.dirname(__FILE__), name)) 
     55  end 
     56   
     57  def output(name, body) 
     58    File.open(File.join(basedir, name), "w") do |file
     59      file.write body 
    5560    end 
     61  end       
     62   
     63  def create_detail_report(result) 
     64    template = ERB.new(template("detail.html.erb")) 
     65    output(result.file_name, template.result(result.send(:binding))) 
    5666  end  
    57  
     67   
    5868  # CSS class for HTML status codes 
    5969  def class_for_code(code) 
    6070    "r#{Integer(code)/100}"  
    6171  end 
     72   
     73   
    6274end 
  • tarantula.orig/lib/relevance/tarantula/io_reporter.rb

    old new  
     1class Relevance::Tarantula::IOReporter 
     2   
     3  include Relevance::Tarantula 
     4  attr_accessor :io, :results 
     5  delegate :successes, :failures, :to => :results 
     6   
     7  IOResultOverview = Struct.new(:code, :url) 
     8   
     9  def initialize(io) 
     10    @io = io 
     11    @results = Struct.new(:successes, :failures).new([], []) 
     12  end 
     13   
     14  def report(result) 
     15    return if result.nil? 
     16     
     17    unless result.success # collection = result.success ? results.successes : results.failures 
     18      results.failures << IOResultOverview.new( 
     19        result.code, result.url 
     20      ) 
     21    end 
     22  end 
     23   
     24  def finish_report 
     25    unless (failures).empty? 
     26      io.puts "****** FAILURES" 
     27      failures.each do |failure| 
     28        io.puts "#{failure.code}: #{failure.url}" 
     29      end 
     30      raise "#{failures.size} failures" 
     31    end 
     32  end 
     33   
     34end 
  • tarantula.orig/lib/relevance/tarantula/rails_integration_proxy.rb

    old new  
    1818      [/\?\d+$/, ''],                               # strip trailing numbers for assets 
    1919      [/^http:\/\/#{integration_test.host}/, '']    # strip full path down to relative 
    2020    ] 
    21     t.reporters << Relevance::Tarantula::HtmlReporter 
     21    t.reporters << Relevance::Tarantula::HtmlReporter.new(t.report_dir) 
    2222    t 
    2323  end 
    2424 
  • tarantula.orig/lib/relevance/tarantula/result.rb

    old new  
    3030    "#{DEFAULT_LOCALHOST}#{url}" 
    3131  end 
    3232  ALLOW_NNN_FOR = /^allow_(\d\d\d)_for$/ 
    33   class <<self 
     33  class << self 
    3434    attr_accessor :next_number 
    3535    def handle(result) 
    3636      retval = result.dup