Ответ 1
Недавнее обновление Rubocop ввело в игру новое правило: блоки должны быть длиной не более 25 линий. Я не уверен в обосновании этого, потому что он не указан в руководстве по стилю Ruby.
Раньше все копы были основаны на Руководстве по стилю Ruby, а RuboCop был способом придерживаться практики, установленной сообществом.
С тех пор направление изменилось, и область применения RuboCop расширилась, чтобы помочь разработчикам обеспечить согласованность своих основ кода в целом. Это привело к двум вещам:
- Копы (даже те, которые основаны на Руководстве по стилю Ruby) теперь в основном настраиваются.
- Есть копы для вещей, которые не упомянуты в Руководстве по стилю Ruby, но все же полезны для обеспечения согласованности в проекте.
Этот полицейский попадает во вторую категорию.
Использует ли RSpec теперь дискредитированный подход для компоновки кода, и какие разумные варианты у меня есть, чтобы уменьшить размеры блоков в наших тестах RSpec?
Краткий ответ - нет. DSL по-прежнему круто. :-)
Этот полицейский нацелен на большой блок в смысле императивного программирования. Как общее руководство, оно не применяется к DSL, которые часто являются декларативными. Например, наличие длинного файла routes.rb
в Rails совершенно удобно. Это просто естественный результат большого приложения, а не нарушение стиля. (И много тестов - это просто здорово.)
RuboCop довольно умен, но он не знает, что такое DSL и нет, поэтому мы не можем автоматически их игнорировать. Можно утверждать, что мы могли бы исключить методы входа DSL из популярных фреймворков, таких как маршруты Rails и спецификации RSpec. Причины для того, чтобы этого не делать в первую очередь:
- Ложные негативы. Любой класс может реализовать метод с использованием блока с тем же именем.
- RuboCop - это инструмент анализа Ruby, и он не должен знать о внешних библиотеках. (Исключение каталога
/spec
- это вежливость, пока у нас не будет правильной системы расширений, и это может быть обработаноrubocop-rspec
.)
Я имею в виду, что это выполнимо, но превращение групп примеров спецификаций в вспомогательные функции таким образом кажется противоположностью читабельному подходу, поддерживаемому дизайном RSpec.
Суть в том, что RuboCop поможет нам написать лучший код. Если дизайн нашего приложения иным образом продуман, и мы делаем вещи менее читабельными, просто чтобы угодить RuboCop, тогда мы должны отфильтровать, настроить или отключить копа. :-)
В ответ мы просто установили для правила размера блока Rubocop высокий порог. Но это заставляет меня задуматься - чего мне не хватает?
Это довольно тупой инструмент, и, как вы намекаете, у вас, вероятно, будут некоторые ложные негативы из-за него. Есть два типа ложных срабатываний для этого полицейского:
- Файлы, которые содержат чисто декларативные DSL, например, маршруты Rails, спецификации RSpec.
- Файлы, имеющие декларативный DSL, смешанные в основном с императивным кодом, например, объявление
aasm
состоянияaasm
в модели Rails.
В первом случае лучшим решением является исключение файла или каталога, а во втором - использование встроенного отключения.
В вашем случае вы должны обновить ваш .rubocop.yml
:
Metrics/BlockLength:
Exclude:
- 'Rakefile'
- '**/*.rake'
- 'test/**/*.rb'
(Обратите внимание, что вам нужно повторить базовые исключения из конфигурации по умолчанию, так как список будет перезаписан.)