require 'rake/testtask'
require 'rake/rdoctask'
require 'rake/gempackagetask'
require File.join(File.dirname(__FILE__), 'lib', 'active_support', 'version')
PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
PKG_NAME = 'activesupport'
PKG_VERSION = ActiveSupport::VERSION::STRING + PKG_BUILD
PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
RELEASE_NAME = "REL #{PKG_VERSION}"
RUBY_FORGE_PROJECT = "activesupport"
RUBY_FORGE_USER = "webster132"
task :default => :test
Rake::TestTask.new do |t|
t.libs << 'test'
t.pattern = 'test/**/*_test.rb'
t.verbose = true
t.warning = true
end
namespace :test do
Rake::TestTask.new(:isolated) do |t|
t.pattern = 'test/ts_isolated.rb'
end
end
# Create compressed packages
dist_dirs = [ "lib", "test"]
# Genereate the RDoc documentation
Rake::RDocTask.new { |rdoc|
rdoc.rdoc_dir = 'doc'
rdoc.title = "Active Support -- Utility classes and standard library extensions from Rails"
rdoc.options << '--line-numbers' << '--inline-source'
rdoc.options << '--charset' << 'utf-8'
rdoc.template = ENV['template'] ? "#{ENV['template']}.rb" : '../doc/template/horo'
rdoc.rdoc_files.include('README', 'CHANGELOG')
rdoc.rdoc_files.include('lib/active_support.rb')
rdoc.rdoc_files.include('lib/active_support/**/*.rb')
rdoc.rdoc_files.exclude('lib/active_support/vendor/*')
}
spec = eval(File.read('activesupport.gemspec'))
Rake::GemPackageTask.new(spec) do |p|
p.gem_spec = spec
end
desc "Publish the beta gem"
task :pgem => [:package] do
require 'rake/contrib/sshpublisher'
Rake::SshFilePublisher.new("gems.rubyonrails.org", "/u/sites/gems/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload
`ssh gems.rubyonrails.org '/u/sites/gems/gemupdate.sh'`
end
desc "Publish the API documentation"
task :pdoc => [:rdoc] do
require 'rake/contrib/sshpublisher'
Rake::SshDirPublisher.new("wrath.rubyonrails.org", "public_html/as", "doc").upload
end
desc "Publish the release files to RubyForge."
task :release => [ :package ] do
require 'rubyforge'
require 'rake/contrib/rubyforgepublisher'
packages = %w( gem tgz zip ).collect{ |ext| "pkg/#{PKG_NAME}-#{PKG_VERSION}.#{ext}" }
rubyforge = RubyForge.new
rubyforge.login
rubyforge.add_release(PKG_NAME, PKG_NAME, "REL #{PKG_VERSION}", *packages)
end
$LOAD_PATH.unshift "#{File.dirname(__FILE__)}/lib"
require 'active_support/values/time_zone'
namespace :tzinfo do
desc "Update bundled tzinfo gem. Only copies the subset of classes and definitions required to support Rails time zone features."
task :update => ['tzinfo:copy_classes', 'tzinfo:copy_definitions'] do
Rake::Task['tzinfo:cleanup_tmp'].invoke
puts <<-EOV
*** FINAL TZINFO BUNDLING STEPS ***
1. Update TZInfo version in lib/active_support/vendor.rb
2. gem uninstall tzinfo on local system before running tests, to ensure tests are running against bundled version
If a test fails because a particular zone can't be found, it's likely because the TZInfo identifier in the
ActiveSupport::TimeZone::MAPPING hash is referencing a linked timezone instead of referencing the timezone directly.
In this case, just change the MAPPING value to the correct identifier, and unpack TZInfo again.
EOV
end
task :unpack_gem do
mkdir_p "tmp"
cd "tmp"
sh "gem unpack --version #{ENV['VERSION'] || "'> 0'"} tzinfo"
cd ".."
end
task :copy_classes => :unpack_gem do
mkdir_p "#{destination_path}/tzinfo"
cp "#{tmp_path}/lib/tzinfo.rb", destination_path
comment_requires_for_excluded_classes!('tzinfo.rb')
files = FileList["#{tmp_path}/lib/tzinfo/*.rb"]
files.each do |file|
filename = File.basename(file)
unless excluded_classes.include? filename.sub(/.rb$/, '')
cp "#{tmp_path}/lib/tzinfo/#{filename}", "#{destination_path}/tzinfo"
comment_requires_for_excluded_classes!("tzinfo/#{filename}")
end
end
end
task :copy_definitions => :unpack_gem do
definitions_path = "#{destination_path}/tzinfo/definitions/"
mkdir_p definitions_path
ActiveSupport::TimeZone::MAPPING.values.each do |zone|
subdir = nil
if /\// === zone
subdir = zone.sub(/\w+$/, '')
mkdir_p "#{definitions_path}/#{subdir}"
end
cp "#{tmp_path}/lib/tzinfo/definitions/#{zone}.rb", "#{definitions_path}/#{subdir}"
end
end
task :cleanup_tmp do
rm_rf "tmp"
end
def comment_requires_for_excluded_classes!(file)
lines = open("#{destination_path}/#{file}") {|f| f.readlines}
updated = false
new_lines = []
lines.each do |line|
if Regexp.new("require 'tzinfo/(#{excluded_classes.join('|')})'") === line
updated = true
new_lines << "# #{line}"
else
new_lines << line
end
end
if updated
open("#{destination_path}/#{file}", "w") {|f| f.write(new_lines.join)}
end
end
def version
ENV['VERSION'] ||= get_unpacked_version
end
def get_unpacked_version
m = (FileList["tmp/tzinfo-*"].to_s.match /\d+\.\d+\.\d+/)
m ? m[0] : raise(LoadError, "TZInfo gem must be installed locally. `gem install tzinfo` and try again")
end
def tmp_path
"tmp/tzinfo-#{version}"
end
def destination_path
"lib/active_support/vendor/tzinfo-#{version}"
end
def excluded_classes
%w(country country_index_definition country_info country_timezone timezone_index_definition timezone_proxy tzdataparser)
end
end