Search code examples
rubyinitializationtaskthor

Ruby - Thor execute a specific Task first


Is it possible to call a specific task first, when i run a thor task?

my Thorfile:

class Db < Thor

  desc "show_Version", "some description ..."
  def show_version # <= needs a database connection
    puts ActiveRecord::Migrator.current_version
  end

  private

  def connect_to_database # <= call this always when a task from this file is executed
    # connect here to database
  end

end

I could write the "connect_to_database" method in every task but that seems not very DRY.


Solution

  • You can use invoke to run other tasks:

    def show_version
      invoke :connect_to_database
      # ...
    end
    

    That will also make sure that they are run only once, otherwise you can just call the method as usual, e.g.

    def show_version
      connect_to_database
      # ...
    end
    

    Or you could add the call to the constructor, to have it run first in every invocation:

    def initialize(*args)
      super
      connecto_to_database
    end
    

    The call to super is very important, without it Thor will have no idea what to do.