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

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

Revision 2763, 7.7 kB (checked in by david, 3 years ago)

Authentic 0.14.2 tag

  • 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 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
39 # Generate the RDoc documentation
40
41 Rake::RDocTask.new { |rdoc|
42   rdoc.rdoc_dir = 'doc'
43   rdoc.title    = "Active Record -- Object-relation mapping put on rails"
44   rdoc.options << '--line-numbers --inline-source --accessor cattr_accessor=object'
45   rdoc.template = "#{ENV['template']}.rb" if ENV['template']
46   rdoc.rdoc_files.include('README', 'RUNNING_UNIT_TESTS', 'CHANGELOG')
47   rdoc.rdoc_files.include('lib/**/*.rb')
48   rdoc.rdoc_files.exclude('lib/active_record/vendor/*')
49   rdoc.rdoc_files.include('dev-utils/*.rb')
50 }
51
52 # Enhance rdoc task to copy referenced images also
53 task :rdoc do
54   FileUtils.mkdir_p "doc/files/examples/"
55   FileUtils.copy "examples/associations.png", "doc/files/examples/associations.png"
56 end
57
58
59 # Create compressed packages
60
61 dist_dirs = [ "lib", "test", "examples", "dev-utils" ]
62
63 spec = Gem::Specification.new do |s|
64   s.name = PKG_NAME
65   s.version = PKG_VERSION
66   s.summary = "Implements the ActiveRecord pattern for ORM."
67   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.}
68
69   s.files = [ "rakefile", "install.rb", "README", "RUNNING_UNIT_TESTS", "CHANGELOG" ]
70   dist_dirs.each do |dir|
71     s.files = s.files + Dir.glob( "#{dir}/**/*" ).delete_if { |item| item.include?( "\.svn" ) }
72   end
73  
74   s.add_dependency('activesupport', '= 1.2.2' + PKG_BUILD)
75
76   s.files.delete "test/fixtures/fixture_database.sqlite"
77   s.files.delete "test/fixtures/fixture_database_2.sqlite"
78   s.files.delete "test/fixtures/fixture_database.sqlite3"
79   s.files.delete "test/fixtures/fixture_database_2.sqlite3"
80   s.require_path = 'lib'
81   s.autorequire = 'active_record'
82
83   s.has_rdoc = true
84   s.extra_rdoc_files = %w( README )
85   s.rdoc_options.concat ['--main',  'README']
86  
87   s.author = "David Heinemeier Hansson"
88   s.email = "david@loudthinking.com"
89   s.homepage = "http://www.rubyonrails.org"
90   s.rubyforge_project = "activerecord"
91 end
92  
93 Rake::GemPackageTask.new(spec) do |p|
94   p.gem_spec = spec
95   p.need_tar = true
96   p.need_zip = true
97 end
98
99 task :lines do
100   lines, codelines, total_lines, total_codelines = 0, 0, 0, 0
101
102   for file_name in FileList["lib/active_record/**/*.rb"]
103     next if file_name =~ /vendor/
104     f = File.open(file_name)
105
106     while line = f.gets
107       lines += 1
108       next if line =~ /^\s*$/
109       next if line =~ /^\s*#/
110       codelines += 1
111     end
112     puts "L: #{sprintf("%4d", lines)}, LOC #{sprintf("%4d", codelines)} | #{file_name}"
113    
114     total_lines     += lines
115     total_codelines += codelines
116    
117     lines, codelines = 0, 0
118   end
119
120   puts "Total: Lines #{total_lines}, LOC #{total_codelines}"
121 end
122
123
124 # Publishing ------------------------------------------------------
125
126 desc "Publish the beta gem"
127 task :pgem => [:package] do
128   Rake::SshFilePublisher.new("davidhh@wrath.rubyonrails.org", "public_html/gems/gems", "pkg", "#{PKG_FILE_NAME}.gem").upload
129   `ssh davidhh@wrath.rubyonrails.org './gemupdate.sh'`
130 end
131
132 desc "Publish the API documentation"
133 task :pdoc => [:rdoc] do
134   Rake::SshDirPublisher.new("davidhh@wrath.rubyonrails.org", "public_html/ar", "doc").upload
135 end
136
137 desc "Publish the release files to RubyForge."
138 task :release => [:package] do
139   files = ["gem", "tgz", "zip"].map { |ext| "pkg/#{PKG_FILE_NAME}.#{ext}" }
140
141   if RUBY_FORGE_PROJECT then
142     require 'net/http'
143     require 'open-uri'
144
145     project_uri = "http://rubyforge.org/projects/#{RUBY_FORGE_PROJECT}/"
146     project_data = open(project_uri) { |data| data.read }
147     group_id = project_data[/[?&]group_id=(\d+)/, 1]
148     raise "Couldn't get group id" unless group_id
149
150     # This echos password to shell which is a bit sucky
151     if ENV["RUBY_FORGE_PASSWORD"]
152       password = ENV["RUBY_FORGE_PASSWORD"]
153     else
154       print "#{RUBY_FORGE_USER}@rubyforge.org's password: "
155       password = STDIN.gets.chomp
156     end
157
158     login_response = Net::HTTP.start("rubyforge.org", 80) do |http|
159       data = [
160         "login=1",
161         "form_loginname=#{RUBY_FORGE_USER}",
162         "form_pw=#{password}"
163       ].join("&")
164       http.post("/account/login.php", data)
165     end
166
167     cookie = login_response["set-cookie"]
168     raise "Login failed" unless cookie
169     headers = { "Cookie" => cookie }
170
171     release_uri = "http://rubyforge.org/frs/admin/?group_id=#{group_id}"
172     release_data = open(release_uri, headers) { |data| data.read }
173     package_id = release_data[/[?&]package_id=(\d+)/, 1]
174     raise "Couldn't get package id" unless package_id
175
176     first_file = true
177     release_id = ""
178
179     files.each do |filename|
180       basename  = File.basename(filename)
181       file_ext  = File.extname(filename)
182       file_data = File.open(filename, "rb") { |file| file.read }
183
184       puts "Releasing #{basename}..."
185
186       release_response = Net::HTTP.start("rubyforge.org", 80) do |http|
187         release_date = Time.now.strftime("%Y-%m-%d %H:%M")
188         type_map = {
189           ".zip"    => "3000",
190           ".tgz"    => "3110",
191           ".gz"     => "3110",
192           ".gem"    => "1400"
193         }; type_map.default = "9999"
194         type = type_map[file_ext]
195         boundary = "rubyqMY6QN9bp6e4kS21H4y0zxcvoor"
196
197         query_hash = if first_file then
198           {
199             "group_id" => group_id,
200             "package_id" => package_id,
201             "release_name" => RELEASE_NAME,
202             "release_date" => release_date,
203             "type_id" => type,
204             "processor_id" => "8000", # Any
205             "release_notes" => "",
206             "release_changes" => "",
207             "preformatted" => "1",
208             "submit" => "1"
209           }
210         else
211           {
212             "group_id" => group_id,
213             "release_id" => release_id,
214             "package_id" => package_id,
215             "step2" => "1",
216             "type_id" => type,
217             "processor_id" => "8000", # Any
218             "submit" => "Add This File"
219           }
220         end
221
222         query = "?" + query_hash.map do |(name, value)|
223           [name, URI.encode(value)].join("=")
224         end.join("&")
225
226         data = [
227           "--" + boundary,
228           "Content-Disposition: form-data; name=\"userfile\"; filename=\"#{basename}\"",
229           "Content-Type: application/octet-stream",
230           "Content-Transfer-Encoding: binary",
231           "", file_data, ""
232           ].join("\x0D\x0A")
233
234         release_headers = headers.merge(
235           "Content-Type" => "multipart/form-data; boundary=#{boundary}"
236         )
237
238         target = first_file ? "/frs/admin/qrs.php" : "/frs/admin/editrelease.php"
239         http.post(target + query, data, release_headers)
240       end
241
242       if first_file then
243         release_id = release_response.body[/release_id=(\d+)/, 1]
244         raise("Couldn't get release id") unless release_id
245       end
246
247       first_file = false
248     end
249   end
250 end
Note: See TracBrowser for help on using the browser.