cucumber-rails 1.4.0 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE.md +52 -0
  3. data/.github/PULL_REQUEST_TEMPLATE.md +42 -0
  4. data/.gitignore +3 -0
  5. data/.rspec +4 -1
  6. data/.rubocop.yml +68 -0
  7. data/.travis.yml +53 -26
  8. data/Appraisals +27 -63
  9. data/{History.md → CHANGELOG.md} +299 -19
  10. data/CONTRIBUTING.md +18 -27
  11. data/Gemfile +2 -4
  12. data/LICENSE +1 -1
  13. data/README.md +73 -29
  14. data/Rakefile +18 -14
  15. data/bin/install_geckodriver.sh +19 -0
  16. data/bin/install_webpacker.sh +9 -0
  17. data/config/cucumber.yml +5 -3
  18. data/cucumber-rails.gemspec +37 -25
  19. data/dev_tasks/cucumber.rake +3 -3
  20. data/dev_tasks/rspec.rake +3 -6
  21. data/dev_tasks/yard/default/layout/html/footer.erb +1 -1
  22. data/dev_tasks/yard/default/layout/html/layout.erb +5 -5
  23. data/dev_tasks/yard/default/layout/html/logo.erb +1 -1
  24. data/dev_tasks/yard/default/layout/html/setup.rb +6 -1
  25. data/dev_tasks/yard.rake +7 -14
  26. data/features/allow_rescue.feature +17 -12
  27. data/features/annotations.feature +20 -0
  28. data/features/capybara_javascript_drivers.feature +42 -32
  29. data/features/choose_javascript_database_strategy.feature +38 -57
  30. data/features/configuration.feature +48 -0
  31. data/features/database_cleaner.feature +20 -20
  32. data/features/disable_automatic_database_cleaning.feature +13 -19
  33. data/features/emulate_javascript.feature +65 -48
  34. data/features/install_cucumber_rails.feature +6 -5
  35. data/features/no_database.feature +8 -15
  36. data/features/raising_errors.feature +10 -4
  37. data/features/rerun_profile.feature +18 -8
  38. data/features/rest_api.feature +13 -13
  39. data/features/step_definitions/cucumber_rails_steps.rb +52 -66
  40. data/features/support/aruba.rb +5 -0
  41. data/features/support/cucumber_rails_helper.rb +85 -0
  42. data/features/support/env.rb +4 -35
  43. data/features/support/hooks.rb +8 -0
  44. data/gemfiles/rails_4_2.gemfile +10 -0
  45. data/gemfiles/rails_5_0.gemfile +10 -0
  46. data/gemfiles/rails_5_1.gemfile +10 -0
  47. data/gemfiles/rails_5_2.gemfile +10 -0
  48. data/gemfiles/rails_6_0.gemfile +9 -0
  49. data/lib/cucumber/rails/action_dispatch.rb +21 -0
  50. data/lib/cucumber/rails/application.rb +17 -8
  51. data/lib/cucumber/rails/capybara/javascript_emulation.rb +47 -39
  52. data/lib/cucumber/rails/capybara/select_dates_and_times.rb +8 -6
  53. data/lib/cucumber/rails/capybara.rb +2 -0
  54. data/lib/cucumber/rails/database.rb +36 -17
  55. data/lib/cucumber/rails/hooks/active_record.rb +14 -12
  56. data/lib/cucumber/rails/hooks/allow_rescue.rb +2 -0
  57. data/lib/cucumber/rails/hooks/database_cleaner.rb +6 -4
  58. data/lib/cucumber/rails/hooks/mail.rb +4 -4
  59. data/lib/cucumber/rails/hooks.rb +2 -0
  60. data/lib/cucumber/rails/rspec.rb +5 -3
  61. data/lib/cucumber/rails/world.rb +26 -9
  62. data/lib/cucumber/rails.rb +21 -18
  63. data/lib/generators/cucumber/{install/USAGE → USAGE} +2 -2
  64. data/lib/generators/cucumber/{install/install_generator.rb → install_generator.rb} +28 -15
  65. data/lib/generators/cucumber/{install/templates → templates}/config/cucumber.yml.erb +4 -3
  66. data/lib/generators/cucumber/{install/templates → templates}/script/cucumber +1 -0
  67. data/lib/generators/cucumber/{install/templates → templates}/support/_rails_each_run.rb.erb +4 -4
  68. data/lib/generators/cucumber/{install/templates → templates}/support/_rails_prefork.rb.erb +0 -0
  69. data/lib/generators/cucumber/{install/templates → templates}/support/capybara.rb +2 -0
  70. data/lib/generators/cucumber/{install/templates → templates}/support/edit_warning.txt +0 -0
  71. data/lib/generators/cucumber/{install/templates → templates}/support/rails.rb.erb +0 -0
  72. data/lib/generators/cucumber/{install/templates → templates}/support/rails_spork.rb.erb +2 -2
  73. data/lib/generators/cucumber/{install/templates → templates}/tasks/cucumber.rake.erb +19 -8
  74. data/spec/cucumber/rails/database_spec.rb +46 -33
  75. data/spec/generators/cucumber/install_generator_spec.rb +55 -0
  76. data/spec/spec_helper.rb +14 -2
  77. metadata +228 -142
  78. data/Gemfile.appraisal +0 -3
  79. data/features/step_definitions/mongo_steps.rb +0 -3
  80. data/features/support/bundler_pre_support.rb +0 -28
  81. data/features/support/fixtures/bundler-1.0.21.gem +0 -0
  82. data/features/support/fixtures/bundler-1.1.rc.gem +0 -0
  83. data/features/support/legacy_web_steps_support.rb +0 -290
  84. data/gemfiles/capybara_1_1.gemfile +0 -17
  85. data/gemfiles/rails_3_0.gemfile +0 -16
  86. data/gemfiles/rails_3_1.gemfile +0 -17
  87. data/gemfiles/rails_3_2.gemfile +0 -17
  88. data/gemfiles/rails_4_0.gemfile +0 -20
  89. data/lib/cucumber/rails/action_controller.rb +0 -12
  90. data/spec/generators/cucumber/install/install_generator_spec.rb +0 -47
@@ -1,19 +1,21 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Cucumber
2
4
  module Rails
3
5
  module Capybara
4
6
  # This module defines methods for selecting dates and times
5
7
  module SelectDatesAndTimes
6
- # Select a Rails date. Options has must include :from => +label+
8
+ # Select a Rails date. Options hash must include from: +label+
7
9
  def select_date(date, options)
8
10
  date = Date.parse(date)
9
11
  base_dom_id = get_base_dom_id_from_label_tag(options[:from])
10
12
 
11
13
  find(:xpath, ".//select[@id='#{base_dom_id}_1i']").select(date.year.to_s)
12
- find(:xpath, ".//select[@id='#{base_dom_id}_2i']").select(I18n.l date, :format => '%B')
14
+ find(:xpath, ".//select[@id='#{base_dom_id}_2i']").select(I18n.l(date, format: '%B'))
13
15
  find(:xpath, ".//select[@id='#{base_dom_id}_3i']").select(date.day.to_s)
14
16
  end
15
-
16
- # Select a Rails time. Options has must include :from => +label+
17
+
18
+ # Select a Rails time. Options hash must include from: +label+
17
19
  def select_time(time, options)
18
20
  time = Time.zone.parse(time)
19
21
  base_dom_id = get_base_dom_id_from_label_tag(options[:from])
@@ -21,8 +23,8 @@ module Cucumber
21
23
  find(:xpath, ".//select[@id='#{base_dom_id}_4i']").select(time.hour.to_s.rjust(2, '0'))
22
24
  find(:xpath, ".//select[@id='#{base_dom_id}_5i']").select(time.min.to_s.rjust(2, '0'))
23
25
  end
24
-
25
- # Select a Rails datetime. Options has must include :from => +label+
26
+
27
+ # Select a Rails datetime. Options hash must include from: +label+
26
28
  def select_datetime(datetime, options)
27
29
  select_date(datetime, options)
28
30
  select_time(datetime, options)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'capybara'
2
4
  require 'capybara/rails'
3
5
  require 'capybara/cucumber'
@@ -1,13 +1,13 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Cucumber
2
4
  module Rails
3
5
  module Database
6
+ CUSTOM_STRATEGY_INTERFACE = %w[before_js before_non_js].freeze
4
7
 
5
- CUSTOM_STRATEGY_INTERFACE = %w{ before_js before_non_js }
6
-
7
- class InvalidStrategy < ArgumentError;end
8
+ class InvalidStrategy < ArgumentError; end
8
9
 
9
10
  class << self
10
-
11
11
  attr_accessor :autorun_database_cleaner
12
12
 
13
13
  def javascript_strategy=(args)
@@ -15,12 +15,12 @@ module Cucumber
15
15
  strategy_type =
16
16
  case strategy
17
17
  when Symbol
18
- map[strategy] || raise(InvalidStrategy, "The strategy '#{strategy}' is not understood. Please use one of #{map.keys.join(',')}")
18
+ map[strategy] || throw_invalid_strategy_error(strategy)
19
19
  when Class
20
20
  strategy
21
21
  end
22
22
 
23
- @strategy = strategy_type.new(*strategy_opts)
23
+ @strategy = strategy_type.new(*strategy_opts)
24
24
 
25
25
  validate_interface!
26
26
  end
@@ -37,32 +37,50 @@ module Cucumber
37
37
  @strategy.after
38
38
  end
39
39
 
40
- private
40
+ private
41
41
 
42
42
  def map
43
43
  {
44
- :truncation => TruncationStrategy,
45
- :shared_connection => SharedConnectionStrategy,
46
- :transaction => SharedConnectionStrategy,
47
- :deletion => DeletionStrategy
44
+ truncation: TruncationStrategy,
45
+ shared_connection: SharedConnectionStrategy,
46
+ transaction: SharedConnectionStrategy,
47
+ deletion: DeletionStrategy
48
48
  }
49
49
  end
50
50
 
51
+ def throw_invalid_strategy_error(strategy)
52
+ raise(InvalidStrategy, "The strategy '#{strategy}' is not understood. Please use one of #{mapped_keys}")
53
+ end
54
+
55
+ def mapped_keys
56
+ map.keys.join(', ')
57
+ end
58
+
51
59
  def validate_interface!
52
- unless CUSTOM_STRATEGY_INTERFACE.all? {|m| @strategy.respond_to?(m) }
53
- raise(ArgumentError, "Strategy must respond to all of: #{CUSTOM_STRATEGY_INTERFACE.map{|method| "##{method}" } * ' '} !")
54
- end
60
+ return if CUSTOM_STRATEGY_INTERFACE.all? { |m| @strategy.respond_to?(m) }
61
+
62
+ throw_invalid_strategy_interface_error
55
63
  end
56
64
 
65
+ def throw_invalid_strategy_interface_error
66
+ raise(
67
+ ArgumentError,
68
+ "Strategy must respond to all of: #{CUSTOM_STRATEGY_INTERFACE.map { |method| "##{method}" } * ' '} !"
69
+ )
70
+ end
57
71
  end
58
72
 
59
73
  class Strategy
60
- def initialize(options={})
61
- @options=options
74
+ def initialize(options = {})
75
+ @options = options
62
76
  end
63
77
 
64
78
  def before_js(strategy)
65
- @original_strategy = DatabaseCleaner.connections.first.strategy # that feels like a nasty hack
79
+ @original_strategy = if Gem::Version.new(DatabaseCleaner::VERSION) >= Gem::Version.new('1.8.0.beta')
80
+ DatabaseCleaner.cleaners.values.first.strategy # that feels like a nasty hack
81
+ else
82
+ DatabaseCleaner.connections.first.strategy # that feels like a nasty hack
83
+ end
66
84
  DatabaseCleaner.strategy = strategy, @options
67
85
  end
68
86
 
@@ -72,6 +90,7 @@ module Cucumber
72
90
 
73
91
  def after
74
92
  return unless @original_strategy
93
+
75
94
  DatabaseCleaner.strategy = @original_strategy
76
95
  @original_strategy = nil
77
96
  end
@@ -1,21 +1,23 @@
1
- if defined?(ActiveRecord::Base)
2
- class ActiveRecord::Base
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveRecord
4
+ class Base
3
5
  class_attribute :shared_connection
4
6
 
5
7
  def self.connection
6
- self.shared_connection || retrieve_connection
8
+ shared_connection || retrieve_connection
7
9
  end
8
10
  end
11
+ end
9
12
 
10
- Before('@javascript') do
11
- Cucumber::Rails::Database.before_js
12
- end
13
+ Before('@javascript') do
14
+ Cucumber::Rails::Database.before_js if Cucumber::Rails::Database.autorun_database_cleaner
15
+ end
13
16
 
14
- Before('~@javascript') do
15
- Cucumber::Rails::Database.before_non_js
16
- end
17
+ Before('not @javascript') do
18
+ Cucumber::Rails::Database.before_non_js if Cucumber::Rails::Database.autorun_database_cleaner
19
+ end
17
20
 
18
- After do
19
- Cucumber::Rails::Database.after
20
- end
21
+ After do
22
+ Cucumber::Rails::Database.after if Cucumber::Rails::Database.autorun_database_cleaner
21
23
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Before('@allow-rescue') do
2
4
  @__orig_allow_rescue = ActionController::Base.allow_rescue
3
5
  ActionController::Base.allow_rescue = true
@@ -1,13 +1,15 @@
1
+ # frozen_string_literal: true
2
+
1
3
  begin
2
4
  require 'database_cleaner'
3
5
 
4
- Before('~@no-database-cleaner') do
6
+ Before('not @no-database-cleaner') do
5
7
  DatabaseCleaner.start if Cucumber::Rails::Database.autorun_database_cleaner
6
8
  end
7
9
 
8
- After('~@no-database-cleaner') do
10
+ After('not @no-database-cleaner') do
9
11
  DatabaseCleaner.clean if Cucumber::Rails::Database.autorun_database_cleaner
10
12
  end
11
-
12
- rescue LoadError => ignore_if_database_cleaner_not_present
13
+ rescue LoadError
14
+ Cucumber.logger.debug('database_cleaner gem not present.')
13
15
  end
@@ -1,5 +1,5 @@
1
- if defined?(ActionMailer::Base)
2
- Before do
3
- ActionMailer::Base.deliveries = []
4
- end
1
+ # frozen_string_literal: true
2
+
3
+ Before do
4
+ ActionMailer::Base.deliveries = []
5
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/rails/hooks/active_record'
2
4
  require 'cucumber/rails/hooks/database_cleaner'
3
5
  require 'cucumber/rails/hooks/allow_rescue'
@@ -1,18 +1,20 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cucumber/rails/world'
2
4
 
3
5
  begin
4
6
  require 'rspec/rails/matchers'
5
7
 
6
- [Cucumber::Rails::World, ActionController::Integration::Session].each do |klass|
8
+ [Cucumber::Rails::World, ActionDispatch::Integration::Session].each do |klass|
7
9
  klass.class_eval do
8
10
  include RSpec::Matchers
9
11
  end
10
12
  end
11
- rescue LoadError => try_rspec_1
13
+ rescue LoadError
12
14
  require 'spec/expectations'
13
15
  require 'spec/rails'
14
16
 
15
- [Cucumber::Rails::World, ActionController::Integration::Session].each do |klass|
17
+ [Cucumber::Rails::World, ActionDispatch::Integration::Session].each do |klass|
16
18
  klass.class_eval do
17
19
  include Spec::Matchers
18
20
  include Spec::Rails::Matchers if defined?(Spec::Rails::Matchers)
@@ -1,21 +1,38 @@
1
+ # frozen_string_literal: true
2
+
1
3
  begin
2
4
  # Try to load it so we can assign @_result below if needed.
3
5
  require 'test/unit/testresult'
4
- rescue LoadError => ignore
6
+ rescue LoadError
7
+ Cucumber.logger.debug('Minitest not found.')
8
+ end
9
+
10
+ module Cucumber
11
+ module Rails
12
+ class << self
13
+ def include_rack_test_helpers?
14
+ # Using ActiveModel Boolean casting here will give false positives more often than not!
15
+ !ENV['CR_REMOVE_RACK_TEST_HELPERS']&.casecmp('true')&.zero?
16
+ end
17
+ end
18
+ end
5
19
  end
6
20
 
7
- module Cucumber #:nodoc:
8
- module Rails #:nodoc:
9
- class World < ActionDispatch::IntegrationTest #:nodoc:
10
- include Rack::Test::Methods
11
- include ActiveSupport::Testing::SetupAndTeardown if ActiveSupport::Testing.const_defined?("SetupAndTeardown")
21
+ module Cucumber
22
+ module Rails
23
+ class World < ::ActionDispatch::IntegrationTest
24
+ include Rack::Test::Methods if Cucumber::Rails.include_rack_test_helpers?
25
+ include ActiveSupport::Testing::SetupAndTeardown if ActiveSupport::Testing.const_defined?('SetupAndTeardown')
12
26
 
13
- def initialize #:nodoc:
27
+ def initialize
14
28
  @_result = Test::Unit::TestResult.new if defined?(Test::Unit::TestResult)
15
29
  end
16
30
 
17
- if !defined?(ActiveRecord::Base)
18
- def self.fixture_table_names; []; end # Workaround for projects that don't use ActiveRecord
31
+ unless defined?(ActiveRecord::Base)
32
+ # Workaround for projects that don't use ActiveRecord
33
+ def self.fixture_table_names
34
+ []
35
+ end
19
36
  end
20
37
  end
21
38
  end
@@ -1,21 +1,22 @@
1
- env_caller = File.dirname(caller.detect{|f| f =~ /\/env\.rb:/}) if caller.detect{|f| f =~ /\/env\.rb:/}
2
- if env_caller
1
+ # frozen_string_literal: true
2
+
3
+ called_from_env_rb = caller.detect { |f| f =~ /\/env\.rb:/ }
4
+
5
+ if called_from_env_rb
6
+ env_caller = File.dirname(called_from_env_rb)
7
+
3
8
  require 'rails'
4
9
  require 'cucumber/rails/application'
5
- ENV["RAILS_ENV"] ||= "test"
6
- ENV["RAILS_ROOT"] ||= File.expand_path(env_caller + "/../..")
7
- require File.expand_path(ENV["RAILS_ROOT"] + '/config/environment')
8
- require 'cucumber/rails/action_controller'
9
-
10
- if defined?(ActiveRecord::Base)
11
- require 'rails/test_help'
12
- else
13
- require 'action_dispatch/testing/test_process'
14
- require 'action_dispatch/testing/integration'
15
- end
10
+ ENV['RAILS_ENV'] ||= 'test'
11
+ ENV['RAILS_ROOT'] ||= File.expand_path(env_caller + '/../..')
12
+ require File.expand_path(ENV['RAILS_ROOT'] + '/config/environment')
13
+ require 'cucumber/rails/action_dispatch'
14
+ require 'rails/test_help'
16
15
 
17
- if !Rails.application.config.cache_classes
18
- 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."
16
+ unless Rails.application.config.cache_classes || defined?(Spring)
17
+ warn "WARNING: You have set Rails' config.cache_classes to false
18
+ (Spring needs cache_classes set to false). This is known to cause problems
19
+ with database transactions. Set config.cache_classes to true if you want to use transactions."
19
20
  end
20
21
 
21
22
  require 'cucumber/rails/world'
@@ -23,8 +24,10 @@ if env_caller
23
24
  require 'cucumber/rails/capybara'
24
25
  require 'cucumber/rails/database'
25
26
 
27
+ MultiTest.disable_autorun
26
28
  else
27
- warn "WARNING: Cucumber-rails required outside of env.rb. The rest of loading is being deferred until env.rb is called.
28
- To avoid this warning, move 'gem \'cucumber-rails\', :require => false' under only group :test in your Gemfile.
29
- If already in the :test group, be sure you are specifying ':require => false'."
29
+ warn "WARNING: Cucumber-rails required outside of env.rb. The rest of loading is being deferred
30
+ until env.rb is called. To avoid this warning, move 'gem \'cucumber-rails\', require: false'
31
+ under only group :test in your Gemfile. If already in the :test group, be sure you are
32
+ specifying 'require: false'."
30
33
  end
@@ -1,9 +1,9 @@
1
1
  Description:
2
2
  Sets up Cucumber in your Rails project. After running this generator you will
3
3
  get a new rake task called cucumber.
4
-
4
+
5
5
  This also generates the necessary files in the features directory.
6
-
6
+
7
7
  Examples:
8
8
  `rails generate cucumber:install`
9
9
 
@@ -1,13 +1,22 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rbconfig'
2
4
 
3
5
  module Cucumber
4
6
  class InstallGenerator < ::Rails::Generators::Base
5
- source_root File.expand_path("../templates", __FILE__)
7
+ source_root File.expand_path('templates', __dir__)
6
8
 
7
9
  DEFAULT_SHEBANG = File.join(RbConfig::CONFIG['bindir'], RbConfig::CONFIG['ruby_install_name'])
8
10
 
9
- class_option :spork, :type => :boolean, :desc => "Use Spork"
10
- class_option :skip_database, :type => :boolean, :desc => "Skip modification of database.yml", :aliases => '-D', :default => false
11
+ class_option :spork,
12
+ type: :boolean,
13
+ desc: 'Use Spork'
14
+
15
+ class_option :skip_database,
16
+ type: :boolean,
17
+ desc: 'Skip modification of database.yml',
18
+ aliases: '-D',
19
+ default: false
11
20
 
12
21
  def create_templates
13
22
  template 'config/cucumber.yml.erb', 'config/cucumber.yml'
@@ -20,6 +29,7 @@ module Cucumber
20
29
 
21
30
  def create_step_definitions
22
31
  empty_directory 'features/step_definitions'
32
+ create_file 'features/step_definitions/.gitkeep'
23
33
  end
24
34
 
25
35
  def create_feature_support
@@ -38,13 +48,13 @@ module Cucumber
38
48
 
39
49
  def create_database
40
50
  return unless File.exist?('config/database.yml')
41
- unless File.read('config/database.yml').include? 'cucumber:'
42
- gsub_file 'config/database.yml', /^test:.*\n/, "test: &test\n"
43
- gsub_file 'config/database.yml', /\z/, "\ncucumber:\n <<: *test"
44
-
45
- # Since gsub_file doesn't ask the user, just inform user that the file was overwritten.
46
- puts " force config/database.yml"
47
- end
51
+ return unless File.read('config/database.yml').include? 'cucumber:'
52
+
53
+ gsub_file 'config/database.yml', /^test:.*\n/, "test: &test\n"
54
+ gsub_file 'config/database.yml', /\z/, "\ncucumber:\n <<: *test\n"
55
+
56
+ # Since gsub_file doesn't ask the user, just inform user that the file was overwritten.
57
+ puts ' force config/database.yml'
48
58
  end
49
59
 
50
60
  protected
@@ -53,14 +63,17 @@ module Cucumber
53
63
  options[:spork]
54
64
  end
55
65
 
56
- def embed_file(source, indent='')
66
+ def embed_file(source, indent = '')
57
67
  IO.read(File.join(self.class.source_root, source)).gsub(/^/, indent)
58
68
  end
59
69
 
60
- def embed_template(source, indent='')
70
+ def embed_template(source, indent = '')
61
71
  template = File.join(self.class.source_root, source)
62
- ERB.new(IO.read(template), nil, '-').result(binding).gsub(/^/, indent)
72
+ if RUBY_VERSION >= '2.6'
73
+ ERB.new(IO.read(template), trim_mode: '-').result(binding).gsub(/^/, indent)
74
+ else
75
+ ERB.new(IO.read(template), nil, '-').result(binding).gsub(/^/, indent)
76
+ end
63
77
  end
64
-
65
78
  end
66
- end
79
+ end
@@ -1,8 +1,9 @@
1
1
  <%%
2
2
  rerun = File.file?('rerun.txt') ? IO.read('rerun.txt') : ""
3
- rerun_opts = rerun.to_s.strip.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
4
- std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} --strict --tags ~@wip"
3
+ rerun = rerun.strip.gsub /\s/, ' '
4
+ rerun_opts = rerun.empty? ? "--format #{ENV['CUCUMBER_FORMAT'] || 'progress'} features" : "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} #{rerun}"
5
+ std_opts = "--format #{ENV['CUCUMBER_FORMAT'] || 'pretty'} --strict --tags 'not @wip'"
5
6
  %>
6
7
  default: <%= spork? ? '--drb ' : '' %><%%= std_opts %> features
7
8
  wip: <%= spork? ? '--drb ' : '' %>--tags @wip:3 --wip features
8
- rerun: <%= spork? ? '--drb ' : '' %><%%= rerun_opts %> --format rerun --out rerun.txt --strict --tags ~@wip
9
+ rerun: <%= spork? ? '--drb ' : '' %><%%= rerun_opts %> --format rerun --out rerun.txt --strict --tags 'not @wip'
@@ -1,4 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
2
3
 
3
4
  vendored_cucumber_bin = Dir["#{File.dirname(__FILE__)}/../vendor/{gems,plugins}/cucumber*/bin/cucumber"].first
4
5
  if vendored_cucumber_bin
@@ -1,6 +1,6 @@
1
1
  # By default, any exception happening in your Rails application will bubble up
2
- # to Cucumber so that your scenario will fail. This is a different from how
3
- # your application behaves in the production environment, where an error page will
2
+ # to Cucumber so that your scenario will fail. This is a different from how
3
+ # your application behaves in the production environment, where an error page will
4
4
  # be rendered instead.
5
5
  #
6
6
  # Sometimes we want to override this default behaviour and allow Rails to rescue
@@ -27,13 +27,13 @@ end
27
27
  # See the DatabaseCleaner documentation for details. Example:
28
28
  #
29
29
  # Before('@no-txn,@selenium,@culerity,@celerity,@javascript') do
30
- # # { :except => [:widgets] } may not do what you expect here
30
+ # # { except: [:widgets] } may not do what you expect here
31
31
  # # as Cucumber::Rails::Database.javascript_strategy overrides
32
32
  # # this setting.
33
33
  # DatabaseCleaner.strategy = :truncation
34
34
  # end
35
35
  #
36
- # Before('~@no-txn', '~@selenium', '~@culerity', '~@celerity', '~@javascript') do
36
+ # Before('not @no-txn', 'not @selenium', 'not @culerity', 'not @celerity', 'not @javascript') do
37
37
  # DatabaseCleaner.strategy = :transaction
38
38
  # end
39
39
  #
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Capybara defaults to CSS3 selectors rather than XPath.
2
4
  # If you'd prefer to use XPath, just uncomment this line and adjust any
3
5
  # selectors in your step definitions to use the XPath syntax.
@@ -1,13 +1,13 @@
1
1
  <%= embed_file('support/edit_warning.txt') %>
2
2
  require 'rubygems'
3
3
  require 'spork'
4
-
4
+
5
5
  Spork.prefork do
6
6
  <%= embed_template('support/_rails_prefork.rb.erb', ' ') %>
7
7
 
8
8
  <%= embed_file("support/capybara.rb", ' ') %>
9
9
  end
10
-
10
+
11
11
  Spork.each_run do
12
12
  <%= embed_template('support/_rails_each_run.rb.erb', ' ') %>
13
13
  end
@@ -9,39 +9,48 @@ begin
9
9
  require 'cucumber/rake/task'
10
10
 
11
11
  namespace :cucumber do
12
- Cucumber::Rake::Task.new({:ok => 'test:prepare'}, 'Run features that should pass') do |t|
12
+ Cucumber::Rake::Task.new({ok: 'test:prepare'}, 'Run features that should pass') do |t|
13
13
  t.binary = vendored_cucumber_bin # If nil, the gem's binary is used.
14
14
  t.fork = true # You may get faster startup if you set this to false
15
15
  t.profile = 'default'
16
16
  end
17
17
 
18
- Cucumber::Rake::Task.new({:wip => 'test:prepare'}, 'Run features that are being worked on') do |t|
18
+ Cucumber::Rake::Task.new({wip: 'test:prepare'}, 'Run features that are being worked on') do |t|
19
19
  t.binary = vendored_cucumber_bin
20
20
  t.fork = true # You may get faster startup if you set this to false
21
21
  t.profile = 'wip'
22
22
  end
23
23
 
24
- Cucumber::Rake::Task.new({:rerun => 'test:prepare'}, 'Record failing features and run only them if any exist') do |t|
24
+ Cucumber::Rake::Task.new({rerun: 'test:prepare'}, 'Record failing features and run only them if any exist') do |t|
25
25
  t.binary = vendored_cucumber_bin
26
26
  t.fork = true # You may get faster startup if you set this to false
27
27
  t.profile = 'rerun'
28
28
  end
29
29
 
30
30
  desc 'Run all features'
31
- task :all => [:ok, :wip]
31
+ task all: [:ok, :wip]
32
32
 
33
33
  task :statsetup do
34
34
  require 'rails/code_statistics'
35
35
  ::STATS_DIRECTORIES << %w(Cucumber\ features features) if File.exist?('features')
36
36
  ::CodeStatistics::TEST_TYPES << "Cucumber features" if File.exist?('features')
37
37
  end
38
+
39
+ task :annotations_setup do
40
+ Rails.application.configure do
41
+ if config.respond_to?(:annotations)
42
+ config.annotations.directories << 'features'
43
+ config.annotations.register_extensions('feature') { |tag| /#\s*(#{tag}):?\s*(.*)$/ }
44
+ end
45
+ end
46
+ end
38
47
  end
39
48
  desc 'Alias for cucumber:ok'
40
- task :cucumber => 'cucumber:ok'
49
+ task cucumber: 'cucumber:ok'
41
50
 
42
- task :default => :cucumber
51
+ task default: :cucumber
43
52
 
44
- task :features => :cucumber do
53
+ task features: :cucumber do
45
54
  STDERR.puts "*** The 'features' task is deprecated. See rake -T cucumber ***"
46
55
  end
47
56
 
@@ -49,7 +58,9 @@ begin
49
58
  task 'test:prepare' do
50
59
  end
51
60
 
52
- task :stats => 'cucumber:statsetup'
61
+ task stats: 'cucumber:statsetup'
62
+
63
+ task notes: 'cucumber:annotations_setup'
53
64
  rescue LoadError
54
65
  desc 'cucumber rake task not available (cucumber not installed)'
55
66
  task :cucumber do