# rubocop: отключить Metrics/AbcSize
Я действительно застрял в этой части:
Если я отключу # rubocop:disable Metrics/AbcSize
тогда я получаю эту ошибку:
ruby -v : ruby 2.4.2p198 (2017-09-14 revision 59899) [x86_64-darwin14]
rubocop -V
0.52.1 (using Parser 2.4.0.2, running on ruby 2.4.2 x86_64-darwin14)
$ rubocop .
Inspecting 7 files
.....W.
Offenses:
recipes/default.rb:13:1: W: Lint/MissingCopEnableDirective: Re-enable Metrics/AbcSize cop with # rubocop:enable after disabling it.
# rubocop:disable Metrics/AbcSize
^
7 files inspected, 1 offense detected
Если я включу rubocop
в сценарии получим это:
rubocop .
Inspecting 7 files
.....C.
Offenses:
recipes/default.rb:31:1: C: Metrics/AbcSize: Assignment Branch Condition size for check_tropo_versions is too high. [33.02/20]
def check_tropo_versions ...
^^^^^^^^^^^^^^^^^^^^^^^^
7 files inspected, 1 offense detected
Несколько строк моего сценария:
# rubocop:enable Metrics/AbcSize
require 'nokogiri'
Chef.event_handler do
on :resource_updated do |resource, _action|
if resource.declared_type.to_s == 'remote_file' && resource.cookbook_name == 'tropo-patch' && resource.recipe_name == 'default'
puts "#{Time.now.strftime('%Y%m%d%H%M%S')},#{resource.path},#{resource.source[0]}"
File.open('/var/log/tropo-patch.log', 'a') { |f| f.write("#{Time.now.strftime('%Y%m%d%H%M%S')},#{resource.path},#{resource.source[0]}\n") }
end
end
end
Я не могу отключить rubocop
из глобального конфигурационного файла, но если он может решить, я попробую это также:
Metrics/AbcSize:
Description: >-
A calculated magnitude based on number of assignments,
branches, and conditions.
Reference: 'http://c2.com/cgi/wiki?AbcMetric'
Enabled: true
2 ответа
Рубокоп, на самом деле, жалуется на то, что он просит вас включить полицейского после закрытия метода, чтобы он мог действовать для других методов файла. Если вы отключите его в первой строке файла, он будет отключен для всех методов в этом файле. Отключение копов для целых файлов не очень хорошая идея, так как вы должны быть явными и осознанными при отключении копов.
Исправление в вашем случае - просто отключить полицейского перед вашим методом, а затем включить его после.
Например:
# rubocop:disable Metrics/AbcSize
require 'nokogiri'
Chef.event_handler do
on :resource_updated do |resource, _action|
if resource.declared_type.to_s == 'remote_file' && resource.cookbook_name == 'tropo-patch' && resource.recipe_name == 'default'
puts "#{Time.now.strftime('%Y%m%d%H%M%S')},#{resource.path},#{resource.source[0]}"
File.open('/var/log/tropo-patch.log', 'a') { |f| f.write("#{Time.now.strftime('%Y%m%d%H%M%S')},#{resource.path},#{resource.source[0]}\n") }
end
end
end
# rubocop:enable Metrics/AbcSize
Кроме того, если вам нужно отключить несколько копов, вы можете включить всех из них, используя:
# rubocop:enable all
Надеюсь, это поможет!
Изменить: После просмотра комментария Тома Лорда на ваш вопрос, я заметил, что вы не опубликовали фактический метод, который нарушает правила полицейского. Тем не менее, решение, которое я предоставил, должно работать, если ваш disable
а также enable
заявления в правильных местах. Кроме того, я подтверждаю, что Том заявил, что если вы покажете нам код, мы могли бы улучшить метод, и вам не нужно будет отключать копа для метода.
Вы можете отключить копа только для этого метода, вместо добавления
# rubocop:disable
в верхней части файла просто отметьте своего обидчика вот так
def check_tropo_versions # rubocop:disable Metrics/AbcSize
# ...
Использование cookstyle
на месте rubocop
там. По умолчанию это лучший код для написания кода поваренной книги.