codeclimate-duplication -это двигатель, который завершает Flay и поддерживает Java, Ruby, Python, JavaScript и PHP. Вы можете запустить его в командной строке, используя CODE Climate CLI или на нашей хостированной платформе анализа.
Алгоритм двигателя дублирования может быть удивительным, но на самом деле он очень просто. У нас есть страница документов, объясняющая алгоритм.
cd в папке вашего проекта и запустите codeclimate analyze . Анализ дублирования включен по умолчанию, поэтому вам не нужно ничего делать. Мы устанавливаем полезные пороговые значения по умолчанию для языков, которые мы поддерживаем, но вы, возможно, захотите настроить эти настройки в зависимости от руководящих принципов вашего проекта.
Конфигурация массового порога представляет минимальную «массу». Кодовый блок должен быть проанализирован для дублирования. Если двигатель слишком легко сообщать о дублировании, попробуйте поднять порог. Если вы подозреваете, что двигатель не ловит достаточно дублирования, попробуйте опустить порог. Лучшая настройка имеет тенденцию отличаться от языка к языку.
Чтобы настроить эту настройку, используйте клавишу checks верхнего уровня в вашем файле конфигурации:
checks :
identical-code :
config :
threshold : 25
similar-code :
config :
threshold : 50 Обратите внимание, что у вас есть обновление структуры YAML в рамках ключа languages к типу хэша для поддержки дополнительной конфигурации.
По умолчанию механизм дублирования сообщит о коде, который был дублирован только в двух местах. Вы можете быть менее строгими, только поднимая предупреждение, если код дублируется только в трех или более местах. Чтобы настроить этот параметр, добавьте клавишу count_threshold в вашу конфигурацию. Например, для использования по умолчанию mass_threshold для Ruby, но для обеспечения соблюдения правила три, вы можете использовать эту конфигурацию:
plugins :
duplication :
enabled : true
config :
languages :
ruby :
count_threshold : 3 Вы также можете изменить по умолчанию count_threshold для всех языков:
plugins :
duplication :
enabled : true
config :
count_threshold : 3 Все двигатели проверяют только соответствующие файлы, но вы можете переопределить набор шаблонов по умолчанию. Паттерны выполняются против каталога Project Root, поэтому вам нужно использовать ** для сопоставления файлов в вложенных каталогах. Также обратите внимание, что вы должны указать все шаблоны, а не только тот, который вы хотите добавить.
plugins :
duplication :
enabled : true
config :
languages :
ruby :
patterns :
- " **/*.rb
- " **/*.rake"
- " Rakefile "
- " **/*.ruby " По умолчанию двигатель дублирования будет использовать анализатор Python 2. Чтобы включить анализ кода Python 3, укажите python_version как показано в примере ниже. Это позволит анализатор Python 3 и добавит расширение файла .py3 в список включенных шаблонов файлов.
plugins :
duplication :
enabled : true
config :
languages :
python :
python_version : 3Иногда сообщается, что структурное сходство вас не заботится. Например, содержимое массивов или хэшей может иметь аналогичные структуры, и вы мало что можете сделать, чтобы реорганизовать их. Вы можете указать фильтры для конкретных языков, чтобы игнорировать любые проблемы, которые соответствуют шаблону. Вот пример, который фильтрует простые хэши и массивы:
plugins :
duplication :
enabled : true
config :
languages :
ruby :
filters :
- " (hash (lit _) (str _) ___) "
- " (array (str _) ___) " Синтаксис для узоров довольно прост. В первом шаблоне: "(hash (lit _) (str _) ___)" Указывает «хэш с буквальным ключом, строковое значение, за которым следует что -то еще (включая ничего)». Вы также можете указать "(hash ___)" , чтобы игнорировать все хеши вообще.
Выяснить, что фильтровать, сложно. Codeclimate-Duplication поставляется с опцией конфигурации, чтобы помочь с обнаружением. Вместо того, чтобы сканировать ваш код и распечатать проблемы для Codeclimate, он вместо этого распечатывает деревья Parse! Просто добавьте dump_ast: true и debug: true к вашему файлу .codeclimate.yml:
---
plugins:
duplication:
enabled: true
config:
dump_ast: true
debug: true
... rest of config ...
Затем запустите codeclimate analyze при использовании флага отладки для вывода STDERR:
% CODECLIMATE_DEBUG=1 codeclimate analyze
Запуск этой команды может вывести что -то вроде:
Sexps for issues:
# 1) ExpressionStatement#4261258897 mass=128:
# 1.1) bogus-examples.js:5
s(:ExpressionStatement,
:expression,
s(:AssignmentExpression,
:"=",
:left,
s(:MemberExpression,
:object,
s(:Identifier, :EventBlock),
:property,
s(:Identifier, :propTypes)),
... LOTS more...)
... even more LOTS more...)
Это внутреннее представление фактического кода. Предполагая, что вы рассмотрели эти проблемы и определили, что они не являются проблемой, которую вы хотите решить, вы можете отфильтровать ее, написав строку шаблона, которая бы соответствовала этому дереву.
Глядя на выход дерева снова, на этот раз сглаживая его:
s(:ExpressionStatement, :expression, s(:AssignmentExpression, :"=",:left, ...) ...)
Внутреннее представление (которое является Ruby) отличается от языка шаблонов (который похож на LISP), поэтому сначала нам нужно преобразовать s(: ( удалить все запятые и колоны:
(ExpressionStatement expression (AssignmentExpression "=" left ...) ...)
Далее, нам не волнует expression , поэтому давайте избавимся от этого, заменив его на сочетание на любой элемент _ :
(ExpressionStatement _ (AssignmentExpression "=" left ...) ...)
То же самое касается "=" и left , но нам на самом деле не заботятся об остальной части узла назначения, так что давайте используем сочетание, который игнорирует оставшуюся часть дерева ___ :
(ExpressionStatement _ (AssignmentExpression ___) ...)
И, наконец, нам не волнует то, что следует в ExpressionStatement , так что давайте также проигнорируем остальное:
(ExpressionStatement _ (AssignmentExpression ___) ___)
Это гласит: «Любой узел ExpressionStatement, с любым значением и узлом назначения экспрессии с чем -либо в нем, за которым следует что -либо еще». Есть и другие способы написать шаблон, чтобы соответствовать этому дереву, но это довольно ясно.
Затем вы можете добавить этот фильтр в свою конфигурацию:
---
plugins:
duplication:
enabled: true
config:
dump_ast: true
languages:
javascript:
filters:
- "(ExpressionStatement _ (AssignmentExpression ___) ___)"
Затем повторно запустите анализатор и выясните, каким должен быть следующий фильтр. Когда вы довольны результатами, удалите конфигурацию dump_ast (или установите его на false), чтобы вернуться к нормальному анализу.
Для получения дополнительной информации о сопоставлении шаблонов см. Sexp_processor, особенно Sexp.rb