Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

file 130 lines (107 sloc) 3.283 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
require 'rubygems'
require 'rake'
require 'cucumber/rake/task'
require 'date'

TEST_PROJECT = 'test_project'
SUSPENDERS_GEM_VERSION = '0.0.1'

#############################################################################
#
# Testing functions
#
#############################################################################

Cucumber::Rake::Task.new

namespace :test do
  desc "A full suspenders app's test suite"
  task :full => ['generate:suspenders', 'generate:finish', 'cucumber', 'destroy:suspenders']
end

namespace :generate do
  desc 'Suspend a new project'
  task :suspenders do
    sh './bin/suspenders', 'create', TEST_PROJECT
  end

  desc 'Finishing touches'
  task :finish do
    open(File.join(TEST_PROJECT, 'config', 'environments', 'cucumber.rb'), 'a') do |f|
      f.puts "config.action_mailer.default_url_options = { :host => 'localhost:3000' }"
    end

    routes_file = IO.read(File.join(TEST_PROJECT, 'config', 'routes.rb')).split("\n")
    routes_file = [routes_file[0]] + [%{map.root :controller => 'clearance/sessions', :action => 'new'}] + routes_file[1..-1]
    open(File.join(TEST_PROJECT, 'config', 'routes.rb'), 'w') do |f|
      f.puts routes_file.join("\n")
    end
  end
end

namespace :destroy do
  desc 'Remove a suspended project'
  task :suspenders do
    FileUtils.rm_rf TEST_PROJECT
  end
end

desc 'Run the test suite'
task :default => ['test:full']

#############################################################################
#
# Helper functions
#
#############################################################################

def name
  @name ||= Dir['*.gemspec'].first.split('.').first
end

def version
  SUSPENDERS_GEM_VERSION
end

def date
  Date.today.to_s
end

def gemspec_file
  "#{name}.gemspec"
end

def gem_file
  "#{name}-#{version}.gem"
end

def replace_header(head, header_name)
  head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{$1}#{send(header_name)}'"}
end

#############################################################################
#
# Packaging tasks
#
#############################################################################

task :release => :build do
  unless `git branch` =~ /^\* master$/
    puts "You must be on the master branch to release!"
    exit!
  end
  sh "git commit --allow-empty -a -m 'Release #{version}'"
  sh "git tag v#{version}"
  sh "git push origin master"
  sh "git push --tags"
  sh "gem push pkg/#{name}-#{version}.gem"
end

task :build => :gemspec do
  sh "mkdir -p pkg"
  sh "gem build #{gemspec_file}"
  sh "mv #{gem_file} pkg"
end

task :gemspec do
  # read spec file and split out manifest section
  spec = File.read(gemspec_file)
  head, manifest, tail = spec.split(" # = MANIFEST =\n")

  # replace name version and date
  replace_header(head, :name)
  replace_header(head, :version)
  replace_header(head, :date)

  # determine file list from git ls-files
  files = `git ls-files`.
    split("\n").
    sort.
    reject { |file| file =~ /^\./ }.
    reject { |file| file =~ /^(rdoc|pkg)/ }.
    map { |file| " #{file}" }.
    join("\n")

  # piece file back together and write
  manifest = " s.files = %w[\n#{files}\n ]\n"
  spec = [head, manifest, tail].join(" # = MANIFEST =\n")
  File.open(gemspec_file, 'w') { |io| io.write(spec) }
  puts "Updated #{gemspec_file}"
end
Something went wrong with that request. Please try again.