require 'rake' require 'rake/clean' require 'rdoc/task' require 'rake/tasklib' module Sniff class RakeTasks include Rake::DSL def self.define_tasks(&blk) new(&blk).define_tasks end attr_accessor :earth_domains, :cucumber, :rspec, :coverage, :rocco, :bueller, :watchr def initialize self.earth_domains = :all self.cucumber = true self.rspec = false self.coverage = true self.rocco = true self.bueller = true self.watchr = true yield self if block_given? end def ruby18? RUBY_VERSION =~ /^1\.8/ ? true : false end def rcov=(val) self.coverage = val end def gemname @gemname ||= File.basename(Dir.glob(File.join(Dir.pwd, '*.gemspec')).first, '.gemspec') end def git(cmd, dir = nil, &blk) full_cmd = '' full_cmd << "cd #{dir} && " if dir full_cmd << "unset GIT_DIR && unset GIT_INDEX_FILE && unset GIT_WORK_TREE && git #{cmd}" sh full_cmd, &blk end def define_tasks if coverage && ruby18? require 'rcov' elsif coverage task :simplecov do require 'simplecov' SimpleCov.start do add_filter '/spec/' add_filter '/features/' add_filter '/vendor/' end end end task :console do require 'sniff' cwd = Dir.pwd Sniff.init cwd, :earth => earth_domains require 'irb' ARGV.clear IRB.start end if rocco require 'rocco' require 'rocco/tasks' directory 'docs/' Rocco::make 'docs/', "lib/#{gemname}/impact_model.rb" task :google_analyzed_rocco => ['docs/', :rocco] do source = File.read "docs/lib/#{gemname}/impact_model.html" unless source =~ /_gaq/ source.sub! '', <<-HTML HTML File.open "docs/lib/#{gemname}/impact_model.html", 'w' do |f| f.puts source end end end desc 'Update rocco docs on gh-pages branch' task :pages => ['pages:sync', :google_analyzed_rocco] do rev = `git rev-parse --short HEAD`.strip html = File.read "docs/lib/#{gemname}/impact_model.html" puts `git checkout gh-pages` File.open 'impact_model.html', 'w' do |f| f.puts html end puts `git add *.html` puts "Commiting with message 'Rebuild pages from #{rev}'" git "commit -m 'Rebuild pages from #{rev}'" do |ok,res| if ok puts "Pushing to origin" git 'push origin gh-pages' unless ENV['NO_PUSH'] end end git 'checkout master' end namespace :pages do task 'sync' => ['.git/refs/heads/gh-pages'] do |f| git 'fetch origin' git 'checkout gh-pages' git 'reset --hard origin/gh-pages' git 'checkout master' end file '.git/refs/heads/gh-pages' do |f| unless File.exist? f.name git 'branch gh-pages' end end end CLOBBER.include 'docs/' end if cucumber require 'cucumber' require 'cucumber/rake/task' desc 'Run all cucumber tests' Cucumber::Rake::Task.new(:features) do |t| if ENV['CUCUMBER_FORMAT'] t.cucumber_opts = "features --format #{ENV['CUCUMBER_FORMAT']}" else t.cucumber_opts = 'features --format pretty' end end if coverage && ruby18? desc "Run cucumber tests with RCov" Cucumber::Rake::Task.new(:features_with_coverage) do |t| t.cucumber_opts = "features --format pretty" t.rcov = true t.rcov_opts = ['--exclude', 'features'] end elsif coverage task :features_with_coverage => [:simplecov, :features] end end if rspec require 'rspec/core/rake_task' desc "Run all examples" RSpec::Core::RakeTask.new('examples') do |c| if ENV['RSPEC_FORMAT'] c.rspec_opts = "-Ispec --format #{ENV['RSPEC_FORMAT']}" else c.rspec_opts = '-Ispec --format documentation' end end if coverage && ruby18? desc "Run specs with RCov" RSpec::Core::RakeTask.new(:examples_with_coverage) do |t| t.rcov = true t.rcov_opts = ['--exclude', 'spec'] t.rspec_opts = '-Ispec' end elsif coverage task :examples_with_coverage => [:simplecov, :examples] end end directory 'log/' test_tasks = ['log/'] test_tasks << :examples if rspec test_tasks << :features if cucumber unless test_tasks.empty? task :test => test_tasks task :default => :test end RDoc::Task.new do |rdoc| version = File.exist?('VERSION') ? File.read('VERSION') : "" rdoc.rdoc_dir = 'rdoc' rdoc.title = "#{gemname} #{version}" rdoc.rdoc_files.include('README*') rdoc.rdoc_files.include('lib/**/*.rb') end if bueller require 'bueller' Bueller::Tasks.new end if watchr namespace :watch do task :tests do require 'watchr' path = File.expand_path(Sniff.path(%w{lib sniff watcher.rb})) script = Watchr::Script.new Pathname(path) Watchr::Controller.new(script, Watchr.handler.new).run end end end end end end