require 'rubygems' load 'test/tasks.rake' desc 'Default: run unit tests.' task :default => :test namespace :gem do desc "Sets the version and date of the scoped_search gem. Requires the VERSION environment variable." task :version => [:manifest] do require 'date' new_version = ENV['VERSION'] raise "VERSION is required" unless /\d+(\.\d+)*/ =~ new_version spec_file = Dir['*.gemspec'].first spec = File.read(spec_file) spec.gsub!(/^(\s*s\.version\s*=\s*)('|")(.+)('|")(\s*)$/) { "#{$1}'#{new_version}'#{$5}" } spec.gsub!(/^(\s*s\.date\s*=\s*)('|")(.+)('|")(\s*)$/) { "#{$1}'#{Date.today.strftime('%Y-%m-%d')}'#{$5}" } File.open(spec_file, 'w') { |f| f << spec } end task :tag => [:version] do new_version = ENV['VERSION'] raise "VERSION is required" unless /\d+(\.\d+)*/ =~ new_version sh "git add scoped_search.gemspec .manifest" sh "git commit -m \"Set gem version to #{new_version}\"" sh "git push origin" sh "git tag -a \"scoped_search-#{new_version}\" -m \"Tagged version #{new_version}\"" sh "git push --tags" end desc "Builds a ruby gem for scoped_search" task :build => [:manifest] do system %[gem build scoped_search.gemspec] end desc %{Update ".manifest" with the latest list of project filenames. Respect\ .gitignore by excluding everything that git ignores. Update `files` and\ `test_files` arrays in "*.gemspec" file if it's present.} task :manifest do list = Dir['**/*'].sort spec_file = Dir['*.gemspec'].first list -= [spec_file] if spec_file File.read('.gitignore').each_line do |glob| glob = glob.chomp.sub(/^\//, '') list -= Dir[glob] list -= Dir["#{glob}/**/*"] if File.directory?(glob) and !File.symlink?(glob) puts "excluding #{glob}" end if spec_file spec = File.read spec_file spec.gsub! /^(\s* s.(test_)?files \s* = \s* )( \[ [^\]]* \] | %w\( [^)]* \) )/mx do assignment = $1 bunch = $2 ? list.grep(/^test.*_test\.rb$/) : list '%s%%w(%s)' % [assignment, bunch.join(' ')] end File.open(spec_file, 'w') {|f| f << spec } end File.open('.manifest', 'w') {|f| f << list.join("\n") } end end