Chris@0
|
1 require 'rubygems'
|
Chris@0
|
2
|
Chris@0
|
3 Gem::manage_gems
|
Chris@0
|
4
|
Chris@0
|
5 require 'rake/rdoctask'
|
Chris@0
|
6 require 'rake/packagetask'
|
Chris@0
|
7 require 'rake/gempackagetask'
|
Chris@0
|
8 require 'rake/testtask'
|
Chris@0
|
9 require 'rake/contrib/rubyforgepublisher'
|
Chris@0
|
10
|
Chris@0
|
11 PKG_NAME = 'acts_as_versioned'
|
Chris@0
|
12 PKG_VERSION = '0.3.1'
|
Chris@0
|
13 PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
|
Chris@0
|
14 PROD_HOST = "technoweenie@bidwell.textdrive.com"
|
Chris@0
|
15 RUBY_FORGE_PROJECT = 'ar-versioned'
|
Chris@0
|
16 RUBY_FORGE_USER = 'technoweenie'
|
Chris@0
|
17
|
Chris@0
|
18 desc 'Default: run unit tests.'
|
Chris@0
|
19 task :default => :test
|
Chris@0
|
20
|
Chris@0
|
21 desc 'Test the calculations plugin.'
|
Chris@0
|
22 Rake::TestTask.new(:test) do |t|
|
Chris@0
|
23 t.libs << 'lib'
|
Chris@0
|
24 t.pattern = 'test/**/*_test.rb'
|
Chris@0
|
25 t.verbose = true
|
Chris@0
|
26 end
|
Chris@0
|
27
|
Chris@0
|
28 desc 'Generate documentation for the calculations plugin.'
|
Chris@0
|
29 Rake::RDocTask.new(:rdoc) do |rdoc|
|
Chris@0
|
30 rdoc.rdoc_dir = 'rdoc'
|
Chris@0
|
31 rdoc.title = "#{PKG_NAME} -- Simple versioning with active record models"
|
Chris@0
|
32 rdoc.options << '--line-numbers --inline-source'
|
Chris@0
|
33 rdoc.rdoc_files.include('README', 'CHANGELOG', 'RUNNING_UNIT_TESTS')
|
Chris@0
|
34 rdoc.rdoc_files.include('lib/**/*.rb')
|
Chris@0
|
35 end
|
Chris@0
|
36
|
Chris@0
|
37 spec = Gem::Specification.new do |s|
|
Chris@0
|
38 s.name = PKG_NAME
|
Chris@0
|
39 s.version = PKG_VERSION
|
Chris@0
|
40 s.platform = Gem::Platform::RUBY
|
Chris@0
|
41 s.summary = "Simple versioning with active record models"
|
Chris@0
|
42 s.files = FileList["{lib,test}/**/*"].to_a + %w(README MIT-LICENSE CHANGELOG RUNNING_UNIT_TESTS)
|
Chris@0
|
43 s.files.delete "acts_as_versioned_plugin.sqlite.db"
|
Chris@0
|
44 s.files.delete "acts_as_versioned_plugin.sqlite3.db"
|
Chris@0
|
45 s.files.delete "test/debug.log"
|
Chris@0
|
46 s.require_path = 'lib'
|
Chris@0
|
47 s.autorequire = 'acts_as_versioned'
|
Chris@0
|
48 s.has_rdoc = true
|
Chris@0
|
49 s.test_files = Dir['test/**/*_test.rb']
|
Chris@0
|
50 s.add_dependency 'activerecord', '>= 1.10.1'
|
Chris@0
|
51 s.add_dependency 'activesupport', '>= 1.1.1'
|
Chris@0
|
52 s.author = "Rick Olson"
|
Chris@0
|
53 s.email = "technoweenie@gmail.com"
|
Chris@0
|
54 s.homepage = "http://techno-weenie.net"
|
Chris@0
|
55 end
|
Chris@0
|
56
|
Chris@0
|
57 Rake::GemPackageTask.new(spec) do |pkg|
|
Chris@0
|
58 pkg.need_tar = true
|
Chris@0
|
59 end
|
Chris@0
|
60
|
Chris@0
|
61 desc "Publish the API documentation"
|
Chris@0
|
62 task :pdoc => [:rdoc] do
|
Chris@0
|
63 Rake::RubyForgePublisher.new(RUBY_FORGE_PROJECT, RUBY_FORGE_USER).upload
|
Chris@0
|
64 end
|
Chris@0
|
65
|
Chris@0
|
66 desc 'Publish the gem and API docs'
|
Chris@0
|
67 task :publish => [:pdoc, :rubyforge_upload]
|
Chris@0
|
68
|
Chris@0
|
69 desc "Publish the release files to RubyForge."
|
Chris@0
|
70 task :rubyforge_upload => :package do
|
Chris@0
|
71 files = %w(gem tgz).map { |ext| "pkg/#{PKG_FILE_NAME}.#{ext}" }
|
Chris@0
|
72
|
Chris@0
|
73 if RUBY_FORGE_PROJECT then
|
Chris@0
|
74 require 'net/http'
|
Chris@0
|
75 require 'open-uri'
|
Chris@0
|
76
|
Chris@0
|
77 project_uri = "http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/"
|
Chris@0
|
78 project_data = open(project_uri) { |data| data.read }
|
Chris@0
|
79 group_id = project_data[/[?&]group_id=(\d+)/, 1]
|
Chris@0
|
80 raise "Couldn't get group id" unless group_id
|
Chris@0
|
81
|
Chris@0
|
82 # This echos password to shell which is a bit sucky
|
Chris@0
|
83 if ENV["RUBY_FORGE_PASSWORD"]
|
Chris@0
|
84 password = ENV["RUBY_FORGE_PASSWORD"]
|
Chris@0
|
85 else
|
Chris@0
|
86 print "#{RUBY_FORGE_USER}@rubyforge.org's password: "
|
Chris@0
|
87 password = STDIN.gets.chomp
|
Chris@0
|
88 end
|
Chris@0
|
89
|
Chris@0
|
90 login_response = Net::HTTP.start("rubyforge.org", 80) do |http|
|
Chris@0
|
91 data = [
|
Chris@0
|
92 "login=1",
|
Chris@0
|
93 "form_loginname=#{RUBY_FORGE_USER}",
|
Chris@0
|
94 "form_pw=#{password}"
|
Chris@0
|
95 ].join("&")
|
Chris@0
|
96 http.post("/account/login.php", data)
|
Chris@0
|
97 end
|
Chris@0
|
98
|
Chris@0
|
99 cookie = login_response["set-cookie"]
|
Chris@0
|
100 raise "Login failed" unless cookie
|
Chris@0
|
101 headers = { "Cookie" => cookie }
|
Chris@0
|
102
|
Chris@0
|
103 release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}"
|
Chris@0
|
104 release_data = open(release_uri, headers) { |data| data.read }
|
Chris@0
|
105 package_id = release_data[/[?&]package_id=(\d+)/, 1]
|
Chris@0
|
106 raise "Couldn't get package id" unless package_id
|
Chris@0
|
107
|
Chris@0
|
108 first_file = true
|
Chris@0
|
109 release_id = ""
|
Chris@0
|
110
|
Chris@0
|
111 files.each do |filename|
|
Chris@0
|
112 basename = File.basename(filename)
|
Chris@0
|
113 file_ext = File.extname(filename)
|
Chris@0
|
114 file_data = File.open(filename, "rb") { |file| file.read }
|
Chris@0
|
115
|
Chris@0
|
116 puts "Releasing #{basename}..."
|
Chris@0
|
117
|
Chris@0
|
118 release_response = Net::HTTP.start("rubyforge.org", 80) do |http|
|
Chris@0
|
119 release_date = Time.now.strftime("%Y-%m-%d %H:%M")
|
Chris@0
|
120 type_map = {
|
Chris@0
|
121 ".zip" => "3000",
|
Chris@0
|
122 ".tgz" => "3110",
|
Chris@0
|
123 ".gz" => "3110",
|
Chris@0
|
124 ".gem" => "1400"
|
Chris@0
|
125 }; type_map.default = "9999"
|
Chris@0
|
126 type = type_map[file_ext]
|
Chris@0
|
127 boundary = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor"
|
Chris@0
|
128
|
Chris@0
|
129 query_hash = if first_file then
|
Chris@0
|
130 {
|
Chris@0
|
131 "group_id" => group_id,
|
Chris@0
|
132 "package_id" => package_id,
|
Chris@0
|
133 "release_name" => PKG_FILE_NAME,
|
Chris@0
|
134 "release_date" => release_date,
|
Chris@0
|
135 "type_id" => type,
|
Chris@0
|
136 "processor_id" => "8000", # Any
|
Chris@0
|
137 "release_notes" => "",
|
Chris@0
|
138 "release_changes" => "",
|
Chris@0
|
139 "preformatted" => "1",
|
Chris@0
|
140 "submit" => "1"
|
Chris@0
|
141 }
|
Chris@0
|
142 else
|
Chris@0
|
143 {
|
Chris@0
|
144 "group_id" => group_id,
|
Chris@0
|
145 "release_id" => release_id,
|
Chris@0
|
146 "package_id" => package_id,
|
Chris@0
|
147 "step2" => "1",
|
Chris@0
|
148 "type_id" => type,
|
Chris@0
|
149 "processor_id" => "8000", # Any
|
Chris@0
|
150 "submit" => "Add This File"
|
Chris@0
|
151 }
|
Chris@0
|
152 end
|
Chris@0
|
153
|
Chris@0
|
154 query = "?" + query_hash.map do |(name, value)|
|
Chris@0
|
155 [name, URI.encode(value)].join("=")
|
Chris@0
|
156 end.join("&")
|
Chris@0
|
157
|
Chris@0
|
158 data = [
|
Chris@0
|
159 "--" + boundary,
|
Chris@0
|
160 "Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"",
|
Chris@0
|
161 "Content-Type: application/octet-stream",
|
Chris@0
|
162 "Content-Transfer-Encoding: binary",
|
Chris@0
|
163 "", file_data, ""
|
Chris@0
|
164 ].join("\x0D\x0A")
|
Chris@0
|
165
|
Chris@0
|
166 release_headers = headers.merge(
|
Chris@0
|
167 "Content-Type" => "multipart/form-data; boundary=#{boundary}"
|
Chris@0
|
168 )
|
Chris@0
|
169
|
Chris@0
|
170 target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php"
|
Chris@0
|
171 http.post(target + query, data, release_headers)
|
Chris@0
|
172 end
|
Chris@0
|
173
|
Chris@0
|
174 if first_file then
|
Chris@0
|
175 release_id = release_response.body[/release_id=(\d+)/, 1]
|
Chris@0
|
176 raise("Couldn't get release id") unless release_id
|
Chris@0
|
177 end
|
Chris@0
|
178
|
Chris@0
|
179 first_file = false
|
Chris@0
|
180 end
|
Chris@0
|
181 end
|
Chris@0
|
182 end |