require 'rubygems' require 'rake' require 'rake/testtask' require 'rake/rdoctask' require 'rake/packagetask' require 'rake/gempackagetask' require 'rake/contrib/rubyforgepublisher' require 'fileutils' require File.join(File.dirname(__FILE__), 'lib', 'action_web_service', 'version') PKG_BUILD = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : '' PKG_NAME = 'actionwebservice' PKG_VERSION = ActionWebService::VERSION::STRING + PKG_BUILD PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" PKG_DESTINATION = ENV["RAILS_PKG_DESTINATION"] || "../#{PKG_NAME}" RELEASE_NAME = "REL #{PKG_VERSION}" RUBY_FORGE_PROJECT = "aws" RUBY_FORGE_USER = "webster132" desc "Default Task" task :default => [ :test ] # Run the unit tests Rake::TestTask.new { |t| t.libs << "test" t.test_files = Dir['test/*_test.rb'] t.verbose = true } SCHEMA_PATH = File.join(File.dirname(__FILE__), *%w(test fixtures db_definitions)) desc 'Build the MySQL test database' task :build_database do %x( mysqladmin create activewebservice_unittest ) %x( mysql activewebservice_unittest < #{File.join(SCHEMA_PATH, 'mysql.sql')} ) end # Generate the RDoc documentation Rake::RDocTask.new { |rdoc| rdoc.rdoc_dir = 'doc' rdoc.title = "Action Web Service -- Web services for Action Pack" rdoc.options << '--line-numbers' << '--inline-source' << '--main README' << '--accessor class_inheritable_option=RW' rdoc.template = "#{ENV['template']}.rb" if ENV['template'] rdoc.rdoc_files.include('README') rdoc.rdoc_files.include('CHANGELOG') rdoc.rdoc_files.include('lib/action_web_service.rb') rdoc.rdoc_files.include('lib/action_web_service/*.rb') rdoc.rdoc_files.include('lib/action_web_service/api/*.rb') rdoc.rdoc_files.include('lib/action_web_service/client/*.rb') rdoc.rdoc_files.include('lib/action_web_service/container/*.rb') rdoc.rdoc_files.include('lib/action_web_service/dispatcher/*.rb') rdoc.rdoc_files.include('lib/action_web_service/protocol/*.rb') rdoc.rdoc_files.include('lib/action_web_service/support/*.rb') } # Create compressed packages spec = Gem::Specification.new do |s| s.platform = Gem::Platform::RUBY s.name = PKG_NAME s.summary = "Web service support for Action Pack." s.description = %q{Adds WSDL/SOAP and XML-RPC web service support to Action Pack} s.version = PKG_VERSION s.author = "Leon Breedt" s.email = "bitserf@gmail.com" s.rubyforge_project = "aws" s.homepage = "http://www.rubyonrails.org" s.add_dependency('actionpack', '= 1.11.2' + PKG_BUILD) s.add_dependency('activerecord', '= 1.13.2' + PKG_BUILD) s.has_rdoc = true s.requirements << 'none' s.require_path = 'lib' s.autorequire = 'action_web_service' s.files = [ "Rakefile", "setup.rb", "README", "TODO", "CHANGELOG", "MIT-LICENSE" ] s.files = s.files + Dir.glob( "examples/**/*" ).delete_if { |item| item.include?( "\.svn" ) } s.files = s.files + Dir.glob( "lib/**/*" ).delete_if { |item| item.include?( "\.svn" ) } s.files = s.files + Dir.glob( "test/**/*" ).delete_if { |item| item.include?( "\.svn" ) } end Rake::GemPackageTask.new(spec) do |p| p.gem_spec = spec p.need_tar = true p.need_zip = true end # Publish beta gem desc "Publish the API documentation" task :pgem => [:package] do Rake::SshFilePublisher.new("davidhh@wrath.rubyonrails.org", "public_html/gems/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload `ssh davidhh@wrath.rubyonrails.org './gemupdate.sh'` end # Publish documentation desc "Publish the API documentation" task :pdoc => [:rdoc] do Rake::SshDirPublisher.new("davidhh@wrath.rubyonrails.org", "public_html/aws", "doc").upload end def each_source_file(*args) prefix, includes, excludes, open_file = args prefix ||= File.dirname(__FILE__) open_file = true if open_file.nil? includes ||= %w[lib\/action_web_service\.rb$ lib\/action_web_service\/.*\.rb$] excludes ||= %w[lib\/action_web_service\/vendor] Find.find(prefix) do |file_name| next if file_name =~ /\.svn/ file_name.gsub!(/^\.\//, '') continue = false includes.each do |inc| if file_name.match(/#{inc}/) continue = true break end end next unless continue excludes.each do |exc| if file_name.match(/#{exc}/) continue = false break end end next unless continue if open_file File.open(file_name) do |f| yield file_name, f end else yield file_name end end end desc "Count lines of the AWS source code" task :lines do total_lines = total_loc = 0 puts "Per File:" each_source_file do |file_name, f| file_lines = file_loc = 0 while line = f.gets file_lines += 1 next if line =~ /^\s*$/ next if line =~ /^\s*#/ file_loc += 1 end puts " #{file_name}: Lines #{file_lines}, LOC #{file_loc}" total_lines += file_lines total_loc += file_loc end puts "Total:" puts " Lines #{total_lines}, LOC #{total_loc}" end desc "Publish the release files to RubyForge." task :release => [:package] do files = ["gem", "tgz", "zip"].map { |ext| "pkg/#{PKG_FILE_NAME}.#{ext}" } if RUBY_FORGE_PROJECT then require 'net/http' require 'open-uri' project_uri = "http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/" project_data = open(project_uri) { |data| data.read } group_id = project_data[/[?&]group_id=(\d+)/, 1] raise "Couldn't get group id" unless group_id # This echos password to shell which is a bit sucky if ENV["RUBY_FORGE_PASSWORD"] password = ENV["RUBY_FORGE_PASSWORD"] else print "#{RUBY_FORGE_USER}@rubyforge.org's password: " password = STDIN.gets.chomp end login_response = Net::HTTP.start("rubyforge.org", 80) do |http| data = [ "login=1", "form_loginname=#{RUBY_FORGE_USER}", "form_pw=#{password}" ].join("&") http.post("/account/login.php", data) end cookie = login_response["set-cookie"] raise "Login failed" unless cookie headers = { "Cookie" => cookie } release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}" release_data = open(release_uri, headers) { |data| data.read } package_id = release_data[/[?&]package_id=(\d+)/, 1] raise "Couldn't get package id" unless package_id first_file = true release_id = "" files.each do |filename| basename = File.basename(filename) file_ext = File.extname(filename) file_data = File.open(filename, "rb") { |file| file.read } puts "Releasing #{basename}..." release_response = Net::HTTP.start("rubyforge.org", 80) do |http| release_date = Time.now.strftime("%Y-%m-%d %H:%M") type_map = { ".zip" => "3000", ".tgz" => "3110", ".gz" => "3110", ".gem" => "1400" }; type_map.default = "9999" type = type_map[file_ext] boundary = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor" query_hash = if first_file then { "group_id" => group_id, "package_id" => package_id, "release_name" => RELEASE_NAME, "release_date" => release_date, "type_id" => type, "processor_id" => "8000", # Any "release_notes" => "", "release_changes" => "", "preformatted" => "1", "submit" => "1" } else { "group_id" => group_id, "release_id" => release_id, "package_id" => package_id, "step2" => "1", "type_id" => type, "processor_id" => "8000", # Any "submit" => "Add This File" } end query = "?" + query_hash.map do |(name, value)| [name, URI.encode(value)].join("=") end.join("&") data = [ "--" + boundary, "Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"", "Content-Type: application/octet-stream", "Content-Transfer-Encoding: binary", "", file_data, "" ].join("\x0D\x0A") release_headers = headers.merge( "Content-Type" => "multipart/form-data; boundary=#{boundary}" ) target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php" http.post(target + query, data, release_headers) end if first_file then release_id = release_response.body[/release_id=(\d+)/, 1] raise("Couldn't get release id") unless release_id end first_file = false end end end