6

Tôi muốn có thể chèn các nhận xét kiểu YARD có dạng tem vào ứng dụng cũ Rails hiện có của mình. Hiện tại, nó có vài ý kiến. Tôi muốn các tiêu đề lớp và các tiêu đề phương thức có các tham số được chỉ định (bằng cách trích xuất từ ​​các chữ ký phương thức mà tôi đoán) và các phần giữ chỗ cho các giá trị trả về.Tự động thêm bộ khung tài liệu yard vào mã di sản Rails hiện có

Trong mã PHP, tôi có các công cụ kiểm tra mã và tạo chú thích tiêu đề doc được chèn vào mã trong các vị trí thích hợp. Trong Ruby với Duck gõ etc, tôi chắc chắn rằng những thứ như các loại @params vv, không thể dễ dàng đoán tại, và tôi ok với điều đó - tôi mong đợi để xem xét các tập tin mã một của một cách thủ công sau khi chèn. Chỉ muốn tránh phải chèn tất cả các mẫu khung sườn vào mã (trên 500 tệp) nếu có thể.

Tôi đã tìm kiếm một viên ngọc, v.v. thực hiện điều này và đã không gặp phải điều gì cho đến nay. Có cái gì ngoài đấy không?

Trả lời

1

Có vẻ như bạn sẽ phải tự viết nó, nhưng đây không phải là vấn đề lớn khi truy cập vào số S-expressions của Ruby, sẽ phân tích cú pháp nguồn cho bạn. Vì vậy, bạn có thể làm điều đó như thế này:

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 là:

$ 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 

Những gì bạn sẽ nhận được là:

#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 

Vì vậy, bạn chỉ cần để tùy chỉnh mẫu, và trích xuất các thông số có sẵn trong cùng một mảng:

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

Nhiệm vụ khó hơn một chút là tìm ra những gì được trả về, nhưng vẫn có thể thực hiện được - tìm kiếm :return trong khi bạn có :def cuối cùng trong stack và thêm nó vào câu lệnh cuối cùng của phương thức.

Và cuối cùng, đưa những nhận xét đó lên trên các dòng thích hợp cho tệp nguồn.

+0

Tôi đã đặt một plugin Sublime Text được gọi là yardgen thực hiện những gì tôi mong đợi và đã có các tính năng ở trên. Vì tôi phải xem xét lại từng bộ xương, điều này sẽ cho phép tôi làm điều đó trong một lần. – TJChambers

Các vấn đề liên quan