begin
  require 'rspec/core/rake_task'
  require 'coveralls/rake/task'

  desc 'Run all specs'
  task :spec => ['spec:unit', 'spec:acceptance']

  desc 'Default task which runs all specs with code coverage enabled'
  task :default => ['spec:set_coverage', 'spec:unit']

  Coveralls::RakeTask.new
  task :ci => ['spec:set_coverage', 'spec:unit', 'coveralls:push']
rescue LoadError; end

namespace :spec do
  task :set_coverage do
    ENV['COVERAGE'] = 'true'
  end

  def types
    dirs = Dir['./spec/**/*_spec.rb'].map { |f| f.sub(/^\.\/(spec\/\w+)\/.*/, '\\1') }.uniq
    Hash[dirs.map { |d| [d.split('/').last, d] }]
  end
  types.each do |type, dir|
    desc "Run the code examples in #{dir}"
    RSpec::Core::RakeTask.new(type) do |t|
      # Tells rspec-fire to verify if constants used really exist
      ENV['VERIFY_CONSTANT_NAMES'] = '1'

      t.pattern = "./#{dir}/**/*_spec.rb"
    end
  end
end