codeclimate-duplication adalah mesin yang membungkus Flay dan mendukung Java, Ruby, Python, JavaScript, dan PHP. Anda dapat menjalankannya pada baris perintah menggunakan Code Climate CLI atau pada platform analisis yang di -host kami.
Algoritma mesin duplikasi bisa mengejutkan, tetapi sebenarnya sangat sederhana. Kami memiliki halaman dokumen yang menjelaskan algoritma.
cd ke folder proyek Anda dan jalankan codeclimate analyze . Analisis duplikasi diaktifkan secara default, jadi Anda tidak perlu melakukan hal lain. Kami menetapkan default ambang batas yang bermanfaat untuk bahasa yang kami dukung tetapi Anda mungkin ingin menyesuaikan pengaturan ini berdasarkan pedoman proyek Anda.
Konfigurasi ambang massa mewakili "massa" minimum blok kode harus dianalisis untuk duplikasi. Jika mesin terlalu mudah melaporkan duplikasi, cobalah menaikkan ambang batasnya. Jika Anda menduga bahwa mesin tidak menangkap duplikasi yang cukup, cobalah menurunkan ambang batasnya. Pengaturan terbaik cenderung berbeda dari bahasa ke bahasa.
Untuk menyesuaikan pengaturan ini, gunakan tombol checks tingkat atas di file konfigurasi Anda:
checks :
identical-code :
config :
threshold : 25
similar-code :
config :
threshold : 50 Perhatikan bahwa Anda memiliki memperbarui struktur YAML di bawah kunci languages untuk tipe hash untuk mendukung konfigurasi tambahan.
Secara default, mesin duplikasi akan melaporkan kode yang telah diduplikasi di hanya dua lokasi. Anda bisa kurang ketat dengan hanya meningkatkan peringatan jika kode hanya digandakan di tiga atau lebih lokasi. Untuk menyesuaikan pengaturan ini, tambahkan tombol count_threshold ke konfigurasi Anda. Misalnya, untuk menggunakan mass_threshold default untuk Ruby, tetapi untuk menegakkan aturan tiga, Anda dapat menggunakan konfigurasi ini:
plugins :
duplication :
enabled : true
config :
languages :
ruby :
count_threshold : 3 Anda juga dapat mengubah count_threshold default untuk semua bahasa:
plugins :
duplication :
enabled : true
config :
count_threshold : 3 Semua mesin memeriksa hanya file yang sesuai tetapi Anda dapat mengganti set pola default. Pola dijalankan melawan direktori root proyek sehingga Anda harus menggunakan ** untuk mencocokkan file dalam direktori bersarang. Perhatikan juga bahwa Anda harus menentukan semua pola, tidak hanya yang ingin Anda tambahkan.
plugins :
duplication :
enabled : true
config :
languages :
ruby :
patterns :
- " **/*.rb
- " **/*.rake"
- " Rakefile "
- " **/*.ruby " Secara default, mesin duplikasi akan menggunakan parser Python 2. Untuk mengaktifkan analisis untuk kode Python 3, tentukan python_version seperti yang ditunjukkan pada contoh di bawah ini. Ini akan mengaktifkan parser Python 3 dan menambahkan ekstensi file .py3 ke daftar pola file yang disertakan.
plugins :
duplication :
enabled : true
config :
languages :
python :
python_version : 3Terkadang kesamaan struktural dilaporkan bahwa Anda tidak peduli. Misalnya, isi array atau hash mungkin memiliki struktur yang sama dan ada sedikit yang dapat Anda lakukan untuk refactor mereka. Anda dapat menentukan filter khusus bahasa untuk mengabaikan masalah apa pun yang sesuai dengan polanya. Berikut adalah contoh yang menyaring hash dan array sederhana:
plugins :
duplication :
enabled : true
config :
languages :
ruby :
filters :
- " (hash (lit _) (str _) ___) "
- " (array (str _) ___) " Sintaks untuk pola cukup sederhana. Dalam pola pertama: "(hash (lit _) (str _) ___)" menentukan "hash dengan kunci literal, nilai string, diikuti oleh hal lain (termasuk tidak ada)". Anda juga dapat menentukan "(hash ___)" untuk mengabaikan semua hash sama sekali.
Mencari tahu apa yang harus disaring itu rumit. codeclim-duplikasi hadir dengan opsi konfigurasi untuk membantu penemuan. Alih-alih memindai kode Anda dan mencetak masalah untuk codeclimime, itu sebagai gantinya mencetak Parse-Trees! Cukup tambahkan dump_ast: true dan debug: true untuk file .codeclimate.yml Anda:
---
plugins:
duplication:
enabled: true
config:
dump_ast: true
debug: true
... rest of config ...
Kemudian jalankan codeclimate analyze saat menggunakan bendera debug untuk mengeluarkan stderr:
% CODECLIMATE_DEBUG=1 codeclimate analyze
Menjalankan perintah itu mungkin menghasilkan sesuatu seperti:
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...)
Ini adalah representasi internal dari kode aktual. Dengan asumsi Anda telah melihat masalah -masalah itu dan telah menentukan mereka untuk tidak menjadi masalah yang ingin Anda atasi, Anda dapat memfilternya dengan menulis string pola yang cocok dengan pohon itu.
Melihat output pohon lagi, kali ini meratakannya:
s(:ExpressionStatement, :expression, s(:AssignmentExpression, :"=",:left, ...) ...)
Representasi internal (yang ruby) berbeda dari bahasa pola (yang seperti LISP), jadi pertama-tama kita perlu mengonversi s(: ke ( dan menghapus semua koma dan titik dua:
(ExpressionStatement expression (AssignmentExpression "=" left ...) ...)
Selanjutnya, kami tidak peduli expression tentang jadi mari kita singkirkan itu dengan menggantinya dengan pencocokan untuk elemen tunggal _ :
(ExpressionStatement _ (AssignmentExpression "=" left ...) ...)
Hal yang sama berlaku untuk "=" dan left , tetapi kami sebenarnya tidak peduli dengan sisa simpul Expression, jadi mari kita gunakan pencocokan yang akan mengabaikan sisa pohon ___ :
(ExpressionStatement _ (AssignmentExpression ___) ...)
Dan akhirnya, kami tidak peduli tentang apa yang berikut dalam ExpressionStatement jadi mari kita abaikan sisanya juga:
(ExpressionStatement _ (AssignmentExpression ___) ___)
Ini berbunyi: "Node ExpressionStatement apa pun, dengan nilai apa pun dan simpul Expression dengan apa pun di dalamnya, diikuti oleh hal lain". Ada cara lain untuk menulis pola agar sesuai dengan pohon ini, tetapi ini cukup jelas.
Kemudian Anda dapat menambahkan filter itu ke konfigurasi Anda:
---
plugins:
duplication:
enabled: true
config:
dump_ast: true
languages:
javascript:
filters:
- "(ExpressionStatement _ (AssignmentExpression ___) ___)"
Kemudian jalankan kembali penganalisa dan cari tahu apa yang seharusnya menjadi filter berikutnya. Ketika Anda senang dengan hasilnya, hapus konfigurasi dump_ast (atau atur ke false) untuk kembali ke analisis normal.
Untuk informasi lebih lanjut tentang pencocokan pola, lihat sexp_processor, terutama sexp.rb