Ruby 自动向现有Rails遗留代码中添加码文档骨架

Ruby 自动向现有Rails遗留代码中添加码文档骨架,ruby,documentation,documentation-generation,code-documentation,Ruby,Documentation,Documentation Generation,Code Documentation,我希望能够将模板化的YARD文档样式的注释插入到我现有的Rails遗留应用程序中。目前评论很少。我希望类头和方法头具有指定的参数(我假定是从方法签名中提取)和用于返回值的占位符 在PHP代码中,我有一些工具可以检查代码,并在适当的位置创建插入到代码中的文档标题注释。在带有Duck类型的Ruby中,我确信@params等的类型是不容易猜到的,我对此没有意见——我希望在插入后手动逐个检查代码文件。如果可能的话,我们只想避免将所有的骨架模板插入到代码中(超过500个文件) 我已经寻找了一块宝石等,但到

我希望能够将模板化的YARD文档样式的注释插入到我现有的Rails遗留应用程序中。目前评论很少。我希望类头和方法头具有指定的参数(我假定是从方法签名中提取)和用于返回值的占位符

在PHP代码中,我有一些工具可以检查代码,并在适当的位置创建插入到代码中的文档标题注释。在带有Duck类型的Ruby中,我确信@params等的类型是不容易猜到的,我对此没有意见——我希望在插入后手动逐个检查代码文件。如果可能的话,我们只想避免将所有的骨架模板插入到代码中(超过500个文件)


我已经寻找了一块宝石等,但到目前为止还没有找到。有什么吗?

看起来你必须自己写,但是这不是一个大问题,因为你可以访问Ruby,Ruby将为你解析源代码。所以你可以这样做:

require 'ripper'
def parse_sexp( sexp, stack=[] )
  case sexp[0]
  when :module
    name = sexp[1][1][1]
    line_number = sexp[1][1][2][0]

    parse_sexp(sexp[2], stack+[sexp[0], sexp[1][1][1]])

    puts "#{line_number}: Module: #{name}\n"
  when :class
    name = sexp[1][1][1]
    line_number = sexp[1][1][2][0]

    parse_sexp(sexp[3], stack+[sexp[0], sexp[1][1][1]])
    puts "#{line_number}: Class: #{stack.last}::#{name}\n"
  when :def
    name = sexp[1][1]
    line_number = sexp[1][2][0]

    parse_sexp(sexp[3], stack+[sexp[0], sexp[1][1]])

    puts "#{line_number}: Method: #{stack.last}##{name}\n"
  else
    if sexp.kind_of?(Array)
      sexp.each { |s| parse_sexp(s,stack) if s.kind_of?(Array) }
    end
  end

end


sexp = Ripper.sexp(open 'prog.rb')
parse_sexp(sexp)
Prog.rb是:

$ cat -n prog.rb 
 1  module M1
 2    class C1
 3      def m1c1
 4        a="test"
 5        puts "hello"
 6        return a if a.empty?
 7        puts "hello2"
 8        a
 9      end
10    end
11    class C2 < C3
12      def m1c2
13        puts "hello"
14      end
15    end
16    class C3
17    end
18  end
因此,您只需自定义模板,并提取同一阵列中可用的参数:

#irb > pp Ripper.sexp("def method(param1);nil; end")
...[:def,
   [:@ident, "method", [1, 4]],
   [:paren,
    [:params, [[:@ident, "param1", [1, 11]]]...
稍微困难一点的任务是找出返回的内容,但仍然可行-在
堆栈中有
:def
last时查找
:return
s,并将其添加到方法的最后一条语句中


最后将这些注释放在源文件的适当行上方。

我找到了一个名为yardgen的超级文本插件,它实现了我的预期,并且已经具备了上述功能。由于我必须手工检查每个骨架,这将允许我一次完成。
#irb > pp Ripper.sexp("def method(param1);nil; end")
...[:def,
   [:@ident, "method", [1, 4]],
   [:paren,
    [:params, [[:@ident, "param1", [1, 11]]]...