Class: RubyProf::ProfileTask

Inherits:
Rake::TestTask
  • Object
show all
Defined in:
lib/ruby-prof/task.rb

Overview

Define a task library for profiling unit tests with ruby-prof.

All of the options provided by the Rake:TestTask are supported except the loader which is set to ruby-prof. For detailed information please refer to the Rake:TestTask documentation.

ruby-prof specific options include:

output_dir - For each file specified an output 
             file with profile information will be
             written to the output directory.
             By default, the output directory is
             called "profile" and is created underneath
             the current working directory.

printer - Specifies the output printer.  Valid values include
          :flat, :graph, :graph_html and :call_tree.

min_percent - Methods that take less than the specified percent
              will not be written out.

Example:

require 'ruby-prof/task'

RubyProf::ProfileTask.new do |t|
  t.test_files = FileList['test/test*.rb']
  t.output_dir = "c:/temp"
  t.printer = :graph
  t.min_percent = 10
end

If rake is invoked with a “TEST=filename” command line option, then the list of test files will be overridden to include only the filename specified on the command line. This provides an easy way to run just one test.

If rake is invoked with a “TESTOPTS=options” command line option, then the given options are passed to the test process after a ‘–’. This allows Test::Unit options to be passed to the test suite.

Examples:

rake profile                           # run tests normally
rake profile TEST=just_one_file.rb     # run just one test file.
rake profile TESTOPTS="-v"             # run in verbose mode
rake profile TESTOPTS="--runner=fox"   # use the fox test runner

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name = :profile) ⇒ ProfileTask

Returns a new instance of ProfileTask.



64
65
66
# File 'lib/ruby-prof/task.rb', line 64

def initialize(name = :profile)
  super(name)
end

Instance Attribute Details

#min_percentObject

Returns the value of attribute min_percent.



61
62
63
# File 'lib/ruby-prof/task.rb', line 61

def min_percent
  @min_percent
end

#output_dirObject

Returns the value of attribute output_dir.



60
61
62
# File 'lib/ruby-prof/task.rb', line 60

def output_dir
  @output_dir
end

#printerObject

Returns the value of attribute printer.



62
63
64
# File 'lib/ruby-prof/task.rb', line 62

def printer
  @printer
end

Instance Method Details

#clean_output_directoryObject



135
136
137
138
139
140
# File 'lib/ruby-prof/task.rb', line 135

def clean_output_directory
  if File.exist?(output_directory)
    files = Dir.glob(output_directory + '/*')
    FileUtils.rm(files)
  end
end

#create_output_directoryObject



129
130
131
132
133
# File 'lib/ruby-prof/task.rb', line 129

def create_output_directory
  if not File.exist?(output_directory)
    Dir.mkdir(output_directory)
  end
end

#defineObject

Create the tasks defined by this task lib.



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/ruby-prof/task.rb', line 69

def define
  lib_path = @libs.join(File::PATH_SEPARATOR)
  desc "Profile" + (@name==:profile ? "" : " for #{@name}")
  
  task @name do
    create_output_directory
    
    @ruby_opts.unshift( "-I#{lib_path}" )
    @ruby_opts.unshift( "-w" ) if @warning
    @ruby_opts.push("-S ruby-prof")
    @ruby_opts.push("--printer #{@printer}")
    @ruby_opts.push("--min_percent #{@min_percent}")

    file_list.each do |file_path|  
      run_script(file_path)
    end
  end
  self
end

#option_listObject

:nodoc:



142
143
144
# File 'lib/ruby-prof/task.rb', line 142

def option_list # :nodoc:
  ENV['OPTIONS'] || @options.join(" ") || ""
end

#output_directoryObject



125
126
127
# File 'lib/ruby-prof/task.rb', line 125

def output_directory
  File.expand_path(@output_dir)
end

#run_script(script_path) ⇒ Object

Run script



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/ruby-prof/task.rb', line 90

def run_script(script_path)
  run_code = ''
  RakeFileUtils.verbose(@verbose) do
    file_name = File.basename(script_path, File.extname(script_path))
    case @printer
      when :flat, :graph, :call_tree
        file_name += ".txt"
      when :graph_html
        file_name += ".html"
      else
        file_name += ".txt"
    end
      
    output_file_path = File.join(output_directory, file_name)
      
    command_line = @ruby_opts.join(" ") + 
                  " --file=" + output_file_path +
                  " " + script_path

    puts "ruby " + command_line 
    # We have to catch the exeption to continue on.  However,
    # the error message will have been output to STDERR
    # already by the time we get here so we don't have to
    # do that again
    begin
      ruby command_line
    rescue => e
      STDOUT << e << "\n"
      STDOUT.flush
    end
    puts ""
    puts ""
  end
end