Closed paul-mesnilgrente closed 4 years ago
There are no plans to add a command system back into Slop. I think the requirements for these sort of things are just too broad, so you end up either having to decide a lot of things for the end user, or create a mish-mash of all possibilities that becomes difficult to maintain.
I think the best thing to do is build something custom that does exactly what you want. Here's a starting point:
require "slop"
class Commands
attr_reader :commands, :global
def initialize(&block)
@commands = {}
@global = Slop::Options.new(&block)
end
def add(command, &block)
@commands[command] ||= Slop::Options.new(&block)
end
def run(args)
arg = args.first
if options = commands[arg]
Slop::Parser.new(options).parse(args[1..-1])
else
Slop::Parser.new(global).parse(args)
end
end
end
commands = Commands.new do |opts|
opts.on "-v", "Print version" do
puts "version ..."
end
end
commands.add("log") do |opts|
opts.on "-v", "Override global" do
p "in log command"
end
end
commands.run ARGV.dup
Check out the Advanced Usage section of the README and the documentation for Slop::Result which includes methods for extracting unused flags and arguments so you can create commands that pull out options from the argument list and then move on to another parser if you'd like.
I see in the README that there is no support for git-like commands. Is there any plans for it in the future? I'd really like to find a slop equivalent: an argument parser only!
All the libraries like thor, gli or all the others don't give you data outside of their object which is very annoying because it makes you dependent or their architecture.
Do you have any suggestions for a slop-like gem with subcommands?