Rubocop: Можно ли добавить исключения в коп Metrics/AbcSize?

Рассмотрим следующий класс:

class App
  def call
    # ...
  end

  private

  def foo
    # ...
  end

  def bar
    # ... 
  end
end

Можно ли настроить rubocop так, чтобы он «жаловался» на Metrics/AbcSize для всех методов, когда Assignment Branch Condition size выше 15, за исключением call методов?

Для методов call он должен «жаловаться» только в том случае, если Assignment Branch Condition size выше 30.

Заранее спасибо.


person Marian13    schedule 24.01.2020    source источник


Ответы (4)


Энди Уэйт прав, что он не запрограммирован по умолчанию, но вы можете создать для него своего собственного полицейского, если хотите. Я никогда не делал этого лично, но эта статья, кажется, объясняет это довольно хорошо:

https://medium.com/@DmytroVasin/how-to-add-a-custom-cop-to-rubocop-47abf82f820a

Если бы мне пришлось ударить по нему, я бы взглянул на исходный код Metrics/ABcSize и подражал его поведению, за исключением случаев, когда он встречает метод с именем #call.

Исходный код находится здесь: https://github.com/rubocop-hq/rubocop/blob/master/lib/rubocop/cop/metrics/abc_size.rb

person Matthew    schedule 25.01.2020

RuboCop не поддерживает это. У вас не может быть разных лимитов для разных частей кода.

person Andy Waite    schedule 24.01.2020
comment
@anothermh Да, вы можете использовать директивы для отключения правила, но не для установки других значений конфигурации. - person Andy Waite; 25.01.2020

Как насчет этого:

def a
  ...
end

# rubocop:disable Metrics/AbcSize
def call
   ...
end
# rubocop:enable Metrics/AbcSize

def b
  ...
end
person Huy Vo    schedule 25.01.2020

С увеличением использования функциональных объектов я вижу, что этот запрос возникает все чаще и чаще, поэтому я пошел и реализовал параметр конфигурации IgnoredMethods для трех методов сложности копов:

  • Metrics/AbcSize
  • Metrics/CyclomaticComplexity
  • Metrics/PerceivedComplexity

запрос на включение уже объединен, поэтому с выпуском следующей версии RuboCop (вероятно, 0.81.0), вы сможете сделать это:

# rubocop.yml

Metrics/AbcSize:
  IgnoredMethods:
    - 'call'

Обратите внимание, что это отключит коп для всех #call методов, включая методы класса, во всей кодовой базе.

Я знаю, что это немного отличается от того, что вы искали, но для большинства намерений и целей отключение копа так же хорошо, как установка максимума на 30. ;-)

person Drenmi    schedule 27.03.2020