codeclimate-duplication ist eine Engine, die den Flay umschließt und Java, Ruby, Python, JavaScript und PHP unterstützt. Sie können es auf der Befehlszeile mit der Code -Klima -CLI oder auf unserer gehosteten Analyseplattform ausführen.
Der Algorithmus des Duplication Engine kann überraschend sein, aber es ist tatsächlich sehr einfach. Wir haben eine DOCS -Seite, auf der der Algorithmus erläutert wird.
cd in den Ordner Ihres Projekts und führen Sie codeclimate analyze aus. Die Duplikationsanalyse ist standardmäßig aktiviert, sodass Sie nichts anderes tun müssen. Wir setzen nützliche Schwellenwertversuche für die von uns unterstützten Sprachen ein, aber Sie möchten diese Einstellungen möglicherweise anhand Ihrer Projektrichtlinien anpassen.
Die Konfiguration des Massenschwellenwerts repräsentiert die minimale "Masse", die ein Codeblock für die Duplikation analysiert werden muss. Wenn der Motor zu leicht zu doppelte Meldung ist, versuchen Sie, den Schwellenwert zu erhöhen. Wenn Sie vermuten, dass der Motor nicht genug Duplizierung fängt, senken Sie den Schwellenwert. Die beste Einstellung unterscheidet sich von Sprache zu Sprache.
Um diese Einstellung anzupassen, verwenden Sie den Taste der obersten checks in Ihrer Konfigurationsdatei:
checks :
identical-code :
config :
threshold : 25
similar-code :
config :
threshold : 50 Beachten Sie, dass Sie die YAML -Struktur unter dem languages -Schlüssel zum Hash -Typ aktualisieren, um zusätzliche Konfiguration zu unterstützen.
Standardmäßig meldet die Duplikationsmotor Code, der an nur zwei Standorten dupliziert wurde. Sie können weniger streng sein, wenn Sie nur eine Warnung anstellen, wenn Code nur an drei oder mehr Standorten dupliziert wird. Um diese Einstellung anzupassen, fügen Sie Ihrer Konfiguration einen count_threshold -Schlüssel hinzu. Zum Beispiel können mass_threshold diese Konfiguration verwenden:
plugins :
duplication :
enabled : true
config :
languages :
ruby :
count_threshold : 3 Sie können auch die Standard count_threshold für alle Sprachen ändern:
plugins :
duplication :
enabled : true
config :
count_threshold : 3 Alle Motoren überprüfen nur geeignete Dateien, aber Sie können den Standard -Mustersatz überschreiben. Muster werden gegen das Projekt Root -Verzeichnis ausgeführt, sodass Sie ** verwenden müssen, um Dateien in verschachtelten Verzeichnissen abzustimmen. Beachten Sie auch, dass Sie alle Muster angeben müssen, nicht nur die, die Sie hinzufügen möchten.
plugins :
duplication :
enabled : true
config :
languages :
ruby :
patterns :
- " **/*.rb
- " **/*.rake"
- " Rakefile "
- " **/*.ruby " Standardmäßig verwendet der Duplizierungsmotor einen Python 2 -Parser. Um eine Analyse für den Python 3 -Code zu aktivieren, geben Sie die python_version an, wie im folgenden Beispiel gezeigt. Dadurch können Sie einen Python 3 -Parser ermöglichen und die .py3 -Dateierweiterung in die Liste der enthaltenen Dateimuster hinzufügen.
plugins :
duplication :
enabled : true
config :
languages :
python :
python_version : 3Manchmal werden strukturelle Ähnlichkeiten berichtet, dass Sie sich einfach nicht interessieren. Zum Beispiel können der Inhalt von Arrays oder Hashes ähnliche Strukturen aufweisen und es gibt wenig, was Sie tun können, um sie neu zu gestalten. Sie können sprachspezifische Filter angeben, um alle Probleme zu ignorieren, die dem Muster entsprechen. Hier ist ein Beispiel, das einfache Hashes und Arrays filtert:
plugins :
duplication :
enabled : true
config :
languages :
ruby :
filters :
- " (hash (lit _) (str _) ___) "
- " (array (str _) ___) " Die Syntax für Muster ist ziemlich einfach. Im ersten Muster: "(hash (lit _) (str _) ___)" Gibt "ein Hash mit einem wörtlichen Schlüssel, einem Stringwert, gefolgt von irgendetwas anderem (einschließlich nichts)" an. " Sie können auch "(hash ___)" angeben, um alle Hashes insgesamt zu ignorieren.
Es ist schwierig, herauszufinden, was zu filtern ist. Die CodeClimate-Duplikation bietet eine Konfigurationsoption, um die Erkennung zu unterstützen. Anstatt Ihren Code zu scannen und Probleme für CodeClimate auszudrucken, druckt er stattdessen die Parse-Bäume aus! Fügen Sie einfach dump_ast: true und debug: true zu Ihrer .codeclimate.yml -Datei:
---
plugins:
duplication:
enabled: true
config:
dump_ast: true
debug: true
... rest of config ...
Führen Sie dann codeclimate analyze durch, während Sie das Debug -Flag verwenden, um stderr auszugeben:
% CODECLIMATE_DEBUG=1 codeclimate analyze
Das Ausführen dieses Befehls könnte so etwas wie folgt ausgeben:
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...)
Dies ist die interne Darstellung des tatsächlichen Code. Angenommen, Sie haben sich diese Probleme angesehen und festgestellt, dass sie kein Problem sein, das Sie angehen möchten, können Sie sie filtern, indem Sie eine Musterzeichenfolge schreiben, die mit diesem Baum übereinstimmt.
Betrachten Sie die Baumausgabe erneut, diesmal flach ihn aus:
s(:ExpressionStatement, :expression, s(:AssignmentExpression, :"=",:left, ...) ...)
Die interne Darstellung (die Ruby ist) unterscheidet sich von der Mustersprache (die lisparisch ist). Zuerst müssen wir ( s(: um alle Kommas und Colons entfernen:
(ExpressionStatement expression (AssignmentExpression "=" left ...) ...)
_ nächstes kümmern wir uns nicht um den expression .
(ExpressionStatement _ (AssignmentExpression "=" left ...) ...)
Gleiches gilt für "=" und left , aber wir kümmern uns eigentlich nicht um den Rest des Auftragsausdrucks ___
(ExpressionStatement _ (AssignmentExpression ___) ...)
Und schließlich kümmern wir uns nicht um das, was im ExpressionStatement folgt. Lassen Sie uns auch den Rest ignorieren:
(ExpressionStatement _ (AssignmentExpression ___) ___)
Dies lautet: "Jeder ExpressionStatement -Knoten mit einem beliebigen Wert und einem Zuordnungsexpressionsknoten mit irgendetwas darin, gefolgt von irgendetwas anderem". Es gibt andere Möglichkeiten, ein Muster zu schreiben, das diesem Baum entspricht, aber das ist ziemlich klar.
Dann können Sie diesen Filter zu Ihrer Konfiguration hinzufügen:
---
plugins:
duplication:
enabled: true
config:
dump_ast: true
languages:
javascript:
filters:
- "(ExpressionStatement _ (AssignmentExpression ___) ___)"
Dann den Analysator erneut übertragen und herausfinden, wie der nächste Filter aussehen sollte. Wenn Sie mit den Ergebnissen zufrieden sind, entfernen Sie die Konfiguration dump_ast (oder setzen Sie sie auf false), um wieder zu einer normalen Analyse zurückzukehren.
Weitere Informationen zum Muster -Matching finden Sie im Sexp_prozessor, insbesondere zu Sexp.rb