2016-04-11 13 views
0

如何編寫在.each塊中收集的定義的文檔?我的特例是Middleman,但我認爲這個問題更加普遍,而Google今天的表現令人失望。YARD - 資源處理程序 - 記錄在每個塊中聲明的defs

例如:

def manipulate_resource_list(resources) 
    resources.each do |resource| 
     # Provides a greeting 
     # @return [string] Returns the greeting. 
     def resource.hello_world 
     'hello, world' 
     end 
    resources 
end 

我這個地步得到:

class ResourcesHandler < YARD::Handlers::Ruby::Base 
    handles :def 
    namespace_only 

    def process 
    if statement.method_name(true).to_sym == :manipulate_resource_list 
     parse_block(statement.last.first.last.last, :owner => self.owner) 
    end 
    end 
end 

但是,這確實是一種糟糕的,因爲我有實際上說明這樣的代碼:

 # @!method hello_world 
     # Provides a greeting 
     # @return [string] Returns the greeting. 
     { blank line 1 } 
     { blank line 2 } 
     def resource.hello_world 
     'hello, world' 
     end 

...當YARD遇到def resource.hello_world時,我不得不擔心YARD::Handlers::Ruby::MethodHandler: Undocumentable method defined on object instance

注意:我想在的代碼附近聲明文件,而不是在文件的某些遠程部分。

任何想法如何我可以提高我的YARD資源處理程序,使其更自然?

回答

0

嗯,我結束了使用此:

class ResourcesHandler < YARD::Handlers::Ruby::Base 
    handles :def 
    namespace_only 

    def process 
    if statement.method_name(true).to_sym == :manipulate_resource_list 

     # Block consists of everything in the actual `do` block 
     block = statement.last.first.last.last 
     block.each do | node | 
     if node.type == :defs 
      def_docstring = node.docstring 
      def_name = node[2][0] 
      object = YARD::CodeObjects::MethodObject.new(namespace, "resource.#{def_name}") 
      register(object) 
      object.dynamic = true 
      object[:docstring] = def_docstring 
      object[:group] = 'Resource Extensions' 
      puts node.type 
     end 
     end 
    end 
    end 
end 
相關問題