Является ли Rubocop надмножеством проверки синтаксиса "ruby -c"?

У нас был тест, который нашел каждый файл Ruby в нашем приложении и запустил ruby -c в теме. Мы представили Rubocop и заставили его проверить тот же список файлов.

Это тест, который побежал ruby -c на самом деле сейчас бесполезно, или есть пример режима сбоя, который будет пойман ruby -c а не рубокоп?

Документация для ruby -c говорит:

Заставляет Ruby проверить синтаксис скрипта и выйти без выполнения. Если нет синтаксических ошибок, Ruby выведет "Синтаксис ОК" на стандартный вывод.

Это пример синтаксической проблемы, которая будет обнаружена:

% echo "puts 'hello world" > hot_script.rb
% ruby -c hot_script.rb
hot_script.rb:1: unterminated string meets end of file

% rubocop hot_script.rb
Inspecting 1 file
F

Offenses:

hot_script.rb:1:6: F: unterminated string meets end of file
(Using Ruby 1.9 parser; configure using TargetRubyVersion parameter, under AllCops)
puts 'hello world
     ^

1 file inspected, 1 offense detected

Рубокоп даже ловит некоторые из тех же предупреждений, хотя у меня не было ruby -c настроен ловить их ранее, и поэтому меня больше интересуют ошибки. Вот пример относительного паритета при обработке предупреждения:

% cat unused_var.rb
def hot_method
  a = 1
  b = 2
  puts b
end

% ruby -cwW2 unused_var.rb
unused_var.rb:2: warning: assigned but unused variable - a
Syntax OK

% rubocop unused_var.rb
Inspecting 1 file
W

Offenses:

unused_var.rb:2:3: W: Lint/UselessAssignment: Useless assignment to variable - a.
  a = 1
  ^

1 file inspected, 1 offense detected

Я искал с помощью

но я могу делать это неправильно. В Ruby 1.9 тест намного медленнее, чем в Ruby 1.8, поэтому ответ на этот вопрос для меня очень важен. И ты должен признать, тебе любопытно, верно?

2 ответа

Решение

Ответ "большую часть времени". RuboCop основывается на геме синтаксического анализатора, который является автономным анализатором Ruby, который более или менее имитирует синтаксический анализатор MRI. RuboCop оборачивает синтаксические проверки синтаксического анализатора и будет правильно сообщать о проблемах. Однако, как указано на GitHub парсера:

К сожалению, МРТ часто меняет синтаксис в версиях уровня патча [...], и не существует простого способа отследить эти изменения.

Эта политика делает практически невозможным сделать Parser точно совместимым с анализатором Ruby MRI.

Кроме того, анализатор поддерживает последнюю минорную версию того релиза, который вы используете, и не создает бэкпорт минорных версий. Поэтому, если вы используете Ruby 2.4.0, RuboCop будет использовать версию парсера, поддерживающую синтаксис 2.4.1.

Для всех целей и задач анализатор эквивалентен официальному анализатору MRI, и, если у вас нет особых причин использовать оба, достаточно использовать только RuboCop.

Rubocop также будет выявлять и сообщать о синтаксических ошибках, поскольку в этом случае код не может быть должным образом проанализирован, поэтому в них нет необходимости.

Другие вопросы по тегам