rubycommand-line-interfacehookthor

Is there a way to add hooks to a Thor class in order to run code before/after all commands?


I'm working on a CLI tool powered by the Thor gem. Say I have a Cli class that inherits from Thor, which defines a CLI tool that has a few commands associated with it:

class Cli < Thor
  def version
    # Prints out the version
  end

  def something
    # Does something else
  end

  def thing
    # Does a different thing
  end
end

How can I define a method that runs before all commands, or after all commands?

For example, say I create a couple private methods – let's call them setup and teardown. How can I make setup run before version, something, and thing? And how can I make teardown run after version, something, and thing?

I am hoping there is some sort of way to declare a hook method (similar to Rails' before_action) so I can avoid manually calling setup first in every command, and teardown last in every command.


Solution

  • Looks like there's no built-in way of doing such callbacks in the Thor gem. (I'd think this would be a popular feature, but maybe I'm looking at things the wrong way.)

    An above comment points to a third-party solution, thor-hollaback, but I have not tried it.