#!/usr/bin/env ruby
require 'pathname'
require 'rubygems'
require 'rubygems/installer'
require 'rake'
require "rake/clean"
require "rake/gempackagetask"
require "fileutils"
require Pathname('spec/rake/spectask')
require Pathname('lib/extlib/version')

ROOT = Pathname(__FILE__).dirname.expand_path

##############################################################################
# Package && release
##############################################################################
RUBY_FORGE_PROJECT  = "extlib"
PROJECT_URL         = "http://extlib.rubyforge.org"
PROJECT_SUMMARY     = "Support library for DataMapper and Merb."
PROJECT_DESCRIPTION = PROJECT_SUMMARY

AUTHOR = "Sam Smoot"
EMAIL  = "ssmoot@gmail.com"

GEM_NAME    = "extlib"
PKG_BUILD   = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
GEM_VERSION = Extlib::VERSION + PKG_BUILD

RELEASE_NAME    = "REL #{GEM_VERSION}"

WINDOWS = (RUBY_PLATFORM =~ /win32|mingw|bccwin|cygwin/) rescue nil
JRUBY   = (RUBY_PLATFORM =~ /java/) rescue nil

# sudo is used by default, except on Windows, or if SUDOLESS env is true
SUDO = WINDOWS ? '' : ('sudo' unless ENV['SUDOLESS'])
# RCov is run by default, except on the JRuby platform, or if NO_RCOV env is true
RUN_RCOV = JRUBY ? false : (ENV.has_key?('NO_RCOV') ? ENV['NO_RCOV'] != 'true' : true)

require "lib/extlib/tasks/release"

spec = Gem::Specification.new do |s|
  s.name         = GEM_NAME
  s.version      = GEM_VERSION
  s.platform     = Gem::Platform::RUBY
  s.author       = AUTHOR
  s.email        = EMAIL
  s.homepage     = PROJECT_URL
  s.summary      = PROJECT_SUMMARY
  s.description  = PROJECT_DESCRIPTION
  s.require_path = 'lib'
  s.files        = %w[ LICENSE README Rakefile History.txt ] + Dir['lib/**/*'] + Dir['spec/**/*']

  # rdoc
  s.has_rdoc         = false
  s.extra_rdoc_files = %w[ LICENSE README History.txt ]

  # Dependencies
  # s.add_dependency "english", ">=0.2.0"
end

Rake::GemPackageTask.new(spec) do |package|
  package.gem_spec = spec
end

desc 'Remove all package, docs and spec products'
task :clobber_all => %w[ clobber_package clobber_doc extlib:clobber_spec ]

##############################################################################
# Specs and continous integration
##############################################################################
task :default => 'extlib:spec'
task :spec    => 'extlib:spec'

namespace :extlib do
  Spec::Rake::SpecTask.new(:spec) do |t|
    t.spec_opts << '--format' << 'specdoc' << '--colour'
    t.spec_opts << '--loadby' << 'random'
    t.spec_files = Pathname.glob(ENV['FILES'] || 'spec/**/*_spec.rb').map { |f| f.to_s }

    begin
      gem 'rcov'
      t.rcov = RUN_RCOV
      t.rcov_opts << '--exclude' << 'spec'
      t.rcov_opts << '--text-summary'
      t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse'
    rescue LoadError
      # rcov not installed
    end
  end
end


##############################################################################
# Documentation
##############################################################################
desc "Generate documentation"
task :doc do
  begin
    require 'yard'
    exec 'yardoc'
  rescue LoadError
    puts 'You will need to install the latest version of Yard to generate the
          documentation for extlib.'
  end
end

desc "Install #{GEM_NAME}"
task :install => :package do
  sh %{#{SUDO} gem install --local pkg/#{GEM_NAME}-#{GEM_VERSION} --no-update-sources}
end

if WINDOWS
  namespace :dev do
    desc 'Install for development (for Windows)'
    task :winstall => :gem do
      system %{gem install --no-rdoc --no-ri -l pkg/#{GEM_NAME}-#{GEM_VERSION}.gem}
    end
  end
end

namespace :ci do

  task :prepare do
    rm_rf ROOT + "ci"
    mkdir_p ROOT + "ci"
    mkdir_p ROOT + "ci/doc"
    mkdir_p ROOT + "ci/cyclomatic"
    mkdir_p ROOT + "ci/token"
  end

  task :publish do
    out = ENV['CC_BUILD_ARTIFACTS'] || "out"
    mkdir_p out unless File.directory? out

    mv "ci/rspec_report.html", "#{out}/rspec_report.html"
    mv "ci/coverage", "#{out}/coverage"
    mv "ci/doc", "#{out}/doc"
    mv "ci/cyclomatic", "#{out}/cyclomatic_complexity"
    mv "ci/token", "#{out}/token_complexity"
  end

  task :spec => :prepare do
    Rake::Task[:spec].invoke
    mv ROOT + "coverage", ROOT + "ci/coverage"
    Rake::Task[:gem]
    Gem::Installer.new("pkg/#{GEM_NAME}-#{GEM_VERSION}.gem").install
  end

  task :doc do
    require 'yard'
    sh 'yardoc'
  end

  task :saikuro do
    system "saikuro -c -i lib -y 0 -w 10 -e 15 -o ci/cyclomatic"
    mv 'ci/cyclomatic/index_cyclo.html', 'ci/cyclomatic/index.html'

    system "saikuro -t -i lib -y 0 -w 20 -e 30 -o ci/token"
    mv 'ci/token/index_token.html', 'ci/token/index.html'
  end

end

task :ci => ["ci:spec"]

desc 'Default: run spec examples'
task :default => 'spec'

##############################################################################
# Benchmarks
##############################################################################

namespace :benchmark do
  desc "Runs benchmarks"
  task :run do
    files = Dir["benchmarks/**/*.rb"]

    files.each do |f|
      system "ruby #{f}"
    end
  end
end
