Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

root/tags/rel_0-14-4/activerecord/Rakefile

Revision 3250, 9.1 kB (checked in by david, 3 years ago)

Prepare versions for release

  • Property svn:executable set to *
Line 
1 require 'rubygems'
2 require 'rake'
3 require 'rake/testtask'
4 require 'rake/rdoctask'
5 require 'rake/packagetask'
6 require 'rake/gempackagetask'
7 require 'rake/contrib/rubyforgepublisher'
8 require File.join(File.dirname(__FILE__), 'lib', 'active_record', 'version')
9
10 PKG_BUILD     = ENV['PKG_BUILD'] ? '.' + ENV['PKG_BUILD'] : ''
11 PKG_NAME      = 'activerecord'
12 PKG_VERSION   = ActiveRecord::VERSION::STRING + PKG_BUILD
13 PKG_FILE_NAME = "#{PKG_NAME}-#{PKG_VERSION}"
14
15 RELEASE_NAME  = "REL #{PKG_VERSION}"
16
17 RUBY_FORGE_PROJECT = "activerecord"
18 RUBY_FORGE_USER    = "webster132"
19
20 PKG_FILES = FileList[
21     "lib/**/*", "test/**/*", "examples/**/*", "doc/**/*", "[A-Z]*", "install.rb", "rakefile"
22 ].exclude(/\bCVS\b|~$/)
23
24
25 desc "Default Task"
26 task :default => [ :test_mysql, :test_sqlite, :test_postgresql ]
27
28 # Run the unit tests
29
30 for adapter in %w( mysql postgresql sqlite sqlite3 firebird sqlserver sqlserver_odbc db2 oci )
31   Rake::TestTask.new("test_#{adapter}") { |t|
32     t.libs << "test" << "test/connections/native_#{adapter}"
33     t.pattern = "test/*_test{,_#{adapter}}.rb"
34     t.verbose = true
35   }
36 end
37
38 SCHEMA_PATH = File.join(File.dirname(__FILE__), *%w(test fixtures db_definitions))
39
40 desc 'Build the MySQL test databases'
41 task :build_mysql_databases do
42   %x( mysqladmin  create activerecord_unittest )
43   %x( mysqladmin  create activerecord_unittest2 )
44   %x( mysql  activerecord_unittest < #{File.join(SCHEMA_PATH, 'mysql.sql')} )
45   %x( mysql  activerecord_unittest < #{File.join(SCHEMA_PATH, 'mysql2.sql')} )
46 end
47
48 desc 'Drop the MySQL test databases'
49 task :drop_mysql_databases do
50   %x( mysqladmin -f drop activerecord_unittest )
51   %x( mysqladmin -f drop activerecord_unittest2 )
52 end
53
54 desc 'Rebuild the MySQL test databases'
55 task :rebuild_mysql_databases => [:drop_mysql_databases, :build_mysql_databases]
56
57 desc 'Build the PostgreSQL test databases'
58 task :build_postgresql_databases do
59   %x( createdb activerecord_unittest )
60   %x( createdb activerecord_unittest2 )
61   %x( psql activerecord_unittest -f #{File.join(SCHEMA_PATH, 'postgresql.sql')} )
62   %x( psql activerecord_unittest -f #{File.join(SCHEMA_PATH, 'postgresql2.sql')} )
63 end
64
65 desc 'Drop the PostgreSQL test databases'
66 task :drop_postgresql_databases do
67   %x( dropdb   activerecord_unittest )
68   %x( dropdb   activerecord_unittest2 )
69 end
70
71 desc 'Rebuild the PostgreSQL test databases'
72 task :rebuild_postgresql_databases => [:drop_postgresql_databases, :build_postgresql_databases]
73
74 # Generate the RDoc documentation
75
76 Rake::RDocTask.new { |rdoc|
77   rdoc.rdoc_dir = 'doc'
78   rdoc.title    = "Active Record -- Object-relation mapping put on rails"
79   rdoc.options << '--line-numbers --inline-source --accessor cattr_accessor=object'
80   rdoc.template = "#{ENV['template']}.rb" if ENV['template']
81   rdoc.rdoc_files.include('README', 'RUNNING_UNIT_TESTS', 'CHANGELOG')
82   rdoc.rdoc_files.include('lib/**/*.rb')
83   rdoc.rdoc_files.exclude('lib/active_record/vendor/*')
84   rdoc.rdoc_files.include('dev-utils/*.rb')
85 }
86
87 # Enhance rdoc task to copy referenced images also
88 task :rdoc do
89   FileUtils.mkdir_p "doc/files/examples/"
90   FileUtils.copy "examples/associations.png", "doc/files/examples/associations.png"
91 end
92
93
94 # Create compressed packages
95
96 dist_dirs = [ "lib", "test", "examples", "dev-utils" ]
97
98 spec = Gem::Specification.new do |s|
99   s.name = PKG_NAME
100   s.version = PKG_VERSION
101   s.summary = "Implements the ActiveRecord pattern for ORM."
102   s.description = %q{Implements the ActiveRecord pattern (Fowler, PoEAA) for ORM. It ties database tables and classes together for business objects, like Customer or Subscription, that can find, save, and destroy themselves without resorting to manual SQL.}
103
104   s.files = [ "rakefile", "install.rb", "README", "RUNNING_UNIT_TESTS", "CHANGELOG" ]
105   dist_dirs.each do |dir|
106     s.files = s.files + Dir.glob( "#{dir}/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
107   end
108  
109   s.add_dependency('activesupport', '= 1.2.4' + PKG_BUILD)
110
111   s.files.delete "test/fixtures/fixture_database.sqlite"
112   s.files.delete "test/fixtures/fixture_database_2.sqlite"
113   s.files.delete "test/fixtures/fixture_database.sqlite3"
114   s.files.delete "test/fixtures/fixture_database_2.sqlite3"
115   s.require_path = 'lib'
116   s.autorequire = 'active_record'
117
118   s.has_rdoc = true
119   s.extra_rdoc_files = %w( README )
120   s.rdoc_options.concat ['--main',  'README']
121  
122   s.author = "David Heinemeier Hansson"
123   s.email = "david@loudthinking.com"
124   s.homepage = "http://www.rubyonrails.org"
125   s.rubyforge_project = "activerecord"
126 end
127  
128 Rake::GemPackageTask.new(spec) do |p|
129   p.gem_spec = spec
130   p.need_tar = true
131   p.need_zip = true
132 end
133
134 task :lines do
135   lines, codelines, total_lines, total_codelines = 0, 0, 0, 0
136
137   for file_name in FileList["lib/active_record/**/*.rb"]
138     next if file_name =~ /vendor/
139     f = File.open(file_name)
140
141     while line = f.gets
142       lines += 1
143       next if line =~ /^\s*$/
144       next if line =~ /^\s*#/
145       codelines += 1
146     end
147     puts "L: #{sprintf("%4d", lines)}, LOC #{sprintf("%4d", codelines)} | #{file_name}"
148    
149     total_lines     += lines
150     total_codelines += codelines
151    
152     lines, codelines = 0, 0
153   end
154
155   puts "Total: Lines #{total_lines}, LOC #{total_codelines}"
156 end
157
158
159 # Publishing ------------------------------------------------------
160
161 desc "Publish the beta gem"
162 task :pgem => [:package] do
163   Rake::SshFilePublisher.new("davidhh@wrath.rubyonrails.org", "public_html/gems/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload
164   `ssh davidhh@wrath.rubyonrails.org './gemupdate.sh'`
165 end
166
167 desc "Publish the API documentation"
168 task :pdoc => [:rdoc] do
169   Rake::SshDirPublisher.new("davidhh@wrath.rubyonrails.org", "public_html/ar", "doc").upload
170 end
171
172 desc "Publish the release files to RubyForge."
173 task :release => [:package] do
174   files = ["gem", "tgz", "zip"].map { |ext| "pkg/#{PKG_FILE_NAME}.#{ext}" }
175
176   if RUBY_FORGE_PROJECT then
177     require 'net/http'
178     require 'open-uri'
179
180     project_uri = "http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/"
181     project_data = open(project_uri) { |data| data.read }
182     group_id = project_data[/[?&]group_id=(\d+)/, 1]
183     raise "Couldn't get group id" unless group_id
184
185     # This echos password to shell which is a bit sucky
186     if ENV["RUBY_FORGE_PASSWORD"]
187       password = ENV["RUBY_FORGE_PASSWORD"]
188     else
189       print "#{RUBY_FORGE_USER}@rubyforge.org's password: "
190       password = STDIN.gets.chomp
191     end
192
193     login_response = Net::HTTP.start("rubyforge.org", 80) do |http|
194       data = [
195         "login=1",
196         "form_loginname=#{RUBY_FORGE_USER}",
197         "form_pw=#{password}"
198       ].join("&")
199       http.post("/account/login.php", data)
200     end
201
202     cookie = login_response["set-cookie"]
203     raise "Login failed" unless cookie
204     headers = { "Cookie" => cookie }
205
206     release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}"
207     release_data = open(release_uri, headers) { |data| data.read }
208     package_id = release_data[/[?&]package_id=(\d+)/, 1]
209     raise "Couldn't get package id" unless package_id
210
211     first_file = true
212     release_id = ""
213
214     files.each do |filename|
215       basename  = File.basename(filename)
216       file_ext  = File.extname(filename)
217       file_data = File.open(filename, "rb") { |file| file.read }
218
219       puts "Releasing #{basename}..."
220
221       release_response = Net::HTTP.start("rubyforge.org", 80) do |http|
222         release_date = Time.now.strftime("%Y-%m-%d %H:%M")
223         type_map = {
224           ".zip"    => "3000",
225           ".tgz"    => "3110",
226           ".gz"     => "3110",
227           ".gem"    => "1400"
228         }; type_map.default = "9999"
229         type = type_map[file_ext]
230         boundary = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor"
231
232         query_hash = if first_file then
233           {
234             "group_id" => group_id,
235             "package_id" => package_id,
236             "release_name" => RELEASE_NAME,
237             "release_date" => release_date,
238             "type_id" => type,
239             "processor_id" => "8000", # Any
240             "release_notes" => "",
241             "release_changes" => "",
242             "preformatted" => "1",
243             "submit" => "1"
244           }
245         else
246           {
247             "group_id" => group_id,
248             "release_id" => release_id,
249             "package_id" => package_id,
250             "step2" => "1",
251             "type_id" => type,
252             "processor_id" => "8000", # Any
253             "submit" => "Add This File"
254           }
255         end
256
257         query = "?" + query_hash.map do |(name, value)|
258           [name, URI.encode(value)].join("=")
259         end.join("&")
260
261         data = [
262           "--" + boundary,
263           "Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"",
264           "Content-Type: application/octet-stream",
265           "Content-Transfer-Encoding: binary",
266           "", file_data, ""
267           ].join("\x0D\x0A")
268
269         release_headers = headers.merge(
270           "Content-Type" => "multipart/form-data; boundary=#{boundary}"
271         )
272
273         target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php"
274         http.post(target + query, data, release_headers)
275       end
276
277       if first_file then
278         release_id = release_response.body[/release_id=(\d+)/, 1]
279         raise("Couldn't get release id") unless release_id
280       end
281
282       first_file = false
283     end
284   end
285 end
Note: See TracBrowser for help on using the browser.