# 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 там. По умолчанию это лучший код для написания кода поваренной книги.

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