6

Vorrei poter inserire i commenti di stile documento YARD nella mia applicazione legacy di Rails esistente. Al momento ha pochi commenti. Vorrei che le intestazioni di classe e le intestazioni dei metodi avessero i parametri specificati (mediante estrazione dalle firme dei metodi che presumo) e i segnaposto per i valori di ritorno.Aggiunta automatica di scheletri di documenti da cantiere al codice legacy di Rails esistente

Nel codice PHP avevo gli strumenti che avrebbero esaminato il codice e creato i commenti dell'intestazione del doc inseriti nel codice nei punti appropriati. In Ruby with Duck typing etc, sono certo che cose come i tipi di @params, ecc, non possono essere facilmente indovinate, e io sono d'accordo con questo: mi aspetto di rivedere i file di codice uno per uno manualmente dopo l'inserimento. Vorrebbe solo evitare di dover inserire tutti i modelli di skeleton nel codice (oltre 500 file) se possibile.

Ho cercato una gemma, ecc., Questo è vero e non ho trovato nessuno finora. Ce ne sono là fuori?

risposta

1

Sembra che dovrai scriverlo da solo, ma non è un grosso problema avere accesso a Ruby S-expressions, che analizzerà l'origine per te. Così si può fare in questo modo:

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

$ 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 

ciò che si ottiene è:

#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 

modo che solo bisogno di personalizzare il modello, ed estrai i parametri che sono disponibili nello stesso array:

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

Un compito un po 'più difficile è quello di scoprire cosa viene restituito, ma comunque fattibile - cercare :return s mentre si ha :def ultimo nello stack e aggiungerlo all'ultima istruzione del metodo.

E infine mettere quei commenti sopra le righe appropriate al file sorgente.

+0

Ho individuato un plug-in Sublime Text chiamato yardgen che fa ciò che mi aspettavo e ha già le caratteristiche sopra. Dal momento che devo rivedere a mano ogni scheletro questo mi permetterà di farlo in un solo passaggio. – TJChambers

Problemi correlati