require 'rubygems'
require 'rubygems/specification'
require 'rake'
require 'rake/gempackagetask'
require 'rake/rdoctask'
require 'rspec'
require 'rspec/core'
require 'rspec/core/rake_task'
require File.expand_path('lib/restfulie')

GEM = "restfulie"
GEM_VERSION = Restfulie::VERSION
SUMMARY  = "Hypermedia aware resource based library in ruby (client side) and ruby on rails (server side)."
AUTHOR   = "Guilherme Silveira, Caue Guerra, Luis Cipriani, Everton Ribeiro, George Guimaraes, Paulo Ahagon, Several contributors"
EMAIL    = "guilherme.silveira@caelum.com.br"
HOMEPAGE = "http://restfulie.caelumobjects.com"

spec = Gem::Specification.new do |s|
  s.name = GEM
  s.version = GEM_VERSION
  s.platform = Gem::Platform::RUBY
  s.summary = SUMMARY
  s.require_paths = ['lib']
  s.files = FileList['lib/**/*.rb', '[A-Z]*', 'lib/**/*.rng'].to_a
  s.add_dependency("nokogiri", [">= 1.4.2"])
  s.add_dependency("actionpack", [">= 2.3.2"])
  s.add_dependency("activesupport", [">= 2.3.2"])
  s.add_dependency("json_pure", [">= 1.2.4"])

  s.author = AUTHOR
  s.email = EMAIL
  s.homepage = HOMEPAGE
end

module FakeServer
  def self.wait_server(port=3000)
    (1..15).each do 
      begin
        Net::HTTP.get(URI.parse("http://localhost:#{port}/"))
        return
      rescue
        sleep 1
      end
    end
    raise "Waited for the server but it did not finish"
  end
  
  def self.start_sinatra
    IO.popen("cd tests && ruby ./spec/requests/fake_server.rb") do |pipe|
      wait_server 4567
      yield
      Process.kill 'INT', pipe.pid
    end
  end
  
  def self.run(setup, process)
    success = IO.popen(setup) do |pipe|
      wait_server
      success = system "rake spec"
      Process.kill 'INT', pipe.pid
      success
    end
    if !success
      raise "Some of the specs failed"
    end
  end
  
  def self.start_server_and_run_spec(target_dir)
    success = Dir.chdir(File.join(File.dirname(__FILE__), target_dir)) do
      system('rake db:drop db:create db:migrate')
      self.run "rails server", "rake spec"
    end
  end
  
end

# optionally loads a task if the required gems exist
def optionally
  begin
    yield
  rescue LoadError; end
end

namespace :test do
  
  task :spec do
    FakeServer.start_sinatra do
      FakeServer.start_server_and_run_spec "tests"
    end
  end
  
  task :integration do
    FakeServer.start_server_and_run_spec "full-examples/rest_from_scratch/part_1"
    FakeServer.start_server_and_run_spec "full-examples/rest_from_scratch/part_2"
    FakeServer.start_server_and_run_spec "full-examples/rest_from_scratch/part_3"
  end
  
  task :all => ["spec","integration"]
  
  # namespace :rcov do
  #   Spec::Rake::SpecTask.new('rcov') do |t|
  #       t.spec_opts = %w(-fs --color)
  #       t.spec_files = FileList['spec/units/**/*_spec.rb']
  #       t.rcov = true
  #       t.rcov_opts = ["-e", "/Library*", "-e", "~/.rvm", "-e", "spec", "-i", "bin"]
  #     end
  #     desc 'Run coverage test with fake server'
  #     task :run do
  #       start_server_and_invoke_test('test:rcov:rcov')
  #     end
  # end
  
end

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

Rake::RDocTask.new("rdoc") do |rdoc|
   rdoc.options << '--line-numbers' << '--inline-source'
end

optionally do
  require 'yard'
  YARD::Rake::YardocTask.new do |t|
    t.files   = ['lib/restfulie/**/*.rb', 'README.textile']
  end
end

desc "Install the gem locally"
task :install => [:package] do
  sh %{gem install pkg/#{GEM}-#{GEM_VERSION} -l}
end

desc "Create a gemspec file"
task :make_spec do
  File.open("#{GEM}.gemspec", "w") do |file|
    file.puts spec.to_ruby
  end
end

desc "Builds the project"
task :build => ["install", "test:spec"]

desc "Default build will run specs"
task :default => :build