Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

Bundler pre bug #171

Merged
merged 2 commits into from

4 participants

chaffeqa Paul Annesley Jean Mertz Aslak Hellesøy
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

Aslak Hellesøy aslakhellesoy merged commit c23d391 into from
Paul Annesley

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
Jean Mertz

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.

Aslak Hellesøy

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

Jean Mertz

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?

Aslak Hellesøy

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

Lewis Marshall lmars referenced this pull request from a commit
Commit has since been removed from the repository and is no longer available.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
This page is out of date. Refresh to see the latest.
28 features/fixing_bundler_pre.feature
View
@@ -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
+
+
39 features/step_definitions/cucumber_rails_steps.rb
View
@@ -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}`
44 lib/cucumber/rails.rb
View
@@ -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.