codeclimate-duplication est un moteur qui enveloppe le scie et prend en charge Java, Ruby, Python, JavaScript et PHP. Vous pouvez l'exécuter sur la ligne de commande à l'aide du Code Climate CLI ou sur notre plate-forme d'analyse hébergée.
L'algorithme du moteur de duplication peut être surprenant, mais c'est en fait très simple. Nous avons une page Docs expliquant l'algorithme.
cd dans le dossier de votre projet et exécutez codeclimate analyze . L'analyse de la duplication est activée par défaut, vous n'avez donc rien à faire d'autre. Nous définissons les paramètres de seuil utiles pour les langues que nous prenons en charge, mais vous souhaiterez peut-être ajuster ces paramètres en fonction de vos directives de projet.
La configuration de seuil de masse représente la "masse" minimale qu'un bloc de code doit être analysé pour la duplication. Si le moteur signale trop facilement la duplication, essayez d'augmenter le seuil. Si vous soupçonnez que le moteur n'attrape pas suffisamment de duplication, essayez d'abaisser le seuil. Le meilleur paramètre a tendance à différer d'une langue à l'autre.
Pour ajuster ce paramètre, utilisez la touche checks de niveau supérieur dans votre fichier de configuration:
checks :
identical-code :
config :
threshold : 25
similar-code :
config :
threshold : 50 Notez que vous avez la mise à jour de la structure YAML sous la touche languages du type de hachage pour prendre en charge la configuration supplémentaire.
Par défaut, le moteur de duplication rapportera le code qui a été dupliqué dans seulement deux emplacements. Vous pouvez être moins strict en augmentant uniquement un avertissement si le code est dupliquée dans trois emplacements ou plus. Pour ajuster ce paramètre, ajoutez une touche count_threshold à votre configuration. Par exemple, pour utiliser la mass_threshold par défaut_threshold pour Ruby, mais pour appliquer la règle de trois, vous pouvez utiliser cette configuration:
plugins :
duplication :
enabled : true
config :
languages :
ruby :
count_threshold : 3 Vous pouvez également modifier le count_threshold par défaut pour toutes les langues:
plugins :
duplication :
enabled : true
config :
count_threshold : 3 Tous les moteurs vérifient uniquement les fichiers appropriés, mais vous pouvez remplacer l'ensemble de modèles par défaut. Les modèles sont exécutés contre le répertoire racine du projet, vous devez donc utiliser ** pour faire correspondre les fichiers dans les répertoires imbriqués. Notez également que vous devez spécifier tous les modèles, pas seulement celui que vous souhaitez ajouter.
plugins :
duplication :
enabled : true
config :
languages :
ruby :
patterns :
- " **/*.rb
- " **/*.rake"
- " Rakefile "
- " **/*.ruby " Par défaut, le moteur de duplication utilisera un analyseur Python 2. Pour activer l'analyse du code Python 3, spécifiez le python_version comme indiqué dans l'exemple ci-dessous. Cela permettra un analyseur Python 3 et ajoutera l'extension de fichier .py3 à la liste des modèles de fichiers inclus.
plugins :
duplication :
enabled : true
config :
languages :
python :
python_version : 3Parfois, des similitudes structurelles sont signalées que vous ne vous souciez tout simplement pas. Par exemple, le contenu des tableaux ou des hachages peut avoir des structures similaires et vous ne pouvez pas faire peu pour les refactor. Vous pouvez spécifier des filtres spécifiques à la langue pour ignorer tous les problèmes qui correspondent au modèle. Voici un exemple qui filtre des hachages et des tableaux simples:
plugins :
duplication :
enabled : true
config :
languages :
ruby :
filters :
- " (hash (lit _) (str _) ___) "
- " (array (str _) ___) " La syntaxe des motifs est assez simple. Dans le premier modèle: "(hash (lit _) (str _) ___)" Spécifie "un hachage avec une clé littérale, une valeur de chaîne, suivie de toute autre chose (y compris rien)". Vous pouvez également spécifier "(hash ___)" pour ignorer complètement tous les hachages.
Déterminer quoi filtrer est délicat. CodeClimate-Duplication est livré avec une option de configuration pour aider à la découverte. Au lieu de scanner votre code et d'imprimer les problèmes pour CodeClimate, il imprime plutôt les arbres d'analyse! Ajoutez simplement dump_ast: true et debug: true dans votre fichier .codeclimate.yml:
---
plugins:
duplication:
enabled: true
config:
dump_ast: true
debug: true
... rest of config ...
Exécutez ensuite codeclimate analyze lors de l'utilisation de l'indicateur de débogage pour produire STDERR:
% CODECLIMATE_DEBUG=1 codeclimate analyze
L'exécution de cette commande pourrait sortir quelque chose comme:
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...)
Il s'agit de la représentation interne du code réel. En supposant que vous avez examiné ces problèmes et que vous les avez déterminés à ne pas être un problème que vous souhaitez résoudre, vous pouvez le filtrer en écrivant une chaîne de modèle qui correspondrait à cet arbre.
En regardant à nouveau la sortie de l'arbre, cette fois en l'aplaçant:
s(:ExpressionStatement, :expression, s(:AssignmentExpression, :"=",:left, ...) ...)
La représentation interne (qui est Ruby) est différente de la langue du motif (qui ressemble à LISP), donc nous devons d'abord convertir s(: ( et supprimer toutes les virgules et les colons:
(ExpressionStatement expression (AssignmentExpression "=" left ...) ...)
_ , nous ne nous soucions pas d' expression de votre
(ExpressionStatement _ (AssignmentExpression "=" left ...) ...)
Il en va de même pour "=" et left , mais nous ne nous soucions en fait pas du reste du nœud d'attribution de l'expression, alors utilisons le match qui ignorera le reste de l'arbre ___ :
(ExpressionStatement _ (AssignmentExpression ___) ...)
Et enfin, nous ne nous soucions pas de ce qui suit dans le ExpressionStatement , alors ignorons aussi le reste:
(ExpressionStatement _ (AssignmentExpression ___) ___)
Cela se lit comme suit: "Tout nœud d'expressionstatement, avec n'importe quelle valeur et un nœud d'attribution de l'expression avec quoi que ce soit, suivi de quoi que ce soit d'autre". Il existe d'autres façons d'écrire un modèle pour correspondre à cet arbre, mais c'est assez clair.
Ensuite, vous pouvez ajouter ce filtre à votre configuration:
---
plugins:
duplication:
enabled: true
config:
dump_ast: true
languages:
javascript:
filters:
- "(ExpressionStatement _ (AssignmentExpression ___) ___)"
Ensuite, relâchez l'analyseur et déterminez quel devrait être le filtre suivant. Lorsque vous êtes satisfait des résultats, supprimez la configuration dump_ast (ou définissez-la sur False) pour revenir à l'analyse normale.
Pour plus d'informations sur l'appariement des modèles, voir sexp_processor, en particulier sexp.rb