# class RubyProf::ProfileTask

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

### Attributes

min_percent[RW]
output_dir[RW]
printer[RW]

### Public Class Methods

new(name = :profile) click to toggle source
Calls superclass method

    # File lib/ruby-prof/task.rb, line 64
    def initialize(name = :profile)
      super(name)
    end

### Public Instance Methods

clean_output_directory() click to toggle source

    # 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_directory() click to toggle source

    # File lib/ruby-prof/task.rb, line 129
    def create_output_directory
      if not File.exist?(output_directory)
        Dir.mkdir(output_directory)
      end
    end

define() click to toggle source

Create the tasks defined by this task lib.

    # 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

output_directory() click to toggle source

    # File lib/ruby-prof/task.rb, line 125
    def output_directory
      File.expand_path(@output_dir)
    end

run_script(script_path) click to toggle source

Run script

    # 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