rspec_starter 1.7.1 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1947eae49107431f8c61def126cb43b29b32629cff7a2bee05797122feedf40d
4
- data.tar.gz: fa7e4572d94a5772d7cc381e38e6e439fde32e76b53600a0f180ae0dac5921b9
3
+ metadata.gz: 4a565e16879216ea00dd45fcfbff269c7f9f56a85bad93172001b15bb719f0fc
4
+ data.tar.gz: fdcaadb0b04aa523ffe1a5c63b4bc2e2338980bca0d24a904754982362c7e27b
5
5
  SHA512:
6
- metadata.gz: e01eca047641fc5580e601ad8f90b814b60d3965a4b45dfb2422ae3df33d1216f1e45a7a80c9b593370de371086b74f0ff0d43494f478ed511c98e4ab3628e79
7
- data.tar.gz: 25a3ca57549ba4c59b196b4d463a8988277f243040fe6231032a460602b6a82d6c110b6dc7c95f72fdb0762a83aac13beb5111363c475ee2693f0b3b57ec8a39
6
+ metadata.gz: 7adf0a1b84fb3afa6bd4e9c498767e99f371233cf236e46f3ba2f8c75f445368dbbde80ea11ad37a24ab17469f5838192101c0b8b6c66bb045d9f92e8d3b81ec
7
+ data.tar.gz: 165ac11d37d3ddbdda32bd8040a138d684474835f1334d89f9385a67ed1a55970a9e4476024b239c2c8a0fa0b1799fcacaa3273301aaeccad8eb5606bfdc6fe4
@@ -0,0 +1,54 @@
1
+ # This workflow will download prebuilt Ruby versions, install dependencies and run checks against Pull Requests.
2
+
3
+ name: Check Pull Request
4
+ on:
5
+ pull_request:
6
+ branches: [ master ]
7
+ env:
8
+ # The pull request can have less than, or equal to, this number of rubocop issues and pass.
9
+ RUBOCOP_ISSUE_THRESHOLD: 5
10
+ jobs:
11
+ rspec:
12
+ name: Run RSpec
13
+ runs-on: ubuntu-latest
14
+ strategy:
15
+ matrix:
16
+ ruby-version: ['2.6', '2.7', '3.0']
17
+ steps:
18
+ - uses: actions/checkout@v2
19
+ - name: Set up Ruby
20
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
21
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
22
+ uses: ruby/setup-ruby@v1
23
+ with:
24
+ ruby-version: ${{ matrix.ruby-version }}
25
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
26
+ - name: Execute rspec command
27
+ run: bundle exec rspec
28
+ rubocop:
29
+ name: Run Rubocop
30
+ runs-on: ubuntu-latest
31
+ strategy:
32
+ matrix:
33
+ ruby-version: ['2.6']
34
+ steps:
35
+ - uses: actions/checkout@v2
36
+ - name: Set up Ruby
37
+ # To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
38
+ # change this to (see https://github.com/ruby/setup-ruby#versioning):
39
+ uses: ruby/setup-ruby@v1
40
+ with:
41
+ ruby-version: ${{ matrix.ruby-version }}
42
+ bundler-cache: true # runs 'bundle install' and caches installed gems automatically
43
+ - name: Execute rubo command
44
+ run: bundle exec rubo
45
+ - name: Evaluate rubo threshold
46
+ run: |
47
+ count=$(cat rubocop/total-violations-count.txt)
48
+ if [[ "$count" -gt $RUBOCOP_ISSUE_THRESHOLD ]]; then
49
+ echo "Failure: Found $count RuboCop issue(s). It must have $RUBOCOP_ISSUE_THRESHOLD or less. \
50
+ Run 'rubo' and resolve the issues listed in rubocop/style-issues.html"
51
+ exit 1
52
+ else
53
+ echo "Success: Found $count RuboCop issue(s), which is less than the limit of $RUBOCOP_ISSUE_THRESHOLD"
54
+ fi
data/.rubocop.yml CHANGED
@@ -12,9 +12,3 @@ inherit_gem:
12
12
 
13
13
  Rails:
14
14
  Enabled: false
15
-
16
- Style/NumericPredicate:
17
- Enabled: false
18
-
19
- Style/Alias:
20
- Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,63 +1,87 @@
1
1
  # CHANGELOG
2
2
 
3
- Issues marked as **(Internal)** mark internal development work. Issues are tracked at https://github.com/roberts1000/rspec_starter/issues.
3
+ Issues are tracked at https://github.com/roberts1000/rspec_starter/issues. Issues marked as **(Internal)** only affect development.
4
+
5
+ ## 2.0.0 (Aug 11, 2021)
6
+
7
+ 1. [#101](../../issues/101): Remove Ruby 2.4 support.
8
+ 1. [#106](../../issues/106): Remove Ruby 2.5 support.
9
+ 1. [#109](../../issues/109): Remove support for legacy API.
10
+ 1. [#112](../../issues/112): Change `--no-xvfb` ref to `--skip-display-server` in help output.
11
+ 1. [#114](../../issues/114): Fix `quiet` and `stop_on_problem` not getting overridden through the `start` block.
12
+ 1. [#116](../../issues/116): Setup GitHub Pull Request action. **(Internal)**
13
+ 1. [#120](../../issues/120): Add `rubocop_plus` `~> 2.0` to the `Gemfile`. **(Internal)**
14
+
15
+ ## 1.8.1 (Apr 14, 2020)
16
+
17
+ 1. [#97](../../issues/97): Fix "Using the last argument as keyword" deprecation warning.
18
+
19
+ ## 1.8.0 (Apr 03, 2020)
20
+
21
+ 1. [#88](../../issues/88): Use `os ~> 1.1.0`.
22
+ 1. [#90](../../issues/90): Use `pry-byebug ~> 3.9.0`. **(Internal)**
23
+ 1. [#92](../../issues/92): Update ruby versions in `.travis.yml`. **(Internal)**
24
+
25
+ ## 1.7.2 (Dec 20, 2019)
26
+
27
+ 1. [#84](../../issues/84): Removed unneeded `/` in templates.
4
28
 
5
29
  ## 1.7.1 (Dec 13, 2019)
6
30
 
7
- 1. [#80](../../issues/80) Fix call to missing `remove_dummy` method.
31
+ 1. [#80](../../issues/80): Fix call to missing `remove_dummy` method.
8
32
 
9
33
  ## 1.7.0 (Dec 12, 2019)
10
34
 
11
- 1. [#74](../../issues/74) Make `rspec_starter --init` detect Rails engines correctly.
12
- 1. [#75](../../issues/75) Let `remove_tmp_folder` task remove the tmp folder from `dummy` apps.
35
+ 1. [#74](../../issues/74): Make `rspec_starter --init` detect Rails engines correctly.
36
+ 1. [#75](../../issues/75): Let `remove_tmp_folder` task remove the tmp folder from `dummy` apps.
13
37
 
14
38
  ## 1.6.0 (Dec 09, 2019)
15
39
 
16
- 1. [#56](../../issues/56) Move old starter code to a `legacy` folder so it can still be used. **(Internal)**
17
- 1. [#58](../../issues/58) Add step based interface.
18
- 1. [#59](../../issues/59) Use `rake ~> 13.0` for development. **(Internal)**
19
- 1. [#61](../../issues/61) Use `pry-byebug ~> 3.7.0` for development. **(Internal)**
20
- 1. [#63](../../issues/63) Modernize the CHANGELOG. **(Internal)**
21
- 1. [#66](../../issues/66) Update ruby versions and use bundler 2.0.2 in `travis.yml`. **(Internal)**
40
+ 1. [#56](../../issues/56): Move old starter code to a `legacy` folder so it can still be used. **(Internal)**
41
+ 1. [#58](../../issues/58): Add step based interface.
42
+ 1. [#59](../../issues/59): Use `rake ~> 13.0` for development. **(Internal)**
43
+ 1. [#61](../../issues/61): Use `pry-byebug ~> 3.7.0` for development. **(Internal)**
44
+ 1. [#63](../../issues/63): Modernize the CHANGELOG. **(Internal)**
45
+ 1. [#66](../../issues/66): Update ruby versions and use bundler 2.0.2 in `travis.yml`. **(Internal)**
22
46
 
23
47
  ## 1.5.0 (Feb 19, 2019)
24
48
 
25
- 1. [#51](../../issues/51) Report an exit status of 1 if DB Preparation or RSpec fails.
49
+ 1. [#51](../../issues/51): Report an exit status of 1 if DB Preparation or RSpec fails.
26
50
 
27
51
  ## 1.4.0 (Oct 12, 2018)
28
52
 
29
- 1. [#41](../../issues/41) Isolate rebuild command string into a dedicated method. **(Internal)**
30
- 1. [#43](../../issues/43) Add instructions for creating custom steps.
31
- 1. [#45](../../issues/45) Fix the database rebuild command hanging when there's too much output.
53
+ 1. [#41](../../issues/41): Isolate rebuild command string into a dedicated method. **(Internal)**
54
+ 1. [#43](../../issues/43): Add instructions for creating custom steps.
55
+ 1. [#45](../../issues/45): Fix the database rebuild command hanging when there's too much output.
32
56
 
33
57
  ## 1.3.0 (Aug 30, 2018)
34
58
 
35
- 1. [#37](../../issues/37) Change `cri` version to `~> 2.0`.
59
+ 1. [#37](../../issues/37): Change `cri` version to `~> 2.0`.
36
60
 
37
61
  ## 1.2.0 (Aug 08, 2018)
38
62
 
39
- 1. [#23](../../issues/23) Remove `rubocop_plus` from Gemfile. **(Internal)**
40
- 1. [#24](../../issues/24) Update ruby versions in `.travis.yml`. **(Internal)**
41
- 1. [#26](../../issues/26) Use `bundler` `1.16.3` in `.travis.yml`. **(Internal)**
42
- 1. [#29](../../issues/29) Use `cri` `~> 2.12.0`.
43
- 1. [#31](../../issues/31) Remove support for Ruby 2.2.
44
- 1. [#33](../../issues/33) Use `rake` `~> 12.0` in development. **(Internal)**
63
+ 1. [#23](../../issues/23): Remove `rubocop_plus` from Gemfile. **(Internal)**
64
+ 1. [#24](../../issues/24): Update ruby versions in `.travis.yml`. **(Internal)**
65
+ 1. [#26](../../issues/26): Use `bundler` `1.16.3` in `.travis.yml`. **(Internal)**
66
+ 1. [#29](../../issues/29): Use `cri` `~> 2.12.0`.
67
+ 1. [#31](../../issues/31): Remove support for Ruby 2.2.
68
+ 1. [#33](../../issues/33): Use `rake` `~> 12.0` in development. **(Internal)**
45
69
 
46
70
  ## 1.1.1 (May 06, 2018)
47
71
 
48
- 1. [#6](../../issues/6) Cleanup rubocop issues in the `start_rspec` template.
72
+ 1. [#6](../../issues/6): Cleanup rubocop issues in the `start_rspec` template.
49
73
 
50
74
  ## 1.1.0 (Feb 02, 2018)
51
75
 
52
- 1. [#5](../../issues/5) Ensure XVFB is detected correctly.
53
- 1. [#7](../../issues/7) Prepare the database when the project is a Rails engine.
54
- 1. [#9](../../issues/9) Add an `rspec_starter --init` command that installs an initial script.
55
- 1. [#11](../../issues/11) Add `rubocop_plus` gem for internal code cleanup. **(Internal)**
56
- 1. [#15](../../issues/15) Change the highlight color of the output from yellow to blue.
76
+ 1. [#5](../../issues/5): Ensure XVFB is detected correctly.
77
+ 1. [#7](../../issues/7): Prepare the database when the project is a Rails engine.
78
+ 1. [#9](../../issues/9): Add an `rspec_starter --init` command that installs an initial script.
79
+ 1. [#11](../../issues/11): Add `rubocop_plus` gem for internal code cleanup. **(Internal)**
80
+ 1. [#15](../../issues/15): Change the highlight color of the output from yellow to blue.
57
81
 
58
82
  ## 1.0.1 (May 10, 2017)
59
83
 
60
- 1. [#1](../../issues/1) Improve the logic for deciding when the database preparation step successfully completes.
84
+ 1. [#1](../../issues/1): Improve the logic for deciding when the database preparation step successfully completes.
61
85
 
62
86
  ## 1.0.0 (Apr 06, 2017)
63
87
 
data/Gemfile CHANGED
@@ -2,3 +2,7 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in rspec_starter.gemspec
4
4
  gemspec
5
+
6
+ group :development do
7
+ gem 'rubocop_plus', '~> 2.0', require: false
8
+ end
data/LICENSE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2017
3
+ Copyright (c) 2021 roberts1000
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
data/README.md CHANGED
@@ -6,13 +6,16 @@ rspec_starter also helps eliminate differences between operating systems. For ex
6
6
 
7
7
  rspec_starter currently works natively for Rails applications, Rails Engines and raw ruby applications/gems that are not database dependent. However, rspec_starter is flexible and you can add your own tasks to support other types of projects.
8
8
 
9
- ## Version Strategy
9
+ ## Versioning Strategy
10
10
 
11
- Releases are versioned using [semver 2.0.0](https://semver.org/spec/v2.0.0.html).
11
+ Releases are versioned using [SemVer 2.0.0](https://semver.org/spec/v2.0.0.html) with the following caveats:
12
+
13
+ 1. Support for a Ruby version, that reaches EOL, is removed in a major or minor release.
14
+ 1. Support for a Ruby on Rails version, that reaches EOL, is removed in a major or minor release.
12
15
 
13
16
  ## Supported Ruby Versions
14
17
 
15
- 2.3.0+
18
+ 2.6.0+
16
19
 
17
20
  ## Installation
18
21
 
@@ -231,5 +234,4 @@ Run `bin/start_rspec --help` to see a list of command line options. Command line
231
234
 
232
235
  ## Contributing
233
236
 
234
- Bug reports and pull requests are welcome on GitHub at https://github.com/roberts1000/rspec_starter.
235
-
237
+ Bug reports and pull requests are welcome on the rspec_starter [issues](https://github.com/roberts1000/rspec_starter) page.
data/Rakefile CHANGED
@@ -5,8 +5,7 @@ RSpec::Core::RakeTask.new(:spec)
5
5
 
6
6
  task :default => :spec
7
7
 
8
- # Adds the ability to run 'rake console' in the terminal and have a console
9
- # that already knows about the gem
8
+ desc "Start a Pry console with rspec_starter loaded (run bin/console to start an IRB console)"
10
9
  task :console do
11
10
  exec "pry -r rspec_starter -I ./lib"
12
11
  # exec "irb -r didit_rails_framework -I ./lib"
data/bin/console CHANGED
@@ -6,5 +6,7 @@ require "rspec_starter"
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
8
8
 
9
- require "pry"
10
- Pry.start
9
+ # Run 'rake console' to start a pry console.
10
+
11
+ require "irb"
12
+ IRB.start
data/exe/rspec_starter CHANGED
@@ -65,12 +65,9 @@ command = Cri::Command.define do
65
65
  exit 0
66
66
  end
67
67
 
68
- run do |options, args, cmd|
69
- end
68
+ run
70
69
  end
71
70
  # rubocop:enable Metrics/BlockLength
72
71
 
73
- begin
74
- command.run(ARGV)
75
- exit 0
76
- end
72
+ command.run(ARGV)
73
+ exit 0
data/lib/rspec_starter.rb CHANGED
@@ -31,17 +31,15 @@ require 'rspec_starter/tasks/remove_tmp_folder'
31
31
  require 'rspec_starter/tasks/start_rspec'
32
32
  require 'rspec_starter/tasks/verify_display_server'
33
33
 
34
- require 'rspec_starter/legacy'
35
-
36
34
  # Setup pry for development when running "rake console". Guard against load
37
35
  # errors in production (since pry is only loaded as a DEVELOPMENT dependency
38
36
  # in the .gemspec)
39
- # rubocop:disable Lint/HandleExceptions
37
+ # rubocop:disable Lint/SuppressedException
40
38
  begin
41
39
  require "pry"
42
40
  rescue LoadError
43
41
  end
44
- # rubocop:enable Lint/HandleExceptions
42
+ # rubocop:enable Lint/SuppressedException
45
43
 
46
44
  # The main entry point for the RspecStarter gem. The 'bin/start_rspec' file contains a block of code like this:
47
45
  #
@@ -54,9 +52,8 @@ end
54
52
  # The start method that is executed is show below. The call to 'instance_eval(&block)' below is the special sauce that
55
53
  # makes 'self' equal the RspecStarter module inside the block.
56
54
  module RspecStarter
57
- def self.start(defaults={}, &block)
58
- # If a block is missing, then the user is using the old method based starter.
59
- return invoke_legacy_starter(defaults) unless block_given?
55
+ def self.start(&block)
56
+ show_missing_start_block_error_and_exit unless block
60
57
 
61
58
  # Loads the information from the bin/start_rspec file and loads/parses the options. Provides info to the @runner.
62
59
  @environment = Environment.new(ARGV, &block)
@@ -80,7 +77,18 @@ module RspecStarter
80
77
  end
81
78
 
82
79
  # If we get here RSpec has been started and the rspec_starter's job is done.
83
- exit(0)
80
+ exit 0
84
81
  end
85
82
  end
83
+
84
+ def self.show_missing_start_block_error_and_exit
85
+ msg = "Error: RspecStarter.start was called without a block. It should be called like this: \n\n" \
86
+ " RspecStarter.start do\n" \
87
+ " command \"echo 'something'\"\n" \
88
+ " task :some_task_name\n" \
89
+ " # ... more tasks and commands ...\n" \
90
+ " end".colorize(:red)
91
+ puts msg
92
+ exit 1
93
+ end
86
94
  end
@@ -45,7 +45,7 @@ module RspecStarter
45
45
  puts @stdout
46
46
  puts @stderr
47
47
  puts "There was an error running '#{@command_string}'. It returned with exit status #{@status.exitstatus}.\n" \
48
- "See the output above for details or manually run the command for more information.".colorize(:red)
48
+ "See the output above for details or manually run the command for more information.".colorize(:red)
49
49
  end
50
50
 
51
51
  def colored_command_string
@@ -42,17 +42,17 @@ module RspecStarter
42
42
  end
43
43
 
44
44
  def self.write_help_examples_section(colored_script_name)
45
- # rubocop:disable Metrics/LineLength
46
45
  puts "\nExamples:"
47
46
  puts " #{colored_script_name} #{'spec/features'.colorize(:light_blue)} (only run specs in the specs/features folder)"
47
+ # rubocop:disable Layout/LineLength
48
48
  puts " #{colored_script_name} #{'spec/features/some_spec:53'.colorize(:light_blue)} (run the spec on line 53 of the spec/features_some_spec.rb file)"
49
- puts " #{colored_script_name} #{'--no-xvfb'.colorize(:light_blue)} #{'spec/requests/some_spec'.colorize(:light_blue)} (don't start XVFB since it's not needed for request specs)"
49
+ puts " #{colored_script_name} #{'--skip-display-server'.colorize(:light_blue)} #{'spec/requests/some_spec'.colorize(:light_blue)} (don't start XVFB since it's not needed for request specs)"
50
+ # rubocop:enable Layout/LineLength
50
51
  puts " #{'SIMPLECOV_FORMATTER=rcov'.colorize(:light_blue)} #{colored_script_name} (use with environment variables)\n"
51
- # rubocop:enable Metrics/LineLength
52
52
  end
53
53
 
54
54
  def self.write_available_tasks
55
- subclasses = ObjectSpace.each_object(Class).select { |klass| klass < RspecStarterTask }.sort { |a, b| a.name <=> b.name }
55
+ subclasses = ObjectSpace.each_object(Class).select { |klass| klass < RspecStarterTask }.sort_by(&:name)
56
56
 
57
57
  puts "\nAvailable Tasks:"
58
58
  subclasses.each do |klass|
@@ -62,26 +62,32 @@ module RspecStarter
62
62
  end
63
63
 
64
64
  def self.write_task_info(colored_script_name)
65
- puts "\nTask Options:"
66
- puts " These options can be used inside the #{colored_script_name} file on #{"task".colorize(:light_blue)} lines."
67
- puts " This list is computed dynamically based on the tasks that are enabled in the #{colored_script_name} file."
68
- puts " Every task accepts the following options:"
69
- puts " #{"quiet".colorize(:light_blue)} (true/false - Tell the task to be verbose. Some tasks may disregard at times.)"
70
- puts " #{"stop_on_problem".colorize(:light_blue)} (true/false - Tell the task to stop startup if it encounters a problem.)"
71
- puts ""
65
+ write_task_info_header(colored_script_name)
72
66
 
73
- sorted_task_options = Hash[@environment.options.registered_task_options.sort_by do |klass, options|
67
+ sorted_task_options = @environment.options.registered_task_options.sort_by do |klass, _options|
74
68
  RspecStarterTask.name_for_class(klass)
75
- end]
76
-
77
- sorted_task_options.each do |klass, options|
78
- dsl_options = options.select(&:is_dsl_option?).sort {|a,b| a.name <=> b.name }
79
- unless dsl_options.empty?
80
- puts " :#{RspecStarterTask.name_for_class(klass).to_s.colorize(:light_blue)}"
81
- dsl_options.each do |option|
82
- puts " #{option.name.colorize(:light_blue)} (#{option.description})"
83
- end
69
+ end
70
+
71
+ sorted_task_options.to_h.each do |klass, options|
72
+ dsl_options = options.select(&:is_dsl_option?).sort_by(&:name)
73
+ next if dsl_options.empty?
74
+
75
+ puts " :#{RspecStarterTask.name_for_class(klass).to_s.colorize(:light_blue)}"
76
+ dsl_options.each do |option|
77
+ puts " #{option.name.colorize(:light_blue)} (#{option.description})"
84
78
  end
85
79
  end
86
80
  end
81
+
82
+ def self.write_task_info_header(colored_script_name)
83
+ puts "\nTask Options:"
84
+ puts " These options can be used inside the #{colored_script_name} file on #{'task'.colorize(:light_blue)} lines."
85
+ puts " This list is computed dynamically based on the tasks that are enabled in the #{colored_script_name} file."
86
+ puts " Every task accepts the following options:"
87
+ # rubocop:disable Layout/LineLength
88
+ puts " #{'quiet'.colorize(:light_blue)} (true/false - Tell the task to be verbose. Some tasks may disregard at times.)"
89
+ puts " #{'stop_on_problem'.colorize(:light_blue)} (true/false - Tell the task to stop startup if it encounters a problem.)"
90
+ # rubocop:enable Layout/LineLength
91
+ puts ""
92
+ end
87
93
  end
@@ -3,7 +3,7 @@ module RspecStarter
3
3
  class Option
4
4
  attr_reader :name, :default, :description, :key, :owner, :switch, :switch_description
5
5
 
6
- def initialize(name:, default:, description: "", owner:, switch:, switch_description: "")
6
+ def initialize(name:, default:, owner:, switch:, description: "", switch_description: "")
7
7
  @owner = owner
8
8
  @switch = switch
9
9
  @switch_description = switch_description
@@ -62,14 +62,14 @@ module RspecStarter
62
62
  return unless switch.nil? && name.nil?
63
63
 
64
64
  raise "#{owner.name}#register_options is trying to create an option but 'name:' or 'switch:' are not specified. " \
65
- "At least one must be specified."
65
+ "At least one must be specified."
66
66
  end
67
67
 
68
68
  def validate_default_is_true_false_for_switch
69
69
  return unless switch && ![true, false].include?(default)
70
70
 
71
71
  raise "#{owner.name}#register_options is trying to create an option for switch #{switch}. Options with switches " \
72
- "can only return true/false. Set the 'default' argument to true or false for the option."
72
+ "can only return true/false. Set the 'default' argument to true or false for the option."
73
73
  end
74
74
 
75
75
  def validate_switch_is_like_name
@@ -77,8 +77,8 @@ module RspecStarter
77
77
  return if name == @simplified_switch
78
78
 
79
79
  raise "#{owner.name}#register_options is trying to create an option with name #{name} and switch #{switch}. " \
80
- "The switch must be the same as the name when hyphens are converted to underscores and leading hyphens " \
81
- "are removed."
80
+ "The switch must be the same as the name when hyphens are converted to underscores and leading hyphens " \
81
+ "are removed."
82
82
  end
83
83
  end
84
84
  end
@@ -36,7 +36,7 @@ module RspecStarter
36
36
  # If name is specified, this option can be used inside the start block on a task.
37
37
  def register_task_option(klass, name: nil, default: nil, description: "", switch: nil, switch_description: "")
38
38
  new_option = RspecStarter::Option.new(name: name, default: default, description: description, owner: klass, switch: switch,
39
- switch_description: switch_description)
39
+ switch_description: switch_description)
40
40
  @registered_task_options[klass] << new_option
41
41
  end
42
42
 
@@ -11,20 +11,20 @@
11
11
  # that determines whether a problem should cause the entire start-up process to stop when the task encounters a problem.
12
12
  class RspecStarterTask < RspecStarterStep
13
13
  def self.register_option(hash)
14
- @options_registrar.register_task_option(self, hash)
14
+ @options_registrar.register_task_option(self, **hash)
15
15
  end
16
16
 
17
17
  def self.description
18
18
  ""
19
19
  end
20
20
 
21
- private
22
-
23
21
  # Convert something like VerifyDisplayServer to :verify_display_server
24
22
  def self.name_for_class(klass)
25
23
  klass.name.underscore.to_sym
26
24
  end
27
25
 
26
+ private
27
+
28
28
  def print_starting_message
29
29
  print "#{@starting_message} ..."
30
30
  end
@@ -1,5 +1,5 @@
1
1
  module RspecStarter
2
- # TaskContext's are created to when parsing the RspecStater.start block. They hold the args and Task class name. They are
2
+ # TaskContext's are created to when parsing the RspecStater.start block. They hold the ARGS and Task class name. They are
3
3
  # asked to create instances of Task subclasses from this information when it is time to execute. The also resolve the options
4
4
  # that each Task is allowed to access.
5
5
  class TaskContext < StepContext
@@ -25,37 +25,39 @@ module RspecStarter
25
25
 
26
26
  private
27
27
 
28
+ def registered_task_options
29
+ environment.options.registered_task_option(@step_class)
30
+ end
31
+
28
32
  def build_options
29
33
  options = super
30
- add_defaults_to_options(options)
31
- apply_args_to_options(options)
32
- apply_command_line_switches_to_options(options)
34
+ add_task_option_defaults(options)
35
+ apply_start_block_option_overrides(options)
36
+ apply_command_line_switch_overrides(options)
33
37
  options
34
38
  end
35
39
 
36
- def add_defaults_to_options(options)
37
- registered_options = environment.options.registered_task_option(@step_class)
38
- registered_options.each { |option| options.add(option.key, option.default) }
40
+ # Each Task can define options that are unique to the task, along with default values for those options. Add those
41
+ # options and values now. (The values may be overridden by the user.)
42
+ def add_task_option_defaults(options)
43
+ registered_task_options.each { |option| options.add(option.key, option.default) }
39
44
  end
40
45
 
41
- def apply_args_to_options(options)
42
- registered_options = environment.options.registered_task_option(@step_class)
43
- dsl_option_names = registered_options.select(&:is_dsl_option?).collect { |option| option.name.to_sym }
44
- @requested_args.each do |key, value|
45
- next unless dsl_option_names.include?(key)
46
-
47
- options.update(key, value, add_missing: false)
48
- end
46
+ # Users can specify options for each task inside their project's "start" block. These options can override the default
47
+ # value for the global options that all tasks have, or the task specific options that a task defines by calling
48
+ # register_task_option. If the user tries to define an option that the task doesn't understand, it is ignored.
49
+ def apply_start_block_option_overrides(options)
50
+ @requested_args.each { |option_name, option_value| options.update(option_name, option_value, add_missing: false) }
49
51
  end
50
52
 
51
- def apply_command_line_switches_to_options(options)
52
- registered_options = environment.options.registered_task_option(@step_class)
53
+ # Command line switches can also affect options. Adjust an options that are impacted by command line switches that are
54
+ # present.
55
+ def apply_command_line_switch_overrides(options)
53
56
  present_switches = environment.options.present_switches
54
- registered_options.each do |option|
55
- # The switch could be nil for the option, which means the step isn't registering a switch for this option. The step
56
- # developer just wants to register an option for the dsl (which is applied earlier).
57
- if option.switch
58
- options.update(option.key, !option.default, add_missing: false) if present_switches.include?(option.switch)
57
+ registered_task_options.each do |option|
58
+ # present_switches is a list of all valid switches that have been supplied by the user.
59
+ if option.switch && present_switches.include?(option.switch)
60
+ options.update(option.key, !option.default, add_missing: false)
59
61
  end
60
62
  end
61
63
  end
@@ -7,10 +7,10 @@ class RebuildRailsAppDatabase < RspecStarterTask
7
7
 
8
8
  def self.register_options
9
9
  register_option default: false, switch: '--skip-db-prep',
10
- switch_description: "DO NOT prepare the Rails application database"
10
+ switch_description: "DO NOT prepare the Rails application database"
11
11
  register_option name: "command",
12
- default: "DISABLE_DATABASE_ENVIRONMENT_CHECK=1 RAILS_ENV=test rake db:drop db:create db:migrate",
13
- description: "A command string that is used to rebuild the database."
12
+ default: "DISABLE_DATABASE_ENVIRONMENT_CHECK=1 RAILS_ENV=test rake db:drop db:create db:migrate",
13
+ description: "A command string that is used to rebuild the database."
14
14
  end
15
15
 
16
16
  def should_skip?
@@ -37,7 +37,7 @@ class RebuildRailsAppDatabase < RspecStarterTask
37
37
  puts @stdout
38
38
  puts @stderr
39
39
  puts "\n\nThere was an error rebuilding the test database. See the output above for details " \
40
- "or manually run '#{options.command}' for more information.".colorize(:red)
40
+ "or manually run '#{options.command}' for more information.".colorize(:red)
41
41
  end
42
42
 
43
43
  private
@@ -6,11 +6,11 @@ class RemoveTmpFolder < RspecStarterTask
6
6
 
7
7
  def self.register_options
8
8
  register_option name: "remove_dummy_tmp",
9
- default: false,
10
- description: "true/false to remove the tmp folder for the dummy app too."
9
+ default: false,
10
+ description: "true/false to remove the tmp folder for the dummy app too."
11
11
  register_option name: "dummy_path",
12
- default: "spec/dummy",
13
- description: "Relative path to the dummy folder."
12
+ default: "spec/dummy",
13
+ description: "Relative path to the dummy folder."
14
14
  end
15
15
 
16
16
  # Let subsequent steps run if this task runs into a problem deleting the tmp folder. This value can be overridden in
@@ -6,10 +6,10 @@ class StartRspec < RspecStarterTask
6
6
 
7
7
  def self.register_options
8
8
  register_option name: "skip_display_server", default: false, switch: '--skip-display-server',
9
- switch_description: "DO NOT check for a display server",
10
- description: "true/false to enable/disable starting the display server"
9
+ switch_description: "DO NOT check for a display server",
10
+ description: "true/false to enable/disable starting the display server"
11
11
  register_option name: "command", default: "bundle exec rspec",
12
- description: "A command string that is used to start RSpec."
12
+ description: "A command string that is used to start RSpec."
13
13
  end
14
14
 
15
15
  def self.default_quiet
@@ -56,7 +56,7 @@ class StartRspec < RspecStarterTask
56
56
 
57
57
  def determine_command
58
58
  cmd = enhanced_command
59
- options.rspec_args_string.empty? ? cmd : cmd + " " + options.rspec_args_string
59
+ options.rspec_args_string.empty? ? cmd : "#{cmd} #{options.rspec_args_string}"
60
60
  end
61
61
 
62
62
  # Returns a string that will either be 'xvfb-run bundle exec rspec' or 'bundle exec rspec'
@@ -1,3 +1,3 @@
1
1
  module RspecStarter
2
- VERSION = "1.7.1".freeze
2
+ VERSION = "2.0.0".freeze
3
3
  end
@@ -12,7 +12,7 @@ require "bundler/setup"
12
12
  require "rspec_starter"
13
13
 
14
14
  # The path to the application's root folder.
15
- APP_ROOT = Pathname.new File.expand_path('../', __dir__)
15
+ APP_ROOT = Pathname.new File.expand_path('..', __dir__)
16
16
 
17
17
  # Create a custom task. For more information about custom tasks, see
18
18
  # https://github.com/roberts1000/rspec_starter. Once defined, add
@@ -12,7 +12,7 @@ require "bundler/setup"
12
12
  require "rspec_starter"
13
13
 
14
14
  # The path to the application's root folder.
15
- APP_ROOT = Pathname.new File.expand_path('../', __dir__)
15
+ APP_ROOT = Pathname.new File.expand_path('..', __dir__)
16
16
 
17
17
  # Create a custom task. For more information about custom tasks, see
18
18
  # https://github.com/roberts1000/rspec_starter. Once defined, add
@@ -12,7 +12,7 @@ require "bundler/setup"
12
12
  require "rspec_starter"
13
13
 
14
14
  # The path to the application's root folder.
15
- APP_ROOT = Pathname.new File.expand_path('../', __dir__)
15
+ APP_ROOT = Pathname.new File.expand_path('..', __dir__)
16
16
 
17
17
  # Create a custom task. For more information about custom tasks, see
18
18
  # https://github.com/roberts1000/rspec_starter. Once defined, add
@@ -5,7 +5,7 @@ require 'rspec_starter/version'
5
5
  Gem::Specification.new do |spec|
6
6
  spec.name = "rspec_starter"
7
7
  spec.version = RspecStarter::VERSION
8
- spec.authors = ["Roberts"]
8
+ spec.authors = ["roberts1000"]
9
9
  spec.email = ["roberts@corlewsolutions.com"]
10
10
 
11
11
  spec.summary = "A Ruby gem that helps run RSpec in a standard manner."
@@ -19,13 +19,15 @@ Gem::Specification.new do |spec|
19
19
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
20
  spec.require_paths = ["lib"]
21
21
 
22
+ spec.required_ruby_version = '>= 2.6.0'
23
+
22
24
  spec.add_development_dependency "bundler", "~> 2.0"
23
- spec.add_development_dependency "pry-byebug", "~> 3.7.0"
25
+ spec.add_development_dependency "pry-byebug", "~> 3.9.0"
24
26
  spec.add_development_dependency "rake", "~> 13.0"
25
27
  spec.add_development_dependency "rspec", "~> 3.0"
26
28
 
27
29
  spec.add_dependency "activesupport", ">= 5.2.2"
28
30
  spec.add_dependency "colorize", "~> 0.8.1"
29
31
  spec.add_dependency "cri", "~> 2.0"
30
- spec.add_dependency "os", "~> 1.0.0"
32
+ spec.add_dependency "os", "~> 1.1.0"
31
33
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec_starter
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.1
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
- - Roberts
7
+ - roberts1000
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-12-13 00:00:00.000000000 Z
11
+ date: 2021-08-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: 3.7.0
33
+ version: 3.9.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: 3.7.0
40
+ version: 3.9.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -114,14 +114,14 @@ dependencies:
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 1.0.0
117
+ version: 1.1.0
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 1.0.0
124
+ version: 1.1.0
125
125
  description: A Ruby gem that helps run RSpec in a standard manner.
126
126
  email:
127
127
  - roberts@corlewsolutions.com
@@ -130,10 +130,10 @@ executables:
130
130
  extensions: []
131
131
  extra_rdoc_files: []
132
132
  files:
133
+ - ".github/workflows/check_pull_request.yml"
133
134
  - ".gitignore"
134
135
  - ".rspec"
135
136
  - ".rubocop.yml"
136
- - ".travis.yml"
137
137
  - CHANGELOG.md
138
138
  - Gemfile
139
139
  - LICENSE.md
@@ -152,14 +152,6 @@ files:
152
152
  - lib/rspec_starter/help.rb
153
153
  - lib/rspec_starter/helpers.rb
154
154
  - lib/rspec_starter/helpers/which.rb
155
- - lib/rspec_starter/legacy.rb
156
- - lib/rspec_starter/legacy/help.rb
157
- - lib/rspec_starter/legacy/legacy_runner.rb
158
- - lib/rspec_starter/legacy/steps/invoke_rspec_step.rb
159
- - lib/rspec_starter/legacy/steps/prepare_database_step.rb
160
- - lib/rspec_starter/legacy/steps/remove_tmp_folder_step.rb
161
- - lib/rspec_starter/legacy/steps/step.rb
162
- - lib/rspec_starter/legacy/steps/verify_xvfb_step.rb
163
155
  - lib/rspec_starter/option.rb
164
156
  - lib/rspec_starter/options.rb
165
157
  - lib/rspec_starter/rspec_starter_task.rb
@@ -188,14 +180,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
188
180
  requirements:
189
181
  - - ">="
190
182
  - !ruby/object:Gem::Version
191
- version: '0'
183
+ version: 2.6.0
192
184
  required_rubygems_version: !ruby/object:Gem::Requirement
193
185
  requirements:
194
186
  - - ">="
195
187
  - !ruby/object:Gem::Version
196
188
  version: '0'
197
189
  requirements: []
198
- rubygems_version: 3.0.4
190
+ rubygems_version: 3.2.24
199
191
  signing_key:
200
192
  specification_version: 4
201
193
  summary: A Ruby gem that helps run RSpec in a standard manner.
data/.travis.yml DELETED
@@ -1,12 +0,0 @@
1
- language: ruby
2
- cache: bundler
3
- rvm:
4
- - 2.3.8
5
- - 2.4.9
6
- - 2.5.7
7
- - 2.6.5
8
- before_install: gem install bundler -v 2.0.2
9
- notifications:
10
- email:
11
- on_success: never # default: change
12
- on_failure: never # default: always
@@ -1,16 +0,0 @@
1
- # This module loads the legacy RspecStarter code that uses the non-block DSL. It will be removed in 2.0.0.
2
- # The file is loaded when RspecStarter starts, but most of the legacy code is not loaded until the
3
- # 'invoke_legacy_starter' method is called.
4
- module RspecStarter
5
- def self.invoke_legacy_starter(defaults)
6
- require 'rspec_starter/legacy/legacy_runner'
7
- # puts "[DEPRECATION NOTICE] Your #{helpers.starter_script_file_name} file uses an old method for starting RSpec.\n" \
8
- # "RspecStarter 1.6.0 introduced a new interface that is faster and more flexible.\n" \
9
- # "To upgrade:\n" \
10
- # " 1. Run 'rspec_starter --init' to install a new bin/start_rspec file.\n" \
11
- # " 2. Your old bin/start_rspec will be renamed to bin/start_rspec.bak. If you customized\n" \
12
- # " this file, open it up and consider moving the changes to the new bin/start_rspec file.\n" \
13
- # " See https://github.com/roberts1000/rspec_starter for instructions on the new interface.\n".colorize(:yellow)
14
- LegacyRunner.new(defaults).run
15
- end
16
- end
@@ -1,40 +0,0 @@
1
- module RspecStarter
2
- # Method that support the help option on the bin/start_rspec script.
3
- module Help
4
- def should_show_help?
5
- ARGV.any? { |option| option.include? "--help" }
6
- end
7
-
8
- def show_help
9
- # Figure out the file name that invoked the rspec_starter helper. This is the name of the script; it be called anything.
10
- script_name = calling_file_name
11
- puts "Usage: #{script_name.colorize(:light_blue)} #{'[options] [options for RSpec]'.colorize(:light_blue)}\n"
12
- puts " #{script_name} will look for its own options first then pass any remaining options to rspec"
13
-
14
- # rubocop:disable Metrics/LineLength
15
- puts "\nOptions: (run 'rspec --help' to see RSpec's options)"
16
- puts " #{'--no-xvfb'.colorize(:light_blue)} DO NOT run XVFB (this can speed up RSpec when running tests that don't need XVFB)"
17
- puts " #{'--no-prep'.colorize(:light_blue)} DO NOT prepare the test database (can speed up testing if you know the DB is clean)"
18
-
19
- puts "\nExamples:"
20
- puts " #{script_name.colorize(:light_blue)} #{'spec/features'.colorize(:light_blue)} (only run specs in the specs/features folder)"
21
- puts " #{script_name.colorize(:light_blue)} #{'spec/features/some_spec:53'.colorize(:light_blue)} (run the spec on line 53 of the spec/features_some_spec.rb file)"
22
- puts " #{script_name.colorize(:light_blue)} #{'--no-xvfb'.colorize(:light_blue)} #{'spec/requests/some_spec'.colorize(:light_blue)} (don't start XVFB since it's not needed for request specs)"
23
- puts " #{'SIMPLECOV_FORMATTER=rcov'.colorize(:light_blue)} #{script_name.colorize(:light_blue)} (use with environment variables)\n"
24
- # rubocop:enable Metrics/LineLength
25
- end
26
-
27
- # This is ugly, but it gives us some added flexibility. Users can invoke the rspec_starter method from any script or
28
- # executable. This method attempts to find out the name of the script/exectuable.
29
- # "caller" returns the method stack, and because of the location of this file in the gem, we happen to be the 4th item in the
30
- # the array (hence "caller[3]" below).
31
- #
32
- # This method may not return a pretty result in all cases, but it's decent if the user has defined a script in their project
33
- # (possibly in the bin folder, or root of the project).
34
- def calling_file_name
35
- # rubocop:disable Performance/Caller
36
- caller[3].split(":")[0]
37
- # rubocop:enable Performance/Caller
38
- end
39
- end
40
- end
@@ -1,90 +0,0 @@
1
- require 'pathname'
2
- require 'open3'
3
-
4
- require_relative 'help'
5
- require_relative 'steps/step'
6
- require_relative 'steps/verify_xvfb_step'
7
- require_relative 'steps/prepare_database_step'
8
- require_relative 'steps/remove_tmp_folder_step'
9
- require_relative 'steps/invoke_rspec_step'
10
-
11
- module RspecStarter
12
- # This is a simple class that encapulates the process of running RSpec. When a Runner is created, it creates a set of
13
- # steps that will be executed, in order, when the 'run' method is invoked. Each step encapsulates an action that can be
14
- # taken to help invoke Rspec. Steps are typically independent do not depend on information from other steps. However
15
- # this is not a hard rule. If more complex steps are needed, feel free to create them. Each steps knows about the main
16
- # runner object, so the runner object is a good place to store shared info.
17
- class LegacyRunner
18
- include Help
19
- attr_reader :xvfb_installed, :step_num, :steps
20
-
21
- def initialize(defaults)
22
- @steps = []
23
- @step_num = 1
24
- @xvfb_installed = RspecStarter.which("xvfb-run")
25
- @prep_db_step = PrepareDatabaseStep.new(defaults, self)
26
- @run_rspec_step = InvokeRspecStep.new(defaults, self)
27
- @steps << VerifyXvfbStep.new(defaults, self)
28
- @steps << @prep_db_step
29
- @steps << RemoveTmpFolderStep.new(defaults, self)
30
- @steps << @run_rspec_step
31
- end
32
-
33
- def run
34
- return show_help if should_show_help? # If we show help, exit and don't do anything else.
35
-
36
- @steps.each do |step|
37
- next unless step.should_execute?
38
-
39
- step.execute
40
- @step_num += 1
41
- break if step.failed?
42
- end
43
-
44
- finalize_exit
45
- end
46
-
47
- def project_is_rails_app?
48
- File.file?(File.join(Dir.pwd, 'config', 'application.rb'))
49
- end
50
-
51
- def project_is_rails_engine?
52
- return false unless project_has_lib_dir?
53
-
54
- Dir["#{Dir.pwd}/lib/**/*.rb"].each do |file|
55
- return true if File.readlines(file).detect { |line| line.match(/\s*class\s+.*<\s+::Rails::Engine/) }
56
- end
57
- false
58
- end
59
-
60
- def project_has_lib_dir?
61
- Dir.exist?("#{Dir.pwd}/lib")
62
- end
63
-
64
- def operating_system_name
65
- result = `uname`
66
- return 'Linux' if result.include?('Linux')
67
- return 'MacOS' if result.include?('Darwin')
68
-
69
- 'Unknown'
70
- end
71
-
72
- def is_linux?
73
- operating_system_name == 'Linux'
74
- end
75
-
76
- def is_mac?
77
- operating_system_name == 'MacOS'
78
- end
79
-
80
- def xvfb_installed?
81
- @xvfb_installed
82
- end
83
-
84
- def finalize_exit
85
- exit(1) if @run_rspec_step.rspec_exit_status.nonzero?
86
- exit(1) if @prep_db_step.exit_status.nonzero?
87
- exit(0)
88
- end
89
- end
90
- end
@@ -1,50 +0,0 @@
1
- module RspecStarter
2
- # The step that actually starts the RSpec.
3
- class InvokeRspecStep < RspecStarter::Step
4
- attr_reader :rspec_exit_status
5
-
6
- def initialize(defaults, runner)
7
- super(runner)
8
-
9
- @allow_xvfb = defaults.fetch(:allow_xvfb, true)
10
- @relevant_options = ["--no-xvfb"]
11
- @success_or_skipped = nil # Will be updated once step executes
12
- @rspec_exit_status = nil # Will be updated once step executes
13
- @user_wants_to_skip_xvfb = ARGV.any? { |option| option.include?("--no-xvfb") }
14
- init_rspec_options
15
- end
16
-
17
- def init_rspec_options
18
- step_options = []
19
- @runner.steps.each { |step| step_options.concat(step.relevant_options) }
20
- @rspec_options = ARGV - step_options.to_a
21
- end
22
-
23
- def should_execute?
24
- true
25
- end
26
-
27
- def failed?
28
- !@success_or_skipped
29
- end
30
-
31
- def execute
32
- cmd = command
33
- cmd = "#{cmd} #{@rspec_options.join(' ')}" unless @rspec_options.empty?
34
- puts "[#{@runner.step_num}] Running specs with '#{cmd.colorize(:light_blue)}' ...\n\n"
35
- system cmd
36
- @rspec_exit_status = $CHILD_STATUS.exitstatus
37
- @success_or_skipped = true
38
- end
39
-
40
- # Returns a string that will either be 'xvfb-run bundle exec rspec' or 'bundle exec rspec'
41
- def command
42
- base = "bundle exec rspec"
43
- return base if @runner.is_mac?
44
- return base unless @allow_xvfb
45
- return base if @user_wants_to_skip_xvfb
46
-
47
- @runner.xvfb_installed? ? "xvfb-run #{base}" : base
48
- end
49
- end
50
- end
@@ -1,60 +0,0 @@
1
- module RspecStarter
2
- # The steps that destorys and rebuilds the DB before running RSpec.
3
- class PrepareDatabaseStep < RspecStarter::Step
4
- attr_reader :exit_status
5
-
6
- def initialize(defaults, runner)
7
- super(runner)
8
-
9
- @prepare_database = defaults.fetch(:prepare_db, true)
10
- @relevant_options << '--no-prep-db'
11
- @user_wants_to_skip = ARGV.any? { |option| option.include?("--no-prep-db") }
12
- @success_or_skipped = nil # Will be updated once step executes
13
- @exit_status = 0 # Will be updated once step executes
14
- end
15
-
16
- def failed?
17
- !@success_or_skipped
18
- end
19
-
20
- def should_execute?
21
- return false if @user_wants_to_skip
22
- return false unless @prepare_database
23
-
24
- @runner.project_is_rails_app? || @runner.project_is_rails_engine?
25
- end
26
-
27
- def execute
28
- return @success_or_skipped = true if should_skip?
29
-
30
- rebuild_cmd = rebuild_command
31
- print "[#{@runner.step_num}] Preparing the test database with '#{rebuild_cmd.colorize(:light_blue)}' ... "
32
- _stdout, stderr, exit_status = Open3.capture3(rebuild_cmd)
33
- @exit_status = exit_status.exitstatus
34
- @success_or_skipped = successful?(stderr)
35
-
36
- if @success_or_skipped
37
- puts "Success".colorize(:green)
38
- else
39
- puts "Fail".colorize(:red) + "\n\n"
40
- puts stderr
41
- puts "\n\nThere was an error rebuilding the test database. See the output above for details.".colorize(:red)
42
- puts "or manually run '#{rebuild_cmd}' for more information.".colorize(:red)
43
- end
44
- end
45
-
46
- private
47
-
48
- def rebuild_command
49
- "rake db:drop db:create db:migrate RAILS_ENV=test"
50
- end
51
-
52
- # Simply checking the exitstatus isn't good enough. When rake aborts due to a bug, it will still
53
- # return a zero exit status. We need to see if 'rake aborted!' has been written to the output.
54
- def successful?(stderr)
55
- return false if @exit_status.nonzero?
56
-
57
- !stderr.include?("rake aborted!")
58
- end
59
- end
60
- end
@@ -1,46 +0,0 @@
1
- module RspecStarter
2
- # The step that removes the tmp folder.
3
- class RemoveTmpFolderStep < RspecStarter::Step
4
- def initialize(defaults, runner)
5
- super(runner)
6
-
7
- @remove_tmp_folder = defaults.fetch(:remove_tmp, true)
8
- @runner = runner
9
- @relevant_options << "--no-remove-tmp"
10
- @user_wants_to_skip_removal = ARGV.any? { |option| option.include?("--no-remove-tmp") }
11
- @success_or_skipped = nil # Will be updated once step executes
12
- end
13
-
14
- def failed?
15
- !@success_or_skipped
16
- end
17
-
18
- def should_execute?
19
- return false if @user_wants_to_skip_removal
20
-
21
- @remove_tmp_folder
22
- end
23
-
24
- def execute
25
- return @success_or_skipped = true unless should_execute?
26
-
27
- existed_before = tmp_folder_exists?
28
-
29
- print "[#{@runner.step_num}] Removing #{'tmp'.colorize(:light_blue)} folder ... "
30
- system "rm -rf tmp/"
31
-
32
- if tmp_folder_exists?
33
- @succss_or_skipped = false
34
- puts "Failed (The tmp folder could not be removed.)".red
35
- else
36
- @success_or_skipped = true
37
- info = existed_before ? "" : " (the tmp folder didn't exist)"
38
- puts "Success!!#{info}".colorize(:green)
39
- end
40
- end
41
-
42
- def tmp_folder_exists?
43
- File.exist?(File.join(Dir.pwd, "tmp"))
44
- end
45
- end
46
- end
@@ -1,15 +0,0 @@
1
- module RspecStarter
2
- # Abstract super class for a step.
3
- class Step
4
- attr_reader :relevant_options
5
-
6
- def initialize(runner)
7
- @runner = runner
8
- @relevant_options = []
9
- end
10
-
11
- def should_skip?
12
- !should_execute?
13
- end
14
- end
15
- end
@@ -1,49 +0,0 @@
1
- module RspecStarter
2
- # The step that makes sure XVFB is installed on the system. When feature tests run, they need a display server to power the
3
- # browsr that will execute the feature tests. MacOS provides its own display server that always runs. Linux needs one
4
- # installed and activated.
5
- class VerifyXvfbStep < RspecStarter::Step
6
- def initialize(defaults, runner)
7
- super(runner)
8
-
9
- @relevant_options << '--no-xvfb'
10
- @use_xvfb = defaults.fetch(:use_xvfb, true)
11
- @user_wants_to_skip_xvfb = ARGV.any? { |option| option.include?("--no-xvfb") }
12
- end
13
-
14
- # This step doesn't really fail. Although there may be problems with how XVFB is installed, it's only a problem when the
15
- # user is trying to run feature specs. The user may be in a situation where he's working on Linux and XVFB isn't installed,
16
- # but he may not have any feature specs to run. We shouldn't block the tests from running just because XVFB hasn't been
17
- # installed yet. So we just warn the user and put the ball in his court. If he's running feature specs with a busted
18
- # XVFB setup, we have at least warned him.
19
- def failed?
20
- false
21
- end
22
-
23
- def should_execute?
24
- return false if @user_wants_to_skip_xvfb
25
-
26
- @use_xvfb
27
- end
28
-
29
- # There are two cases we need to be checked
30
- # 1. A Linux user does not have xvfb installed (xvfb is needed to run RSpec feature tests on Linux).
31
- # 2. A Mac User has xvfb installed. (Macs have their own display server so xvfb is not needed; a dev might have mistakenly
32
- # tried to install, so we can check for it just in case.)
33
- def execute
34
- return if should_skip?
35
-
36
- print "[#{@runner.step_num}] Verifying display server ... "
37
-
38
- if @runner.is_linux? && !@runner.xvfb_installed?
39
- return puts "Warning (XVFB is not installed. Feature specs will fail.)".colorize(:yellow)
40
- end
41
-
42
- if @runner.is_mac? && @runner.xvfb_installed?
43
- return puts "Warning (XVFB has been installed. It's not needed on a Mac and may cause specs to fail.)".colorize(:yellow)
44
- end
45
-
46
- puts "Success!!".colorize(:green)
47
- end
48
- end
49
- end