# -*- ruby encoding: utf-8 -*-

require 'rubygems'
require 'hoe'
require 'rake/clean'

Hoe.plugin :doofus
Hoe.plugin :gemspec2
Hoe.plugin :git
Hoe.plugin :minitest
Hoe.plugin :travis
Hoe.plugin :email unless ENV['CI'] or ENV['TRAVIS']

spec = Hoe.spec 'mime-types' do
  developer('Austin Ziegler', 'halostatue@gmail.com')
  self.need_tar = true

  require_ruby_version '>= 1.9.2'

  self.history_file = 'History.rdoc'
  self.readme_file = 'README.rdoc'
  self.extra_rdoc_files = FileList['*.rdoc'].to_a

  self.licenses = ['MIT', 'Artistic-2.0', 'GPL-2.0']

  extra_dev_deps << ['hoe-doofus', '~> 1.0']
  extra_dev_deps << ['hoe-gemspec2', '~> 1.1']
  extra_dev_deps << ['hoe-git', '~> 1.6']
  extra_dev_deps << ['hoe-rubygems', '~> 1.0']
  extra_dev_deps << ['hoe-travis', '~> 1.2']
  extra_dev_deps << ['minitest', '~> 5.4']
  extra_dev_deps << ['minitest-autotest', '~> 1.0']
  extra_dev_deps << ['minitest-focus', '~> 1.0']
  extra_dev_deps << ['rake', '~> 10.0']
  extra_dev_deps << ['fivemat', '~> 1.3' ]
  extra_dev_deps << ['minitest-rg', '~> 5.2']

  if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.0')
    extra_dev_deps << ['simplecov', '~> 0.7']
    extra_dev_deps << ['coveralls', '~> 0.8']
  end
end

task :support do
  %w(lib support).each { |path|
    $LOAD_PATH.unshift(File.join(Rake.application.original_dir, path))
  }
end

task 'support:nokogiri' => :support do
  begin
    gem 'nokogiri'
  rescue Gem::LoadError
    raise 'Nokogiri is not installed. Please install it.'
  end
end

namespace :benchmark do
  desc 'Benchmark Load Times'
  task :load, [ :repeats ] => :support do |_, args|
    require 'benchmarks/load'
    Benchmarks::Load.report(
      File.join(Rake.application.original_dir, 'lib'),
      args.repeats
    )
  end

  desc 'Allocation counts'
  task :allocations, [ :top_x, :mime_types_only ] => :support do |_, args|
    require 'benchmarks/load_allocations'
    Benchmarks::LoadAllocations.report(
      top_x: args.top_x,
      mime_types_only: args.mime_types_only
    )
  end

  desc 'Columnar allocation counts'
  task 'allocations:columnar', [ :top_x, :mime_types_only ] => :support do |_, args|
    require 'benchmarks/load_allocations'
    Benchmarks::LoadAllocations.report(
      columnar: true,
      top_x: args.top_x,
      mime_types_only: args.mime_types_only
    )
  end

  desc 'Object counts'
  task objects: :support do
    require 'benchmarks/object_counts'
    Benchmarks::ObjectCounts.report
  end

  desc 'Columnar object counts'
  task 'objects:columnar' => :support do
    require 'benchmarks/object_counts'
    Benchmarks::ObjectCounts.report(columnar: true)
  end
end

if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.0')
  namespace :test do
    task :coveralls do
      spec.test_prelude = [
        'require "psych"',
        'require "simplecov"',
        'require "coveralls"',
        'SimpleCov.formatter = Coveralls::SimpleCov::Formatter',
        'SimpleCov.start("test_frameworks") { command_name "Minitest" }',
        'gem "minitest"'
      ].join('; ')
      Rake::Task['test'].execute
    end

    desc 'Run test coverage'
    task :coverage do
      spec.test_prelude = [
        'require "simplecov"',
        'SimpleCov.start("test_frameworks") { command_name "Minitest" }',
        'gem "minitest"'
      ].join('; ')
      Rake::Task['test'].execute
    end
  end

  Rake::Task['travis'].prerequisites.replace(%w(test:coveralls))
end

namespace :mime do
  desc 'Download the current MIME type registrations from IANA.'
  task :iana, [ :destination ] => 'support:nokogiri' do |_, args|
    require 'iana_registry'
    IANARegistry.download(to: args.destination)
  end

  desc 'Download the current MIME type configuration from Apache.'
  task :apache, [ :destination ] => 'support:nokogiri' do |_, args|
    require 'apache_mime_types'
    ApacheMIMETypes.download(to: args.destination)
  end
end

namespace :convert do
  namespace :docs do
    task :setup do
      gem 'rdoc'
      require 'rdoc/rdoc'
      @doc_converter ||= RDoc::Markup::ToMarkdown.new
    end

    %w(README History History-Types).each do |name|
      rdoc = "#{name}.rdoc"
      mark = "#{name}.md"

      file mark => [ rdoc, :setup ] do |t|
        puts "#{rdoc} => #{mark}"
        File.open(t.name, 'wb') { |target|
          target.write @doc_converter.convert(IO.read(t.prerequisites.first))
        }
      end

      CLEAN.add mark

      task run: [ mark ]
    end
  end

  desc 'Convert documentation from RDoc to Markdown'
  task docs: 'convert:docs:run'

  namespace :yaml do
    desc 'Convert from YAML to JSON'
    task :json, [ :source, :destination, :multiple_files ] => :support do |_, args|
      require 'convert'
      Convert.from_yaml_to_json(args)
    end

    desc 'Convert from YAML to Columnar'
    task :columnar, [ :source, :destination ] => :support do |_, args|
      require 'convert/columnar'
      Convert::Columnar.from_yaml_to_columnar(args)
    end
  end

  namespace :json do
    desc 'Convert from JSON to YAML'
    task :yaml, [ :source, :destination, :multiple_files ] => :support do |_, args|
      require 'convert'
      Convert.from_json_to_yaml(args)
    end
  end
end

Rake::Task['gem'].prerequisites.unshift('convert:yaml:json')

# vim: syntax=ruby
