2017-08-11 2 views
2

Compte tenu du fichier ruby ​​suivant, foo.rb:obtenir des commentaires YARD pour les objets Ruby programme

# this is a module comment 
module A 
    # this is a constant comment 
    B = 'hi' 
    # this is a class comment 
    class C 
    # this is a method comment 
    # @param [String] name Who to say hi to 
    # @return [String] 
    def self.hi(name) 
     "#{B}, #{name}" 
    end 
    end 
end 

Comment peut-on obtenir les commentaires programme associés à des objets particuliers (par exemple {A::C => 'this is a class comment'}, {B => 'this is a constant comment'})?

Je m'attendrais à YARD.parse(File.read('/path/to/foo.rb')) ou à YARD::Parser::SourceParser.parse(File.read('/path/to/foo.rb')) de faire quelque chose, mais ils renvoient des tableaux vides. YARD::Parser::Ruby::RubyParser.parse(File.read('/path/to/foo.rb')) renvoie une instance YARD::Parser::Ruby::RipperParser qui semble être une AST, mais je préférerais éviter d'écrire un traversier AST (YARD doit avoir cette fonctionnalité pour structurer la documentation HTML, mais je n'ai pas réussi à la trouver).

(J'utilise YARD v0.9.9 dans le cas qui est utile.)

Répondre

1

Alors après avoir joué un peu et en passant par la source de la cour, je peux comprendre comment fonctionne la cour. Fondamentalement, il crée un registre de tous les objets de code après YARD.parse. Nous pouvons y accéder comme ceci,

2.4.1 :033 > YARD.parse('./foo.rb') 
=> [] 
2.4.1 :034 > YARD::Registry.all 
=> [#<yardoc module A>, #<yardoc constant A::B>, #<yardoc class A::C>, #<yardoc method A::C.hi>] 
2.4.1 :035 > code_objects = YARD::Registry.all.map {|object| {object.name => object.docstring} }.inject(&:merge) 
{:A=>"this is a module comment", :B=>"this is a constant comment", :C=>"this is a class comment", :hi=>"this is a method comment"} 
2.4.1 :036 > code_objects[:A] 
=> "this is a module comment" 

Vous devriez pouvoir employer ceci et convertir en méthode selon vos besoins.

Plus ici: https://github.com/lsegal/yard/blob/master/lib/yard/registry.rb#L225-L237