changelog shortlog tags changeset manifest revisions annotate raw

vendor/plugins/rspec/pre_commit/lib/pre_commit/rspec_on_rails.rb

changeset 15: 64acf98d15f4
author: moriq@moriq.com
date: Mon Mar 10 10:12:58 2008 +0900 (16 years ago)
permissions: -rw-r--r--
description: add plugins rspec
1class PreCommit::RspecOnRails < PreCommit
2 def pre_commit
3 install_plugins
4 check_dependencies
5 used_railses = []
6 VENDOR_DEPS.each do |dependency|
7 rails_dir = File.expand_path(dependency[:checkout_path])
8 rails_version = rails_version_from_dir(rails_dir)
9 begin
10 rspec_pre_commit(rails_version, false)
11 used_railses << rails_version
12 rescue Exception => e
13 unless rails_version == 'edge'
14 raise e
15 end
16 end
17 end
18 uninstall_plugins
19 puts "All specs passed against the following released versions of Rails: #{used_railses.join(", ")}"
20 unless used_railses.include?('edge')
21 puts "There were errors running pre_commit against edge"
22 end
23 end
24
25 def rails_version_from_dir(rails_dir)
26 File.basename(rails_dir)
27 end
28
29 def rspec_pre_commit(rails_version=ENV['RSPEC_RAILS_VERSION'],uninstall=true)
30 puts "#####################################################"
31 puts "running pre_commit against rails #{rails_version}"
32 puts "#####################################################"
33 ENV['RSPEC_RAILS_VERSION'] = rails_version
34 cleanup(uninstall)
35 ensure_db_config
36 clobber_sqlite_data
37 install_plugins
38 generate_rspec
39
40 generate_login_controller
41 create_purchase
42
43 rake_sh "spec"
44 rake_sh "spec:plugins:rspec_on_rails"
45
46 # TODO - why is this necessary? Shouldn't the specs leave
47 # a clean DB?
48 rake_sh "db:test:prepare"
49 sh "ruby vendor/plugins/rspec_on_rails/stories/all.rb"
50 cleanup(uninstall)
51 end
52
53 def cleanup(uninstall=true)
54 revert_routes
55 rm_generated_login_controller_files
56 destroy_purchase
57 uninstall_plugins if uninstall
58 end
59
60 def revert_routes
61 output = silent_sh("cp config/routes.rb.bak config/routes.rb")
62 raise "Error reverting routes.rb" if shell_error?(output)
63 end
64
65 def create_purchase
66 generate_purchase
67 migrate_up
68 end
69
70 def install_plugins
71 install_rspec_on_rails_plugin
72 install_rspec_plugin
73 end
74
75 def install_rspec_on_rails_plugin
76 rm_rf 'vendor/plugins/rspec_on_rails'
77 copy '../rspec_on_rails', 'vendor/plugins/'
78 end
79
80 def install_rspec_plugin
81 rm_rf 'vendor/plugins/rspec'
82 copy '../rspec', 'vendor/plugins/'
83 end
84
85 def uninstall_plugins
86 rm_rf 'vendor/plugins/rspec_on_rails'
87 rm_rf 'vendor/plugins/rspec'
88 rm_rf 'script/spec'
89 rm_rf 'script/spec_server'
90 rm_rf 'spec/spec_helper.rb'
91 rm_rf 'spec/spec.opts'
92 rm_rf 'spec/rcov.opts'
93 end
94
95 def copy(source, target)
96 output = silent_sh("cp -R #{File.expand_path(source)} #{File.expand_path(target)}")
97 raise "Error installing rspec" if shell_error?(output)
98 end
99
100 def generate_rspec
101 result = silent_sh("ruby script/generate rspec --force")
102 if error_code? || result =~ /^Missing/
103 raise "Failed to generate rspec environment:\n#{result}"
104 end
105 end
106
107 def ensure_db_config
108 config_path = 'config/database.yml'
109 unless File.exists?(config_path)
110 message = <<-EOF
111 #####################################################
112 Could not find #{config_path}
113
114 You can get rake to generate this file for you using either of:
115 rake rspec:generate_mysql_config
116 rake rspec:generate_sqlite3_config
117
118 If you use mysql, you'll need to create dev and test
119 databases and users for each. To do this, standing
120 in rspec_on_rails, log into mysql as root and then...
121 mysql> source db/mysql_setup.sql;
122
123 There is also a teardown script that will remove
124 the databases and users:
125 mysql> source db/mysql_teardown.sql;
126 #####################################################
127 EOF
128 raise message.gsub(/^ /, '')
129 end
130 end
131
132 def generate_mysql_config
133 copy 'config/database.mysql.yml', 'config/database.yml'
134 end
135
136 def generate_sqlite3_config
137 copy 'config/database.sqlite3.yml', 'config/database.yml'
138 end
139
140 def clobber_db_config
141 rm 'config/database.yml'
142 end
143
144 def clobber_sqlite_data
145 rm_rf 'db/*.db'
146 end
147
148 def generate_purchase
149 generator = "ruby script/generate rspec_scaffold purchase order_id:integer created_at:datetime amount:decimal keyword:string description:text --force"
150 notice = <<-EOF
151 #####################################################
152 #{generator}
153 #####################################################
154 EOF
155 puts notice.gsub(/^ /, '')
156 result = silent_sh(generator)
157 if error_code? || result =~ /not/
158 raise "rspec_scaffold failed. #{result}"
159 end
160 end
161
162 def purchase_migration_version
163 "005"
164 end
165
166 def migrate_up
167 rake_sh "db:migrate"
168 end
169
170 def destroy_purchase
171 migrate_down
172 rm_generated_purchase_files
173 end
174
175 def migrate_down
176 notice = <<-EOF
177 #####################################################
178 Migrating down and reverting config/routes.rb
179 #####################################################
180 EOF
181 puts notice.gsub(/^ /, '')
182 rake_sh "db:migrate", 'VERSION' => (purchase_migration_version.to_i - 1)
183 output = silent_sh("cp config/routes.rb.bak config/routes.rb")
184 raise "revert failed: #{output}" if error_code?
185 end
186
187 def rm_generated_purchase_files
188 puts "#####################################################"
189 puts "Removing generated files:"
190 generated_files = %W{
191 app/helpers/purchases_helper.rb
192 app/models/purchase.rb
193 app/controllers/purchases_controller.rb
194 app/views/purchases
195 db/migrate/#{purchase_migration_version}_create_purchases.rb
196 spec/models/purchase_spec.rb
197 spec/helpers/purchases_helper_spec.rb
198 spec/controllers/purchases_controller_spec.rb
199 spec/controllers/purchases_routing_spec.rb
200 spec/fixtures/purchases.yml
201 spec/views/purchases
202 }
203 generated_files.each do |file|
204 rm_rf file
205 end
206 puts "#####################################################"
207 end
208
209 def generate_login_controller
210 generator = "ruby script/generate rspec_controller login signup login logout --force"
211 notice = <<-EOF
212 #####################################################
213 #{generator}
214 #####################################################
215 EOF
216 puts notice.gsub(/^ /, '')
217 result = silent_sh(generator)
218 if error_code? || result =~ /not/
219 raise "rspec_scaffold failed. #{result}"
220 end
221 end
222
223 def rm_generated_login_controller_files
224 puts "#####################################################"
225 puts "Removing generated files:"
226 generated_files = %W{
227 app/helpers/login_helper.rb
228 app/controllers/login_controller.rb
229 app/views/login
230 spec/helpers/login_helper_spec.rb
231 spec/controllers/login_controller_spec.rb
232 spec/views/login
233 }
234 generated_files.each do |file|
235 rm_rf file
236 end
237 puts "#####################################################"
238 end
239
240 def install_dependencies
241 VENDOR_DEPS.each do |dep|
242 puts "\nChecking for #{dep[:name]} ..."
243 dest = dep[:checkout_path]
244 if File.exists?(dest)
245 puts "#{dep[:name]} already installed"
246 else
247 cmd = "svn co #{dep[:url]} #{dest}"
248 puts "Installing #{dep[:name]}"
249 puts "This may take a while."
250 puts cmd
251 system(cmd)
252 puts "Done!"
253 end
254 end
255 puts
256 end
257
258 def check_dependencies
259 VENDOR_DEPS.each do |dep|
260 unless File.exist?(dep[:checkout_path])
261 raise "There is no checkout of #{dep[:checkout_path]}. Please run rake install_dependencies"
262 end
263 # Verify that the current working copy is right
264 if `svn info #{dep[:checkout_path]}` =~ /^URL: (.*)/
265 actual_url = $1
266 if actual_url != dep[:url]
267 raise "Your working copy in #{dep[:checkout_path]} points to \n#{actual_url}\nIt has moved to\n#{dep[:url]}\nPlease delete the working copy and run rake install_dependencies"
268 end
269 end
270 end
271 end
272
273 def update_dependencies
274 check_dependencies
275 VENDOR_DEPS.each do |dep|
276 next if dep[:tagged?] #
277 puts "\nUpdating #{dep[:name]} ..."
278 dest = dep[:checkout_path]
279 system("svn cleanup #{dest}")
280 cmd = "svn up #{dest}"
281 puts cmd
282 system(cmd)
283 puts "Done!"
284 end
285 end
286
287 VENDOR_DEPS = [
288 {
289 :checkout_path => "vendor/rails/2.0.2",
290 :name => "rails 2.0.2",
291 :url => "http://dev.rubyonrails.org/svn/rails/tags/rel_2-0-2",
292 :tagged? => true
293 },
294 {
295 :checkout_path => "vendor/rails/1.2.6",
296 :name => "rails 1.2.6",
297 :url => "http://dev.rubyonrails.org/svn/rails/tags/rel_1-2-6",
298 :tagged? => true
299 },
300 {
301 :checkout_path => "vendor/rails/1.2.3",
302 :name => "rails 1.2.3",
303 :url => "http://dev.rubyonrails.org/svn/rails/tags/rel_1-2-3",
304 :tagged? => true
305 },
306 {
307 :checkout_path => "vendor/rails/edge",
308 :name => "edge rails",
309 :url => "http://svn.rubyonrails.org/rails/trunk",
310 :tagged? => false
311 }
312 ]
313end