Skip to content

Instantly share code, notes, and snippets.

@tenderlove
Last active December 11, 2020 19:56
Show Gist options
  • Star 16 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save tenderlove/e41e8e007e4f4dab7a6a to your computer and use it in GitHub Desktop.
Save tenderlove/e41e8e007e4f4dab7a6a to your computer and use it in GitHub Desktop.
tab completion for minitest tests
#!/usr/bin/env ruby --disable-gems
# Tab completion for minitest tests.
#
# INSTALLATION:
#
# 1. Put this file in a directory in your $PATH. Make sure it's executable
# 2. Run this:
#
# $ complete -o bashdefault -f -C /path/to/this/file.rb ruby
#
# Running individual minitest tests will now have tab completion for the
# method names.
#
# USAGE:
#
# When running tests, just hit tab after -n. For example:
#
# $ ruby -I lib:test test/test_whatever.rb -n test_<TAB>
#
require 'optparse'
require 'shellwords'
argv = Shellwords.split(ENV['COMP_LINE']).drop 1
options = {}
begin
OptionParser.new do |opts|
opts.on("-n", "--name [METHOD]", "Test method") do |m|
options[:method] = m
end
end.parse!(argv)
rescue
retry # ignore options passed to Ruby
end
file = argv.find { |f| File.file?(f) && !File.directory?(f) }
exit unless options.key?(:method) && file
require 'ripper'
methods = []
K = Class.new(Ripper) { define_method(:on_def) { |n,_,_| methods << n } }
begin
K.parse File.read(file), file, 1
methods = methods.grep(/^#{options[:method]}/) if options[:method]
puts methods.join("\n")
rescue # give up on parse errors
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment