require 'rubygems' #Gem::manage_gems require 'rake/rdoctask' require 'rake/packagetask' require 'rake/gempackagetask' require 'rake/testtask' require 'rake/contrib/rubyforgepublisher' PKG_NAME = 'sentry' PKG_VERSION = '0.3.1' PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}" PROD_HOST = "technoweenie@bidwell.textdrive.com" RUBY_FORGE_PROJECT = 'sentry' RUBY_FORGE_USER = 'technoweenie' task :default => [:test] Rake::TestTask.new("test") do |t| t.libs << "test" t.pattern = "test/*_test.rb" t.verbose = true end load 'tasks/sentry.rake' Rake::RDocTask.new do |rdoc| rdoc.rdoc_dir = 'doc' rdoc.title = "#{PKG_NAME} -- painless encryption for Active Record" rdoc.options << '--line-numbers --inline-source --accessor cattr_accessor=object' rdoc.template = "#{ENV['template']}.rb" if ENV['template'] rdoc.rdoc_files.include('README', 'CHANGELOG', 'RUNNING_UNIT_TESTS') rdoc.rdoc_files.include('lib/**/*.rb') end spec = Gem::Specification.new do |s| s.name = PKG_NAME s.version = PKG_VERSION s.platform = Gem::Platform::RUBY s.summary = "Sentry provides painless encryption services with a wrapper around some OpenSSL classes" s.files = FileList["{lib,test}/**/*"].to_a + %w(README MIT-LICENSE CHANGELOG RUNNING_UNIT_TESTS) s.files.delete "test/sentry_plugin.sqlite.db" s.files.delete "test/sentry_plugin.sqlite3.db" s.require_path = 'lib' s.autorequire = 'sentry' s.has_rdoc = true s.test_file = 'test/tests.rb' s.author = "Rick Olson" s.email = "technoweenie@gmail.com" s.homepage = "http://techno-weenie.net" end Rake::GemPackageTask.new(spec) do |pkg| pkg.need_tar = true end desc "Publish the API documentation" task :pdoc => [:rdoc] do Rake::RubyForgePublisher.new(RUBY_FORGE_PROJECT, RUBY_FORGE_USER).upload end desc 'Publish the gem and API docs' task :publish => [:pdoc, :rubyforge_upload] desc "Publish the release files to RubyForge." task :rubyforge_upload => :package do files = %w(gem tgz).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" => PKG_FILE_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 begin require 'jeweler' Jeweler::Tasks.new do |gemspec| gemspec.name = "sentry" gemspec.summary = "Asymmetric encryption of active record fields" gemspec.description = "Asymmetric encryption of active record fields" gemspec.email = "commoncode@pivotallabs.com" gemspec.homepage = "http://github.com/pivotal/sentry" gemspec.authors = ["John Pelly", "David Stevenson"] end rescue LoadError puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com" end