aboutsummaryrefslogblamecommitdiffstats
path: root/actionwebservice/Rakefile
blob: a54d72069f6feb895c68e4171822fb2b0f8270d9 (plain) (tree)
1
2
3
4
5
6
7
8
9
10









                                                              
                                  
                                   

                                                                  
 




                                    






                          
                                                                 






                                 
                                                                      
                                                                                                       
                                                            
                                   
                                      



                                                               
                                                                  
                                                                   
                                                                 
                                                                












                                                                                   

                                           
 


                                                          



                          
                                      
 
                                                                                    










                                                                                               




                                                                                                                          

   


                                    
                                                                                           


   



                                                    
                                                                                      
                                                        



























                                                    
                                         

















                                                               


















































































































                                                                                        
require 'rubygems'
require 'rake'
require 'rake/testtask'
require 'rake/rdoctask'
require 'rake/packagetask'
require 'rake/gempackagetask'
require 'rake/contrib/rubyforgepublisher'
require 'fileutils'

PKG_BUILD     = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
PKG_NAME      = 'actionwebservice'
PKG_VERSION   = '0.6.2' + 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'] + Dir['test/ws/*_test.rb']
  t.verbose = true
}


# 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.7.0' + PKG_BUILD)
  s.add_dependency('activerecord', '= 1.9.1' + PKG_BUILD)
  s.add_dependency('activesupport', '= 1.0.3' + 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@comox.textdrive.com", "public_html/gems/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload
  `ssh davidhh@comox.textdrive.com './gemupdate.sh'`
end

# Publish documentation
desc "Publish the API documentation"
task :pdoc => [:rdoc] do 
  Rake::SshDirPublisher.new("davidhh@comox.textdrive.com", "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