Разбирать файл 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