require "rake/clean"
require "rake/testtask"
require "bundler/gem_tasks"

task :default => :test

# FIXME: Redefining :test task to run test/options_test.rb in isolated process since it depends on whether Rails is loaded or not.
# Remove this task when we finished changing escape_html option to be true by default.
isolated_test = Rake::TestTask.new do |t|
  t.libs << 'test'
  t.test_files = %w[test/options_test.rb]
  t.warning = true
  t.verbose = true
end
Rake::TestTask.new do |t|
  t.libs << 'test'
  t.test_files = Dir['test/*_test.rb'] + Dir['test/haml-spec/*_test.rb'] - isolated_test.file_list
  t.warning = true
  t.verbose = true
end

CLEAN.replace %w(pkg doc coverage .yardoc test/haml vendor)

desc "Benchmark Haml against ERB. TIMES=n sets the number of runs, default is 1000."
task :benchmark do
  sh "ruby benchmark.rb #{ENV['TIMES']}"
end

task :set_coverage_env do
  ENV["COVERAGE"] = "true"
end

desc "Run Simplecov"
task :coverage => [:set_coverage_env, :test]

task :submodules do
  if File.exist?(File.dirname(__FILE__) + "/.git")
    sh %{git submodule sync}
    sh %{git submodule update --init --recursive}
  end
end

namespace :doc do
  task :sass do
    require 'sass'
    Dir["yard/default/**/*.sass"].each do |sass|
      File.open(sass.gsub(/sass$/, 'css'), 'w') do |f|
        f.write(Sass::Engine.new(File.read(sass)).render)
      end
    end
  end

  desc "List all undocumented methods and classes."
  task :undocumented do
    command = 'yard --list --query '
    command << '"object.docstring.blank? && '
    command << '!(object.type == :method && object.is_alias?)"'
    sh command
  end
end

desc "Generate documentation"
task(:doc => 'doc:sass') {sh "yard"}

desc "Generate documentation incrementally"
task(:redoc) {sh "yard -c"}

desc <<END
Profile Haml.
  TIMES=n sets the number of runs. Defaults to 1000.
  FILE=str sets the file to profile. Defaults to 'standard'
  OUTPUT=str sets the ruby-prof output format.
    Can be Flat, CallInfo, or Graph. Defaults to Flat. Defaults to Flat.
END
task :profile do
  times  = (ENV['TIMES'] || '1000').to_i
  file   = ENV['FILE'] || 'test/templates/standard.haml'

  require 'bundler/setup'
  require 'ruby-prof'
  require 'haml'
  file = File.read(File.expand_path("../#{file}", __FILE__))
  obj = Object.new
  Haml::Engine.new(file).def_method(obj, :render)
  result = RubyProf.profile { times.times { obj.render } }

  RubyProf.const_get("#{(ENV['OUTPUT'] || 'Flat').capitalize}Printer").new(result).print
end

def gemfiles
  @gemfiles ||= Dir[File.dirname(__FILE__) + '/test/gemfiles/Gemfile.*'].reject {|f| f =~ /\.lock$/}
end

def with_each_gemfile
  gemfiles.each do |gemfile|
    Bundler.with_clean_env do
      puts "Using gemfile: #{gemfile}"
      ENV['BUNDLE_GEMFILE'] = gemfile
      yield
    end
  end
end

namespace :test do
  namespace :bundles do
    desc "Install all dependencies necessary to test Haml."
    task :install do
      with_each_gemfile {sh "bundle"}
    end

    desc "Update all dependencies for testing Haml."
    task :update do
      with_each_gemfile {sh "bundle update"}
    end
  end

  desc "Test all supported versions of rails. This takes a while."
  task :rails_compatibility => 'test:bundles:install' do
    with_each_gemfile {sh "bundle exec rake test"}
  end
  task :rc => :rails_compatibility
end