Разбирать файл ruby ​​для ссылок на классы

Если у меня есть файл model.rb:

require 'foo.rb'
require 'foo/bar.rb'

class Model
  def self.foo
    Foo.new
  end

  def bar
    Foo::Bar.to_s
  end

  Foo::Bar::Baz.class_does_not_exist
end

Как я могу проанализировать этот файл, чтобы получить действительные ссылки на классы? Например, если Foo а также Foo::Bar определены в другом месте, но Foo::Bar::Baz нет, то я бы хотел что-то вроде:

parse_for_valid_class_references(File.open('model.rb', 'rb'))
# => [Foo, Foo::Bar]

1 ответ

Один из способов сделать это - выполнить скрипт оболочки, который запускает отдельный процесс ruby, требует файл, проверяет, какие константы добавляются, и печатает его.

если у вас есть файл 1.rb:

class Foo; end

тогда вы можете написать этот код ruby ​​в другом месте:

require 'json'
def constants_added_by_file(path)
  cmd = <<-RB
    require 'json'
    consts = Object.constants
    require '#{path}'
    puts((Object.constants - consts).to_json)
  RB
  JSON.parse `ruby -e "#{cmd}"`
end

puts constants_added_by_file('./1.rb')
# => Foo
Другие вопросы по тегам