cucumber-rails 1.4.0 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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