6

Chciałbym móc wstawiać szablonowe komentarze w stylu YARD do istniejącej aplikacji Rails. Obecnie ma kilka komentarzy. Chciałbym klasy nagłówków i nagłówków metod, które mają określone parametry (przez wyodrębnianie z sygnatur metody, które zakładam) i placeholders dla wartości zwracanych.Automatyczne dodawanie szkieletów dociętych do istniejącego kodu Railsowego

W kodzie PHP miałem narzędzia, które analizowałyby kod i tworzyły komentarze do nagłówka dokumentu wstawione do kodu w odpowiednich miejscach. W Ruby z typowaniem Duck itp., Jestem pewien, że rzeczy takie jak typy @paramów itp., Nie mogą być łatwo odgadnięte, i jestem z tym w porządku - oczekuję recenzji plików kodu jeden po drugim ręcznie po wstawieniu. Chciałbym uniknąć konieczności wstawiania wszystkich szablonów szkieletu do kodu (ponad 500 plików), jeśli to możliwe.

Szukałem klejnotu itp., Który to robi i na razie nie spotkał się z żadnym. Czy są tam jakieś?

Odpowiedz

1

Wygląda na to, że będziesz musiał napisać to sam, ale nie jest to duży problem z dostępem do Ruby o nazwie S-expressions, która przeanalizuje źródło dla ciebie. Więc można zrobić to tak:

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 było:

$ 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 

Co dostaniesz to:

#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 

więc wystarczy tylko dostosować szablon, i wyodrębnij parametry, które są dostępne w tej samej tablicy:

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

Trochę trudniejszym zadaniem jest dowiedzieć się, co jest zwracane, ale nadal możliwe do wykonania - poszukaj :return s, a następnieostatni w stack i dodaj go do ostatniej deklaracji metody.

I wreszcie umieść te komentarze powyżej odpowiednich linii do pliku źródłowego.

+0

Znalazłem plugin Sublime Text o nazwie yardgen, który robi to, czego się spodziewałem i ma już powyższe funkcje. Ponieważ muszę przeglądać każdy szkielet, pozwoli mi to zrobić za jednym razem. – TJChambers