Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Thor Executable - Ignore Task Name

Tags:

ruby

thor

The thor wiki page, Making an Exectable, shows you how to create a thor powered CLI command that looks something like this:

bash ./mythorcommand foo

This requires you to pass in the thor task foo as the first argument.

I can also run a thor executable without any arguments using thor's default_method:

bash ./mythorcommand

However, I'd like to pass in a variable string as the first argument:

bash ./mythorcommand "somevalue"

This doesn't work because thor commands expect the first argument to the be a task name. Is there a way to ignore the task name and send the first argument to a default method?

If this functionality doesn't exist, I think it would be very useful to add a method that would pass all commandline arguments into one task/method:

class MyThorCommand < Thor
  only_method :default

  def default(*args)
    puts args.inpsect
  end 
end 

MyThorCommand.start
like image 374
dhulihan Avatar asked Sep 01 '11 23:09

dhulihan


2 Answers

You should extend from Thor::Group and that call start method

class Test < Thor::Group
  desc "Act description"
  def act
    puts "do smth"
  end
end

Test.start
like image 176
timfjord Avatar answered Sep 24 '22 01:09

timfjord


I found a rather 'strange' solution for this problem that is working quite well with me.

You add a default task to Thor. Than you add the method_missing so that you can trick Thor into passing the default method as an argument if there are parameters to your application.

Taking from your example, the solution would look like this:

class MyThorCommand < Thor
  default_task :my_default

  desc "my_default", "A simple default"
  def my_default(*args)
    puts args.inspect
  end 

  def method_missing(method, *args)
    args = ["my_default", method.to_s] + args
    MyThorCommand.start(args)
  end

end 

MyThorCommand.start(ARGV)

If this is in the file "my_thor.rb" an execution "ruby my_thor.rb foo bar" would show '["foo", "bar"]' as a result.

Hope it helps.

like image 35
Edu Avatar answered Sep 26 '22 01:09

Edu