在Ruby / IRB中,如何使用yard文档gem与代码的统计信息和解析信息进行交互?

时间:2014-09-06 18:16:25

标签: ruby parsing irb yard

庭院宝石是一种用于生成红宝石代码文档的工具。

通过命令行完成,并生成文档。

但是我想知道是否可以通过IRB与解析的代码和统计信息进行交互。

你可以进入IRB并召集这样的院子:

require 'yard'
YARD

但是,我似乎无法与代码交互或获取和解析统计信息。例如,获取代码中的方法列表会很棒,或者通过解析器获取方法列表的对象。

文档:(http://rubydoc.info/gems/yard/YARD

3 个答案:

答案 0 :(得分:2)

请参阅YARD::Registry上的文档(链接到Architecture Overview document),以获取在运行yard后解析出的代码对象。

在注册表中打印所有方法的示例:

require 'yard'

YARD::Registry.load!
puts YARD::Registry.all(:method).map(&:path)

高级课程 - 获取所有未记录的对象:

require 'yard'

YARD::Registry.load!
puts YARD::Registry.all.select {|o| o.docstring.blank? }.map(&:path)

除了CodeObjects Architecture Overview类API文档之外,您还可以在YARD::CodeObjects::Base中看到CodeObjects的更多属性。这将为您提供有关您可以查询的内容的更多信息。如果您计划内省标记,您可能还需要查看YARD::Docstring类。

请注意,如果您想要实际生成注册表(尚未运行yard),则可以使用Registry类执行此操作,但最好使用YARD::CLI::Yardoc.run这一点。

答案 1 :(得分:0)

从院子里看来,看起来宝石似乎不是用于那个目的,但你可以提取一些信息。

require 'yard'

stats = YARD::CLI::Stats.new
stats.run(files) # it allows patter matching, for instance 'lib/*.rb'
stats.all_objects # all the objects recognized by the parser

stats.all_objects.select{|o| o.type == :method} # to get only methods
stats.all_objects.select{|o| o.type == :class} # to get only classes

我不确定这对你是否足够,但我认为你不能在更深层次上获取信息。

答案 2 :(得分:0)

这实际上取决于你需要做什么,但我强烈建议你看看pry让你做出伟大的事情:

[1] pry(main)> require 'cgi'
=> true
[2] pry(main)> show-method CGI::escape

From: /home/carlesso/.rbenv/versions/2.1.2/lib/ruby/2.1.0/cgi/util.rb @ line 7:
Owner: CGI::Util
Visibility: public
Number of lines: 6

def escape(string)
  encoding = string.encoding
  string.b.gsub(/([^ a-zA-Z0-9_.-]+)/) do |m|
    '%' + m.unpack('H2' * m.bytesize).join('%').upcase
  end.tr(' ', '+').force_encoding(encoding)
end

甚至更奇怪的东西:

[4] pry(main)> cd CGI
[5] pry(CGI):1> ls
constants: 
  Cookie  CR  EOL  HtmlExtension  HTTP_STATUS  InvalidEncoding  LF  MAX_MULTIPART_COUNT  MAX_MULTIPART_LENGTH  NEEDS_BINMODE  PATH_SEPARATOR  QueryExtension  REVISION  Util
Object.methods: yaml_tag
CGI::Util#methods: 
  escape  escapeElement  escapeHTML  escape_element  escape_html  h  pretty  rfc1123_date  unescape  unescapeElement  unescapeHTML  unescape_element  unescape_html
CGI.methods: accept_charset  accept_charset=  parse
CGI#methods: accept_charset  header  http_header  nph?  out  print
class variables: @@accept_charset
locals: _  __  _dir_  _ex_  _file_  _in_  _out_  _pry_

您也可以修改某些内容,例如edit CGI::escape会将$EDITOR打开到相关文件/行(在我的情况下,vim将在.rbenv/versions/2.1.2/lib/ruby/2.1.0/cgi/util.rb第7行打开

如果有礼物将显示帮助:

[10] pry(CGI):1> help Pry.hist
Usage:   hist [--head|--tail]
         hist --all
         hist --head N
         hist --tail N
         hist --show START..END
         hist --grep PATTERN
         hist --clear
         hist --replay START..END
         hist --save [START..END] FILE
Aliases: history

Show and replay Readline history.

    -a, --all              Display all history
    -H, --head             Display the first N items
    -T, --tail             Display the last N items
    -s, --show             Show the given range of lines
    -G, --grep             Show lines matching the given pattern
    -c, --clear            Clear the current session's history
    -r, --replay           Replay a line or range of lines
        --save             Save history to a file
    -e, --exclude-pry      Exclude Pry commands from the history
    -n, --no-numbers       Omit line numbers
    -h, --help             Show this message.

但是,再次,它确实取决于您的需求,一点点“元编程”可以帮助您,如.methods.instance_variables.constants可能有用..