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