Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Run a CLI Thor app without arguments or task name

Tags:

ruby

thor

I'm looking for a way to create a command-line thor app that will run a default method without any arguments. I fiddled with Thor's default_method option, but still requires that I pass in an argument. I found a similar case where someone wanted to run a CLI Thor task with arguments but without a task name.

I'd like to run a task with no task name and no arguments. Is such a thing possible?

like image 893
dhulihan Avatar asked Aug 31 '11 06:08

dhulihan


2 Answers

It seems the proper Thor-way to do this is using default_task:

class Commands < Thor
  desc "whatever", "The default task to run when no command is given"
  def whatever
    ...
  end
  default_task :whatever
end
Commands.start

If for whatever reason that isn't what you need, you should be able to do something like

class Commands < Thor
  ...
end

if ARGV.empty?
  # Perform the default, it doesn't have to be a Thor task
  Commands.new.whatever
else
  # Start Thor as usual
  Commands.start
end
like image 78
Jakob S Avatar answered Nov 08 '22 08:11

Jakob S


Kind of hackish, but where there's only one defined action anyway, I just prepended the action name to the ARGV array that gets passed in:

class GitTranslate < Thor
  desc "translate <repo-name>", "Obtain a full url given only a repo name"
  option :bitbucket, type: :boolean, aliases: 'b' 
  def translate(repo)
    if options[:bitbucket]
      str = "freedomben/#{repo}.git"
      puts "SSH:   [email protected]:#{str}"
      puts "HTTPS: https://[email protected]/#{str}"
    else
      str = "FreedomBen/#{repo}.git"
      puts "SSH:   [email protected]:#{str}"
      puts "HTTPS: https://github.com/#{str}"
    end 
  end 
end

Then where I start the class by passing in ARGV:

GitTranslate.start(ARGV.dup.unshift("translate"))
like image 37
Freedom_Ben Avatar answered Nov 08 '22 10:11

Freedom_Ben