Skip to content
This repository
Fetching contributors…

Cannot retrieve contributors at this time

file 168 lines (139 sloc) 4.773 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 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
require 'rubygems'
require 'rake/clean'
require 'fileutils'

task :default => :test

# SPECS ===============================================================

desc 'Run specs with story style output'
task :spec do
  pattern = ENV['TEST'] || '.*'
  sh "specrb --testcase '#{pattern}' --specdox -Ilib:test test/*_test.rb"
end

desc 'Run specs with unit test style output'
task :test do |t|
  sh "specrb -Ilib:test test/*_test.rb"
end

desc 'Run compatibility specs'
task :compat do |t|
  pattern = ENV['TEST'] || '.*'
  sh "specrb --testcase '#{pattern}' -Ilib:test compat/*_test.rb"
end

# PACKAGING ============================================================

# Load the gemspec using the same limitations as github
def spec
  @spec ||=
    begin
      require 'rubygems/specification'
      data = File.read('sinatra.gemspec')
      spec = nil
      Thread.new { spec = eval("$SAFE = 3\n#{data}") }.join
      spec
    end
end

def package(ext='')
  "dist/sinatra-#{spec.version}" + ext
end

desc 'Build packages'
task :package => %w[.gem .tar.gz].map {|e| package(e)}

desc 'Build and install as local gem'
task :install => package('.gem') do
  sh "gem install #{package('.gem')}"
end

directory 'dist/'

file package('.gem') => %w[dist/ sinatra.gemspec] + spec.files do |f|
  sh "gem build sinatra.gemspec"
  mv File.basename(f.name), f.name
end

file package('.tar.gz') => %w[dist/] + spec.files do |f|
  sh "git archive --format=tar HEAD | gzip > #{f.name}"
end

# Rubyforge Release / Publish Tasks ==================================

desc 'Publish website to rubyforge'
task 'publish:doc' => 'doc/api/index.html' do
  sh 'scp -rp doc/* rubyforge.org:/var/www/gforge-projects/sinatra/'
end

task 'publish:gem' => [package('.gem'), package('.tar.gz')] do |t|
  sh <<-end
rubyforge add_release sinatra sinatra #{spec.version} #{package('.gem')} &&
rubyforge add_file sinatra sinatra #{spec.version} #{package('.tar.gz')}
end
end

# Website ============================================================
# Building docs requires HAML and the hanna gem:
# gem install mislav-hanna --source=http://gems.github.com

task 'doc' => ['doc:api','doc:site']

desc 'Generate Hanna RDoc under doc/api'
task 'doc:api' => ['doc/api/index.html']

file 'doc/api/index.html' => FileList['lib/**/*.rb','README.rdoc'] do |f|
  rb_files = f.prerequisites
  sh((<<-end).gsub(/\s+/, ' '))
hanna --charset utf8 \
--fmt html \
--inline-source \
--line-numbers \
--main README.rdoc \
--op doc/api \
--title 'Sinatra API Documentation' \
#{rb_files.join(' ')}
end
end
CLEAN.include 'doc/api'

def rdoc_to_html(file_name)
  require 'rdoc/markup/to_html'
  rdoc = RDoc::Markup::ToHtml.new
  rdoc.convert(File.read(file_name))
end

def haml(locals={})
  require 'haml'
  template = File.read('doc/template.haml')
  haml = Haml::Engine.new(template, :format => :html4, :attr_wrapper => '"')
  haml.render(Object.new, locals)
end

desc 'Build website HTML and stuff'
task 'doc:site' => ['doc/index.html', 'doc/book.html']

file 'doc/index.html' => %w[README.rdoc doc/template.haml] do |file|
  File.open(file.name, 'w') do |file|
    file << haml(:title => 'Sinatra', :content => rdoc_to_html('README.rdoc'))
  end
end
CLEAN.include 'doc/index.html'

file 'doc/book.html' => ['book/output/sinatra-book.html'] do |file|
  File.open(file.name, 'w') do |file|
    book_content = File.read('book/output/sinatra-book.html')
    file << haml(:title => 'Sinatra Book', :content => book_content)
  end
end
CLEAN.include 'doc/book.html'

file 'book/output/sinatra-book.html' => FileList['book/**'] do |f|
  unless File.directory?('book')
    sh 'git clone git://github.com/cschneid/sinatra-book.git book'
  end
  sh((<<-SH).strip.gsub(/\s+/, ' '))
cd book &&
git fetch origin &&
git rebase origin/master &&
thor book:build
SH
end
CLEAN.include 'book/output/sinatra-book.html'

desc 'Build the Sinatra book'
task 'doc:book' => ['book/output/sinatra-book.html']

# Gemspec Helpers ====================================================

file 'sinatra.gemspec' => FileList['{lib,test,images}/**','Rakefile'] do |f|
  # read spec file and split out manifest section
  spec = File.read(f.name)
  parts = spec.split(" # = MANIFEST =\n")
  fail 'bad spec' if parts.length != 3
  # determine file list from git ls-files
  files = `git ls-files`.
    split("\n").
    sort.
    reject{ |file| file =~ /^\./ }.
    reject { |file| file =~ /^doc/ }.
    map{ |file| " #{file}" }.
    join("\n")
  # piece file back together and write...
  parts[1] = " s.files = %w[\n#{files}\n ]\n"
  spec = parts.join(" # = MANIFEST =\n")
  File.open(f.name, 'w') { |io| io.write(spec) }
  puts "updated #{f.name}"
end
Something went wrong with that request. Please try again.