简体   繁体   中英

Writing a DSL like Thor gem in Ruby?

I'm trying to figure out how the Thor gem creates a DSL like this (first example from their README)

class App < Thor                                                 # [1]
  map "-L" => :list                                              # [2]

  desc "install APP_NAME", "install one of the available apps"   # [3]
  method_options :force => :boolean, :alias => :string           # [4]
  def install(name)
    user_alias = options[:alias]
    if options.force?
      # do something
    end
    # other code
  end

  desc "list [SEARCH]", "list all of the available apps, limited by SEARCH"
  def list(search="")
    # list everything
  end
end

Specifically, how does it know which method to map the desc and method_options call to?

desc is pretty easy to implement, the trick is to use Module.method_added :

class DescMethods
  def self.desc(m)
    @last_message = m
  end

  def self.method_added(m)
    puts "#{m} described as #{@last_message}"
  end
end

any class that inherits from DescMethods will have a desc method like Thor . For each method a message will be printed with the method name and description. For example:

class Test < DescMethods
  desc 'Hello world'
  def test
  end
end

when this class is defined the string "test described as Hello world" will be printed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM