require 'fileutils'

task :default => [:clean]

task :clean do
  [".", "tests"].each do |cd|
    puts "Cleaning directory #{cd}"
    Dir.new(cd).each do |t|
      if t =~ /.*\.pyc$/
        puts "Removing #{File.join(cd, t)}"
        File.delete(File.join(cd, t))
      end
    end
  end
end

desc "Upversion files"
task :upversion do
  puts "Upversioning"

  Dir.glob("*.py").each do |filename|
    f = File.new(filename, File::RDWR)
    contents = f.read()

    contents.gsub!(/__version__ = ".+?"/){|m|
      cur_version = m.scan(/\d+\.\d+/)[0].to_f
      new_version = cur_version + 0.1

      puts "Current version: #{cur_version}"
      puts "New version: #{new_version}"

      new_line = "__version__ = \"#{new_version}\""

      puts "Old line: #{m}"
      puts "New line: #{new_line}"

      m = new_line
    }

    puts contents[0]

    f.truncate(0) # empty the existing file
    f.seek(0)
    f.write(contents.to_s) # write modified file
    f.close()
  end
end

desc "Upload current version to PyPi"
task :topypi => :test do
  cur_file = File.open("tvdb_api.py").read()
  tvdb_api_version = cur_file.scan(/__version__ = "(.*)"/)
  tvdb_api_version = tvdb_api_version[0][0].to_f

  puts "Build sdist and send tvdb_api v#{tvdb_api_version} to PyPi?"
  if $stdin.gets.chomp == "y"
    puts "Sending source-dist (sdist) to PyPi"

    if system("python setup.py sdist register upload")
      print "tvdb_api uploaded!"
    end

  else
    puts "Cancelled"
  end
end

desc "Profile by running unittests"
task :profile do
  cd "tests"
  puts "Profiling.."
  `python -m cProfile -o prof_runtest.prof runtests.py`
  puts "Converting prof to dot"
  `python gprof2dot.py -o prof_runtest.dot -f pstats prof_runtest.prof`
  puts "Generating graph"
  `~/Applications/dev/graphviz.app/Contents/macOS/dot -Tpng -o profile.png prof_runtest.dot -Gbgcolor=black`
  puts "Cleanup"
  rm "prof_runtest.dot"
  rm "prof_runtest.prof"
end

task :test do
  puts "Nosetest'ing"
  if not system("nosetests -v")
    raise "Test failed!"
  end

  puts "Doctesting *.py (excluding setup.py)"
  Dir.glob("*.py").select{|e| ! e.match(/setup.py/)}.each do |filename|
    if filename =~ /^setup\.py/
      skip
    end
    puts "Doctesting #{filename}"
    if not system("python", "-m", "doctest", filename)
      raise "Failed doctest"
    end
  end

  puts "Doctesting readme.md"
  if not system("python", "-m", "doctest", "readme.md")
    raise "Doctest"
  end
end
