1
class PreCommit::RspecOnRails < PreCommit
6
VENDOR_DEPS.each do |dependency|
7
rails_dir = File.expand_path(dependency[:checkout_path])
8
rails_version = rails_version_from_dir(rails_dir)
10
rspec_pre_commit(rails_version, false)
11
used_railses << rails_version
13
unless rails_version == 'edge'
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"
25
def rails_version_from_dir(rails_dir)
26
File.basename(rails_dir)
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
40
generate_login_controller
44
rake_sh "spec:plugins:rspec_on_rails"
46
# TODO - why is this necessary? Shouldn't the specs leave
48
rake_sh "db:test:prepare"
49
sh "ruby vendor/plugins/rspec_on_rails/stories/all.rb"
53
def cleanup(uninstall=true)
55
rm_generated_login_controller_files
57
uninstall_plugins if uninstall
61
output = silent_sh("cp config/routes.rb.bak config/routes.rb")
62
raise "Error reverting routes.rb" if shell_error?(output)
71
install_rspec_on_rails_plugin
75
def install_rspec_on_rails_plugin
76
rm_rf 'vendor/plugins/rspec_on_rails'
77
copy '../rspec_on_rails', 'vendor/plugins/'
80
def install_rspec_plugin
81
rm_rf 'vendor/plugins/rspec'
82
copy '../rspec', 'vendor/plugins/'
86
rm_rf 'vendor/plugins/rspec_on_rails'
87
rm_rf 'vendor/plugins/rspec'
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'
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)
101
result = silent_sh("ruby script/generate rspec --force")
102
if error_code? || result =~ /^Missing/
103
raise "Failed to generate rspec environment:\n#{result}"
108
config_path = 'config/database.yml'
109
unless File.exists?(config_path)
111
#####################################################
112
Could not find #{config_path}
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
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;
123
There is also a teardown script that will remove
124
the databases and users:
125
mysql> source db/mysql_teardown.sql;
126
#####################################################
128
raise message.gsub(/^ /, '')
132
def generate_mysql_config
133
copy 'config/database.mysql.yml', 'config/database.yml'
136
def generate_sqlite3_config
137
copy 'config/database.sqlite3.yml', 'config/database.yml'
140
def clobber_db_config
141
rm 'config/database.yml'
144
def clobber_sqlite_data
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"
151
#####################################################
153
#####################################################
155
puts notice.gsub(/^ /, '')
156
result = silent_sh(generator)
157
if error_code? || result =~ /not/
158
raise "rspec_scaffold failed. #{result}"
162
def purchase_migration_version
172
rm_generated_purchase_files
177
#####################################################
178
Migrating down and reverting config/routes.rb
179
#####################################################
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?
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
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
203
generated_files.each do |file|
206
puts "#####################################################"
209
def generate_login_controller
210
generator = "ruby script/generate rspec_controller login signup login logout --force"
212
#####################################################
214
#####################################################
216
puts notice.gsub(/^ /, '')
217
result = silent_sh(generator)
218
if error_code? || result =~ /not/
219
raise "rspec_scaffold failed. #{result}"
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
230
spec/helpers/login_helper_spec.rb
231
spec/controllers/login_controller_spec.rb
234
generated_files.each do |file|
237
puts "#####################################################"
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"
247
cmd = "svn co #{dep[:url]} #{dest}"
248
puts "Installing #{dep[:name]}"
249
puts "This may take a while."
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"
263
# Verify that the current working copy is right
264
if `svn info #{dep[:checkout_path]}` =~ /^URL: (.*)/
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"
273
def update_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}"
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",
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",
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",
307
:checkout_path => "vendor/rails/edge",
308
:name => "edge rails",
309
:url => "http://svn.rubyonrails.org/rails/trunk",