Chris@0: require 'rubygems' Chris@0: Chris@0: Gem::manage_gems Chris@0: Chris@0: require 'rake/rdoctask' Chris@0: require 'rake/packagetask' Chris@0: require 'rake/gempackagetask' Chris@0: require 'rake/testtask' Chris@0: require 'rake/contrib/rubyforgepublisher' Chris@0: Chris@0: PKG_NAME = 'acts_as_versioned' Chris@0: PKG_VERSION = '0.3.1' Chris@0: PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" Chris@0: PROD_HOST = "technoweenie@bidwell.textdrive.com" Chris@0: RUBY_FORGE_PROJECT = 'ar-versioned' Chris@0: RUBY_FORGE_USER = 'technoweenie' Chris@0: Chris@0: desc 'Default: run unit tests.' Chris@0: task :default => :test Chris@0: Chris@0: desc 'Test the calculations plugin.' Chris@0: Rake::TestTask.new(:test) do |t| Chris@0: t.libs << 'lib' Chris@0: t.pattern = 'test/**/*_test.rb' Chris@0: t.verbose = true Chris@0: end Chris@0: Chris@0: desc 'Generate documentation for the calculations plugin.' Chris@0: Rake::RDocTask.new(:rdoc) do |rdoc| Chris@0: rdoc.rdoc_dir = 'rdoc' Chris@0: rdoc.title = "#{PKG_NAME} -- Simple versioning with active record models" Chris@0: rdoc.options << '--line-numbers --inline-source' Chris@0: rdoc.rdoc_files.include('README', 'CHANGELOG', 'RUNNING_UNIT_TESTS') Chris@0: rdoc.rdoc_files.include('lib/**/*.rb') Chris@0: end Chris@0: Chris@0: spec = Gem::Specification.new do |s| Chris@0: s.name = PKG_NAME Chris@0: s.version = PKG_VERSION Chris@0: s.platform = Gem::Platform::RUBY Chris@0: s.summary = "Simple versioning with active record models" Chris@0: s.files = FileList["{lib,test}/**/*"].to_a + %w(README MIT-LICENSE CHANGELOG RUNNING_UNIT_TESTS) Chris@0: s.files.delete "acts_as_versioned_plugin.sqlite.db" Chris@0: s.files.delete "acts_as_versioned_plugin.sqlite3.db" Chris@0: s.files.delete "test/debug.log" Chris@0: s.require_path = 'lib' Chris@0: s.autorequire = 'acts_as_versioned' Chris@0: s.has_rdoc = true Chris@0: s.test_files = Dir['test/**/*_test.rb'] Chris@0: s.add_dependency 'activerecord', '>= 1.10.1' Chris@0: s.add_dependency 'activesupport', '>= 1.1.1' Chris@0: s.author = "Rick Olson" Chris@0: s.email = "technoweenie@gmail.com" Chris@0: s.homepage = "http://techno-weenie.net" Chris@0: end Chris@0: Chris@0: Rake::GemPackageTask.new(spec) do |pkg| Chris@0: pkg.need_tar = true Chris@0: end Chris@0: Chris@0: desc "Publish the API documentation" Chris@0: task :pdoc => [:rdoc] do Chris@0: Rake::RubyForgePublisher.new(RUBY_FORGE_PROJECT, RUBY_FORGE_USER).upload Chris@0: end Chris@0: Chris@0: desc 'Publish the gem and API docs' Chris@0: task :publish => [:pdoc, :rubyforge_upload] Chris@0: Chris@0: desc "Publish the release files to RubyForge." Chris@0: task :rubyforge_upload => :package do Chris@0: files = %w(gem tgz).map { |ext| "pkg/#{PKG_FILE_NAME}.#{ext}" } Chris@0: Chris@0: if RUBY_FORGE_PROJECT then Chris@0: require 'net/http' Chris@0: require 'open-uri' Chris@0: Chris@0: project_uri = "http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/" Chris@0: project_data = open(project_uri) { |data| data.read } Chris@0: group_id = project_data[/[?&]group_id=(\d+)/, 1] Chris@0: raise "Couldn't get group id" unless group_id Chris@0: Chris@0: # This echos password to shell which is a bit sucky Chris@0: if ENV["RUBY_FORGE_PASSWORD"] Chris@0: password = ENV["RUBY_FORGE_PASSWORD"] Chris@0: else Chris@0: print "#{RUBY_FORGE_USER}@rubyforge.org's password: " Chris@0: password = STDIN.gets.chomp Chris@0: end Chris@0: Chris@0: login_response = Net::HTTP.start("rubyforge.org", 80) do |http| Chris@0: data = [ Chris@0: "login=1", Chris@0: "form_loginname=#{RUBY_FORGE_USER}", Chris@0: "form_pw=#{password}" Chris@0: ].join("&") Chris@0: http.post("/account/login.php", data) Chris@0: end Chris@0: Chris@0: cookie = login_response["set-cookie"] Chris@0: raise "Login failed" unless cookie Chris@0: headers = { "Cookie" => cookie } Chris@0: Chris@0: release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}" Chris@0: release_data = open(release_uri, headers) { |data| data.read } Chris@0: package_id = release_data[/[?&]package_id=(\d+)/, 1] Chris@0: raise "Couldn't get package id" unless package_id Chris@0: Chris@0: first_file = true Chris@0: release_id = "" Chris@0: Chris@0: files.each do |filename| Chris@0: basename = File.basename(filename) Chris@0: file_ext = File.extname(filename) Chris@0: file_data = File.open(filename, "rb") { |file| file.read } Chris@0: Chris@0: puts "Releasing #{basename}..." Chris@0: Chris@0: release_response = Net::HTTP.start("rubyforge.org", 80) do |http| Chris@0: release_date = Time.now.strftime("%Y-%m-%d %H:%M") Chris@0: type_map = { Chris@0: ".zip" => "3000", Chris@0: ".tgz" => "3110", Chris@0: ".gz" => "3110", Chris@0: ".gem" => "1400" Chris@0: }; type_map.default = "9999" Chris@0: type = type_map[file_ext] Chris@0: boundary = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor" Chris@0: Chris@0: query_hash = if first_file then Chris@0: { Chris@0: "group_id" => group_id, Chris@0: "package_id" => package_id, Chris@0: "release_name" => PKG_FILE_NAME, Chris@0: "release_date" => release_date, Chris@0: "type_id" => type, Chris@0: "processor_id" => "8000", # Any Chris@0: "release_notes" => "", Chris@0: "release_changes" => "", Chris@0: "preformatted" => "1", Chris@0: "submit" => "1" Chris@0: } Chris@0: else Chris@0: { Chris@0: "group_id" => group_id, Chris@0: "release_id" => release_id, Chris@0: "package_id" => package_id, Chris@0: "step2" => "1", Chris@0: "type_id" => type, Chris@0: "processor_id" => "8000", # Any Chris@0: "submit" => "Add This File" Chris@0: } Chris@0: end Chris@0: Chris@0: query = "?" + query_hash.map do |(name, value)| Chris@0: [name, URI.encode(value)].join("=") Chris@0: end.join("&") Chris@0: Chris@0: data = [ Chris@0: "--" + boundary, Chris@0: "Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"", Chris@0: "Content-Type: application/octet-stream", Chris@0: "Content-Transfer-Encoding: binary", Chris@0: "", file_data, "" Chris@0: ].join("\x0D\x0A") Chris@0: Chris@0: release_headers = headers.merge( Chris@0: "Content-Type" => "multipart/form-data; boundary=#{boundary}" Chris@0: ) Chris@0: Chris@0: target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php" Chris@0: http.post(target + query, data, release_headers) Chris@0: end Chris@0: Chris@0: if first_file then Chris@0: release_id = release_response.body[/release_id=(\d+)/, 1] Chris@0: raise("Couldn't get release id") unless release_id Chris@0: end Chris@0: Chris@0: first_file = false Chris@0: end Chris@0: end Chris@0: end