Программная интеграция средства форматирования Rubocop с stdin / stdout - PullRequest
2 голосов
/ 09 ноября 2019

Я пытаюсь интегрировать средство форматирования Rubocop в редактор: учитывая некоторый код Ruby в качестве входных данных, вернуть строку, представляющую эквивалентный форматированный код. Я рассматривал вариант -s, предложенный справкой Рубокопа:

-s FILE - Источник трубы из STDIN с использованием FILE в отчетах о нарушениях. Это полезно для интеграции редактора.

В терминале следующая команда успешно считывает содержимое ввода и печатает отформатированный вывод на стандартный вывод:

cat some_file.rb | rubocop -a -f fi -s some_file.rb

Однако я не могу программно воспроизвести что-то подобное, используя Rubocop API. Я надеялся как-то передать входные данные в RuboCop::Runner, однако, просто анализируя зависания параметров, прежде чем я доберусь до этой точки:

require 'rubocop'

input = "some_var    = 'hello'"
options, paths = RuboCop::Options.new.parse(['-a', '-f', 'fi', '-s', 'some_file.rb'])
runner = RuboCop::Runner.new(options, RuboCop::ConfigStore.new)
...

Конечно, один из вариантов - сбросить -s иработать с временными файлами, однако, это добавляет сложности и является менее эффективным.

Как мне удобно создавать форматированный вывод, используя API?

1 Ответ

0 голосов
/ 09 ноября 2019

Просто вызовите RuboCop как внешний процесс, например, используя Open3.capture2:

stdout_str, status = Open3.capture2("rubocop -a -f fi -s some_file.rb", input)
...