Skip to content

Loading…

Bundler pre bug #171

Merged
merged 2 commits into from

4 participants

@chaffeqa

Fixes Bundler --pre issue that only arrises if cucumber-rails is included outside of group :test.

Its a real edge case, but the fix was pretty painless and actually makes the code base more robust.

Basically any require of lib/cucumber/rails.rb will be ignored unless the call is from env.rb.

I also added a warning message to admonish users to put cucumber-rails under group :test (if the edge case is triggered)

@chaffeqa

I did create a ticket for bundler btw: bundler/bundler#1448

@aslakhellesoy aslakhellesoy merged commit c23d391 into cucumber:master
@pda

The instructions in the warning message were not enough to prevent the warning for me.

Apart from moving cucumber-rails to a test-only bundler group, I had to prevent it being loaded by Bundler:

gem "cucumber-rails", "~> 1.0", require: false

Here's the backtrace of the warning I was getting prior to adding require: false:

⸩ rspec
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/gems/1.9.1/gems/bundler-1.1.rc/lib/bundler/runtime.rb:76:in `require'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/gems/1.9.1/gems/bundler-1.1.rc/lib/bundler/runtime.rb:76:in `rescue in block in require'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/gems/1.9.1/gems/bundler-1.1.rc/lib/bundler/runtime.rb:62:in `block in require'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/gems/1.9.1/gems/bundler-1.1.rc/lib/bundler/runtime.rb:55:in `each'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/gems/1.9.1/gems/bundler-1.1.rc/lib/bundler/runtime.rb:55:in `require'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/gems/1.9.1/gems/bundler-1.1.rc/lib/bundler.rb:128:in `require'
/Users/paul/org/project/config/application.rb:7:in `<top (required)>'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
/Users/paul/org/project/config/environment.rb:2:in `<top (required)>'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
/Users/paul/org/project/spec/spec_helper.rb:8:in `<top (required)>'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
/Users/paul/org/project/spec/models/example_spec.rb:1:in `<top (required)>'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/gems/1.9.1/gems/rspec-core-2.7.0/lib/rspec/core/configuration.rb:459:in `load'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/gems/1.9.1/gems/rspec-core-2.7.0/lib/rspec/core/configuration.rb:459:in `block in load_spec_files'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/gems/1.9.1/gems/rspec-core-2.7.0/lib/rspec/core/configuration.rb:459:in `map'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/gems/1.9.1/gems/rspec-core-2.7.0/lib/rspec/core/configuration.rb:459:in `load_spec_files'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/gems/1.9.1/gems/rspec-core-2.7.0/lib/rspec/core/command_line.rb:18:in `run'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/gems/1.9.1/gems/rspec-core-2.7.0/lib/rspec/core/runner.rb:80:in `run_in_process'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/gems/1.9.1/gems/rspec-core-2.7.0/lib/rspec/core/runner.rb:69:in `run'
/Users/paul/.rbenv/versions/1.9.3-rc1/lib/ruby/gems/1.9.1/gems/rspec-core-2.7.0/lib/rspec/core/runner.rb:10:in `block in autorun'

WARNING: Cucumber-rails required outside of env.rb.  The rest of loading is being defered until env.rb is called.
  To avoid this warning, move 'gem cucumber-rails' under only group :test in your Gemfile
@JeanMertz

same here, I already had the gem in the test group, but that didn't stop this message from showing up. using require: false solved this for now.

@aslakhellesoy
Cucumber member

What kind of ruby syntax is require: false ? Is that a new way to make a Hash?

@JeanMertz

Yes, it's the Ruby 1.9 style of assigning values in a hash. See here for the best explanation on the entire web.

@chaffeqa

Sorry for taking so long to get back about this...

I'm guessing that since you use require: false the cucumber-rails lib isn't getting loaded by bundler.

Could you try it without the require: false and get back to me about whether it worked?

@aslakhellesoy
Cucumber member

Folks, please open a new ticket. This is a closed pull request.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Showing with 92 additions and 19 deletions.
  1. +28 −0 features/fixing_bundler_pre.feature
  2. +39 −0 features/step_definitions/cucumber_rails_steps.rb
  3. +25 −19 lib/cucumber/rails.rb
View
28 features/fixing_bundler_pre.feature
@@ -0,0 +1,28 @@
+Feature: Fixing Bundler Pre
+ In order to keep fix a problem with bundler and rails
+ As a user with cucumber-rails outside of test group in my Gemfile
+ I want run features without errors
+
+
+ Scenario: Install Cucumber-Rails with bundler prerelease
+ Given I am using bundler prerelease
+ And I have created a new Rails 3 app "rails-3-app" with cucumber-rails support and cucumber-rails is outside of test group
+ And I successfully run `rake db:migrate`
+ And I write to "features/tests.feature" with:
+ """
+ Feature: Tests
+ Scenario: Tests
+ When I go to the home page
+ """
+ And I run `bundle exec rake cucumber`
+ Then it should pass with:
+ """
+ 1 scenario (1 passed)
+ 1 step (1 passed)
+ """
+ And the output should contain "WARNING:"
+
+ Scenario: Teardown
+ Given I am using stable bundler
+
+
View
39 features/step_definitions/cucumber_rails_steps.rb
@@ -1,3 +1,42 @@
+Given /^I have created a new Rails 3 app "([^"]*)" with cucumber\-rails support and cucumber-rails is outside of test group$/ do |app_name|
+ steps %Q{
+ When I successfully run `rails new #{app_name}`
+ Then it should pass with:
+ """
+ README
+ """
+ And I cd to "#{app_name}"
+ And I append to "Gemfile" with:
+ """
+ gem "cucumber-rails", :path => "../../.."
+ gem "capybara", :group => :test
+ gem "rspec-rails", :group => :test
+ gem "database_cleaner", :group => :test
+ gem 'factory_girl', :group => :test
+
+ """
+ And I successfully run `bundle exec rails generate cucumber:install`
+ }
+ if(ENV['ARUBA_REPORT_DIR'])
+ @aruba_report_start = Time.new
+ sleep(1)
+ end
+end
+
+Given /^I am using bundler prerelease$/ do
+ steps %Q{
+ Given I successfully run `gem uninstall bundler`
+ And I successfully run `gem install bundler --pre`
+ }
+end
+
+Given /^I am using stable bundler$/ do
+ steps %Q{
+ Given I successfully run `gem uninstall bundler`
+ And I successfully run `gem install bundler`
+ }
+end
+
Given /^I have created a new Rails 3 app "([^"]*)" with cucumber\-rails support$/ do |app_name|
steps %Q{
When I successfully run `rails new #{app_name}`
View
44 lib/cucumber/rails.rb
@@ -1,23 +1,29 @@
-require 'rails'
-require 'cucumber/rails/application'
-ENV["RAILS_ENV"] ||= "test"
-ENV["RAILS_ROOT"] ||= File.expand_path(File.dirname(caller.detect{|f| f =~ /\/env\.rb:/}) + '/../..')
-require File.expand_path(ENV["RAILS_ROOT"] + '/config/environment')
-require 'cucumber/rails/action_controller'
+env_caller = File.dirname(caller.detect{|f| f =~ /\/env\.rb:/}) if caller.detect{|f| f =~ /\/env\.rb:/}
+if env_caller
+ require 'rails'
+ require 'cucumber/rails/application'
+ ENV["RAILS_ENV"] ||= "test"
+ ENV["RAILS_ROOT"] ||= File.expand_path(env_caller + "/../..")
+ require File.expand_path(ENV["RAILS_ROOT"] + '/config/environment')
+ require 'cucumber/rails/action_controller'
-if defined?(ActiveRecord::Base)
- require 'rails/test_help'
-else
- require 'action_dispatch/testing/test_process'
- require 'action_dispatch/testing/integration'
-end
+ if defined?(ActiveRecord::Base)
+ require 'rails/test_help'
+ else
+ require 'action_dispatch/testing/test_process'
+ require 'action_dispatch/testing/integration'
+ end
-if !Rails.application.config.cache_classes
- warn "WARNING: You have set Rails' config.cache_classes to false (most likely in config/environments/cucumber.rb). This setting is known to cause problems with database transactions. Set config.cache_classes to true if you want to use transactions. For more information see https://rspec.lighthouseapp.com/projects/16211/tickets/165."
-end
+ if !Rails.application.config.cache_classes
+ warn "WARNING: You have set Rails' config.cache_classes to false (most likely in config/environments/cucumber.rb). This setting is known to cause problems with database transactions. Set config.cache_classes to true if you want to use transactions. For more information see https://rspec.lighthouseapp.com/projects/16211/tickets/165."
+ end
-require 'cucumber/rails/world'
-require 'cucumber/rails/hooks'
-require 'cucumber/rails/capybara'
+ require 'cucumber/rails/world'
+ require 'cucumber/rails/hooks'
+ require 'cucumber/rails/capybara'
-require 'cucumber/web/tableish'
+ require 'cucumber/web/tableish'
+else
+ warn "WARNING: Cucumber-rails required outside of env.rb. The rest of loading is being defered until env.rb is called.
+ To avoid this warning, move 'gem cucumber-rails' under only group :test in your Gemfile"
+end
Something went wrong with that request. Please try again.