~ubuntu-branches/ubuntu/oneiric/puppet/oneiric-security

« back to all changes in this revision

Viewing changes to vendor/gems/rspec/pre_commit/lib/pre_commit/rspec_on_rails.rb

  • Committer: Bazaar Package Importer
  • Author(s): Micah Anderson
  • Date: 2008-07-26 15:43:45 UTC
  • mto: (3.1.1 lenny) (1.3.1 upstream)
  • mto: This revision was merged to the branch mainline in revision 16.
  • Revision ID: james.westby@ubuntu.com-20080726154345-1fmgo76b4l72ulvc
ImportĀ upstreamĀ versionĀ 0.24.5

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
class 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
  ]
 
313
end