自动将场文档骨架添加到现有的Rails遗留代码中

TJC*_*ers 6 ruby documentation documentation-generation code-documentation

我希望能够将模板化的YARD doc样式注释插入到我现有的Rails遗留应用程序中.目前它几乎没有评论.我希望类标题和方法标题具有指定的参数(通过从我假设的方法签名中提取)和占位符的返回值.

在PHP代码中,我有一些工具可以检查代码并在适当的位置创建插入代码中的doc头注释.在Ruby with Duck类型等中,我确信像@params等类型之类的东西不容易猜到,而且我很好 - 我希望在插入后手动逐个查看代码文件.如果可能的话,只想避免必须将所有骨架模板插入代码(超过500个文件).

我已经搜索过这样做的宝石等,到目前为止还没有找到过.那里有没有?

Eug*_*rov 1

看起来你必须自己编写它,但是通过访问 Ruby 的S-表达式,这不是一个大问题,它会为你解析源代码。所以你可以这样做:

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)
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

您将得到的是:

#line_number    #entity
3: Method: C1#m1c1
2: Class: M1::C1
12: Method: C2#m1c2
11: Class: M1::C2
16: Class: M1::C3
1: Module: M1
Run Code Online (Sandbox Code Playgroud)

因此,您只需要自定义模板,并提取同一数组中可用的参数即可:

#irb > pp Ripper.sexp("def method(param1);nil; end")
...[:def,
   [:@ident, "method", [1, 4]],
   [:paren,
    [:params, [[:@ident, "param1", [1, 11]]]...
Run Code Online (Sandbox Code Playgroud)

有点困难的任务是找出返回的内容,但仍然可行 -在 the 最后一个语句中:return查找 s并将其添加到方法的最后一个语句中。:defstack

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