codeclimate-duplication Flayをラップし、Java、Ruby、Python、JavaScript、PHPをサポートするエンジンです。 Code Climate CLIまたはホストされた分析プラットフォームを使用して、コマンドラインで実行できます。
Duplication Engineのアルゴリズムは驚くべきことですが、実際には非常に簡単です。アルゴリズムを説明するドキュメントページがあります。
cdを使用し、 codeclimate analyzeます。デフォルトでは複製分析が有効になっているため、他に何もする必要はありません。 サポートする言語の有用なしきい値のデフォルトを設定しますが、プロジェクトのガイドラインに基づいてこれらの設定を調整することをお勧めします。
マスしきい値構成は、複製のためにコードブロックを分析する必要がある最小「質量」を表します。エンジンが重複を簡単に報告しすぎている場合は、しきい値を上げてみてください。エンジンが十分な複製をキャッチしていないと思われる場合は、しきい値を下げてみてください。最適な設定は、言語ごとに異なる傾向があります。
この設定を調整するには、構成ファイルのトップレベルchecksキーを使用します。
checks :
identical-code :
config :
threshold : 25
similar-code :
config :
threshold : 50追加の構成をサポートするために、ハッシュタイプのlanguagesキーの下でYAML構造を更新することに注意してください。
デフォルトでは、複製エンジンは、わずか2つの場所で複製されたコードを報告します。コードが3つ以上の場所でのみ複製されている場合にのみ警告を発生させることで、厳格になる可能性があります。この設定を調整するには、 count_thresholdキーを設定に追加します。たとえば、rubyにデフォルトのmass_thresholdを使用するには、3のルールを実施するには、この構成を使用できます。
plugins :
duplication :
enabled : true
config :
languages :
ruby :
count_threshold : 3すべての言語のデフォルトのcount_threshold変更することもできます。
plugins :
duplication :
enabled : true
config :
count_threshold : 3すべてのエンジンは適切なファイルのみをチェックしますが、パターンのデフォルトセットをオーバーライドできます。パターンはプロジェクトルートディレクトリに対して実行されるため、ネストされたディレクトリのファイルを一致させるには**使用する必要があります。また、追加するパターンだけでなく、すべてのパターンを指定する必要があることに注意してください。
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には、発見を支援する構成オプションが付属しています。コードをスキャンしてCodeClimeの問題を印刷する代わりに、代わりにParse-Treeを印刷します! dump_ast: trueとdebug: true your your your Your .CodeClimate.ymlファイル:
---
plugins:
duplication:
enabled: true
config:
dump_ast: true
debug: true
... rest of config ...
次に、デバッグフラグを使用してSTDERRを出力しながらcodeclimate analyze 。
% 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も当てはまりますが、実際にはassignmentExpressionノードの残りの部分については気にしないので、残りのツリーを無視するマッチャーを使用しましょう___ :
(ExpressionStatement _ (AssignmentExpression ___) ...)
そして最後に、私たちはExpressionStatementに続くものを気にしないので、残りも無視しましょう。
(ExpressionStatement _ (AssignmentExpression ___) ___)
これには、「任意のexpression -statementノード、任意の値とassignmentexpressionノードが含まれており、その後は他にあらゆるものが続きます」と書かれています。このツリーに合わせてパターンを書く方法は他にもありますが、これはかなり明確です。
次に、そのフィルターを構成に追加できます。
---
plugins:
duplication:
enabled: true
config:
dump_ast: true
languages:
javascript:
filters:
- "(ExpressionStatement _ (AssignmentExpression ___) ___)"
次に、アナライザーを再実行し、次のフィルターがどうあるべきかを把握します。結果に満足したら、 dump_ast configを削除(またはfalseに設定)して、通常の分析に戻ります。
パターンマッチングの詳細については、sexp_processor、特にsexp.rbを参照してください