I am trying to write a Git pre-commit hook that would not let the user commit if there is an example that is tagged with :focus
.
Using RSpec's API (okay even if it is private), is there any way to find out the number of examples with the :focus
filter?
I found the example_count-instance_method. It could be useful but I'm not sure how it can be called from an external script.
Here is an Overcommit pre_commit hook that uses RSpecs private API to find out specs with :focus
filter:
require 'rspec'
module Overcommit
module Hook
module PreCommit
# NOTE: This makes use of many methods from RSpecs private API.
class EnsureFocusFreeSpecs < Base
def configure_rspec(applicable_files)
RSpec.configure do |config|
config.inclusion_filter = :focus
config.files_or_directories_to_run = applicable_files
config.inclusion_filter.rules
config.requires = %w(spec_helper rails_helper)
config.load_spec_files
end
end
def run
configure_rspec(applicable_files)
return :pass if RSpec.world.example_count.zero?
files = RSpec.world.filtered_examples.reject {|_k, v| v.empty?}.keys.map(&:file_path).uniq
[:fail, "Trying to commit focused spec(s) in:\n\t#{files.join("\n\t")}"]
end
end
end
end
end
Rather than calling RSpec Ruby code, I'd do it through RSpec's command-line interface using the --dry-run
flag. Here's a pre-commit hook that does it that way:
#!/bin/bash
if ! (rspec --dry-run --no-color -t focus:true 2>&1 | grep -q '^0 examples'); then
echo "Please do not commit RSpec examples tagged with :focus."
exit 1
fi
Not entirely sure if this will help or answer the question, but I currently use this set of githooks to make sure I don't commit obvious mistakes, and this pull request adds a check for :focus
/focus: true
/:focus => true
in RSpec files.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With