# rubocop:отключить Метрики/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

person devops_coder    schedule 04.01.2018    source источник
comment
Ошибка гласит: включить после отключения. Пробовали ли вы писать # rubocop:disable Metrics/AbcSize до сложного кода; а затем еще и написать # rubocop:enable Metrics/AbcSize после кода? (Т.е. непосредственно под этим методом, в том же файле.)   -  person Tom Lord    schedule 04.01.2018
comment
Кроме того, вы не показали исходный код для check_tropo_versions. Вместо того, чтобы просто отключить руководство по стилю для метода, возможно, вы могли бы показать его в своем вопросе, и мы предложим лучший способ написать код; тем самым делая его совместимым с rubocop?   -  person Tom Lord    schedule 04.01.2018


Ответы (3)


На что Rubocop в основном жалуется, так это на то, что он просит вас включить коп после закрытия метода, поэтому коп может действовать для других методов файла. Если вы отключите его в первой строке файла, он будет отключен для всех методов в этом файле. Отключение копов для целых файлов — плохая идея, так как вы должны быть явными и сознательными при отключении копов.

Исправление в вашем случае — просто отключить полицейского перед вашим методом, а затем включить его после.

Например:

# 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 в правильные места. Кроме того, я согласен с тем, что сказал Том, что если вы покажете нам код, мы можем улучшить метод, и вам не нужно будет отключать полицейского для этого метода.

person Ilija Eftimov    schedule 04.01.2018
comment
... За исключением того, что сложный метод на самом деле check_tropo_versions; источник которого не был указан в вопросе. - person Tom Lord; 04.01.2018

Вы можете отключить копа только для этого метода, вместо того, чтобы добавлять # rubocop:disable вверху файла, просто отметьте своего нарушителя так

def check_tropo_versions # rubocop:disable Metrics/AbcSize
# ...
person Grzegorz    schedule 19.11.2020

Используйте cookstyle вместо rubocop там. У него лучшие значения по умолчанию для линтинга кода поваренной книги.

person coderanger    schedule 04.01.2018