6

Ich würde gerne Templates YARD Doc Style Kommentare in meine vorhandene Rails Legacy-Anwendung einfügen. Derzeit hat es wenige Kommentare. Ich möchte Klassenheader und Methodenheader, die die Parameter angegeben haben (durch Extraktion aus den Methoden Signaturen ich vermute) und Platzhalter für Rückgabewerte.automatisch Yard Doc Skelette zu bestehenden Rails Legacy-Code hinzufügen

In PHP-Code hatte ich Werkzeuge, die den Code untersuchen und erstellen die Kopfzeilen Kommentare in den Code an den richtigen Stellen eingefügt. In Ruby with Duck typing etc, bin ich mir sicher, dass Dinge wie die @params usw. nicht leicht zu erraten sind, und mir geht es gut - ich erwarte, die Code-Dateien einzeln nach dem Einfügen manuell zu überprüfen. Möchte nur vermeiden, alle Skelettvorlagen in den Code (über 500 Dateien) einfügen zu müssen, wenn möglich.

Ich habe nach einem Edelstein, etc. gesucht, der dies tut und bisher noch niemandem begegnet ist. Gibt es da draußen?

Antwort

1

Es scheint, Sie müssen es selbst schreiben, aber das ist kein großes Problem, havig Zugang zu Rubys S-expressions, die die Quelle für Sie analysieren wird. So können Sie es wie folgt tun:

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 war:

$ 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 

Was werden Sie erhalten, ist:

#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 

So brauchen Sie nur die Vorlage anpassen, und extrahiere die Parameter, die in dem gleichen Array verfügbar sind:

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

Etwas schwierigere Aufgabe ist herauszufinden, was zurückgegeben wird, aber immer noch machbar - suchen Sie nach :return s, während Sie :def zuletzt in der stack haben und fügen Sie es zur letzten Anweisung der Methode hinzu.

Und schließlich diese Kommentare über die entsprechenden Zeilen der Quelldatei.

+0

Ich habe ein Sublime Text-Plugin namens yorgen gefunden, das tut, was ich erwartet habe, und hat bereits die oben genannten Funktionen. Da ich jedes Skelett von Hand überprüfen muss, kann ich das in einem Durchgang machen. – TJChambers