matschaffer/knife-solo

View on GitHub
Rakefile

Summary

Maintainability
Test Coverage
require 'bundler/gem_tasks'
require 'rake/testtask'
require File.join(File.dirname(__FILE__), 'lib', 'knife-solo', 'info')

MANIFEST_IGNORES = %w[
    .travis.yml
    .gitignore
    .gitmodules
    Gemfile
    Gemfile.lock
    Manifest.txt
    README.md
    knife-solo.gemspec
    script/newb
    script/test
  ]

namespace :manifest do
  desc 'Checks for outstanding changes to the manifest'
  task :verify => :update do
    changes = `git status --porcelain Manifest.txt`
    raise "Manifest has not been updated" unless changes.empty?
  end

  desc 'Updates Manifest.txt with a list of files from git'
  task :update do
    git_files       = `git ls-files`.split("\n")
    submodule_files = `git submodule foreach -q 'for f in $(git ls-files); do echo $path/$f; done'`.split("\n")

    File.open('Manifest.txt', 'w') do |f|
      f.puts((git_files + submodule_files - MANIFEST_IGNORES).join("\n"))
    end
  end
end

desc 'Alias to manifest:update'
task :manifest => 'manifest:update'

# Returns the parsed RDoc for a single file as HTML
# Somewhat gnarly, but does the job.
def parsed_rdoc file
  options = RDoc::Options.new
  options.template_dir = options.template_dir_for 'darkfish'

  rdoc = RDoc::RDoc.current = RDoc::RDoc.new
  rdoc.store = RDoc::Store.new
  rdoc.options = options
  rdoc.generator = RDoc::Generator::Darkfish.new(rdoc.store, options)
  parsed = rdoc.parse_files([file])
  parsed.first.description
end

desc 'Renerates gh-pages from project'
task 'gh-pages' do
  require 'tmpdir'
  gem 'rdoc'; require 'rdoc/rdoc'

  Dir.mktmpdir do |clone|
    sh "git clone -b gh-pages git@github.com:matschaffer/knife-solo.git #{clone}"
    File.open(clone + "/index.html", 'w') do |f|
      f.puts '---'
      f.puts 'layout: default'
      f.puts '---'
      f.puts parsed_rdoc("README.rdoc")
    end
    rev = `git rev-parse HEAD`[0..7]
    Dir.chdir(clone) do
      sh "git commit --allow-empty -m 'Update index for v#{KnifeSolo.version} from README.rdoc rev #{rev}' index.html"
      sh "git push origin gh-pages"
    end
  end
end

def test_task(name, glob)
  Rake::TestTask.new(name) do |t|
    t.libs << 'test'
    t.warning = false
    t.test_files = FileList[glob]
  end
end

namespace :test do
  test_task(:performance, 'test/performance/*_test.rb')
  test_task(:integration, 'test/integration/*_test.rb')
  test_task(:units,       'test/*_test.rb')

  desc 'Run both unit and integration tests'
  task :all => [:units, :integration]
end

desc 'Alias for test:units'
task :test => 'test:units'

task :default => :test
task :default => 'manifest:verify'

task :release => :manifest
task :release => 'gh-pages' unless KnifeSolo.prerelease?