- Ruff v0.16.0, linter dan formatter Python yang ditulis dengan Rust, menambah aturan yang aktif secara default dari 59 menjadi 413, sehingga dapat mendeteksi lebih luas kesalahan sintaks dan error runtime yang langsung terjadi tanpa konfigurasi terpisah
- Mendukung pemformatan blok kode Python yang ditandai di Markdown dengan
python, py, pyi, pycon, dan lainnya, serta dapat diterapkan pada notebook Quarto
ruff: ignore dan ruff: file-ignore ditambahkan, sehingga diagnosis pada baris kode logis atau seluruh file dapat ditekan; komentar dapat disisipkan otomatis dengan --add-ignore
check dan format --check menampilkan perubahan perbaikan sebagai diff di bawah diagnosis secara default, dan pemeriksaan formatter juga mendukung JSON serta format output untuk anotasi CI GitHub/GitLab
- Sebagian besar dapat di-upgrade tanpa perubahan besar, tetapi perlu memeriksa dampak bertambahnya aturan default dan perubahan output JSON—beberapa nilai dapat menjadi
null—terhadap konfigurasi serta alat otomasi yang sudah ada
Aturan default diperluas menjadi 413
- Ruff v0.16.0 adalah linter dan formatter Python berkecepatan tinggi yang ditulis dengan Rust, dan dapat dipasang melalui PyPI atau
uv tool install ruff@latest
- Total aturan Ruff meningkat dari 708 pada v0.1.0 menjadi 968, tetapi aturan yang aktif secara default selama ini tetap 59
- v0.16 memperluas aturan default menjadi 413, sehingga masalah serius termasuk kesalahan sintaks dan error runtime yang langsung terjadi dapat dideteksi tanpa konfigurasi terpisah
- Mencakup aturan kategori
B dari flake8-bugbear, UP dari pyupgrade, serta RUF milik Ruff sendiri
- Daftar lengkap dapat dilihat di dokumen Default Rules
- Proyek yang sudah menggunakan
select atau extend-select juga dapat melihat aturan berguna yang sebelumnya belum diketahui melalui aturan default baru ini
- Untuk kembali ke aturan default sebelumnya, konfigurasikan seperti berikut
[lint]
select = ["E4", "E7", "E9", "F"]
- Perubahan ini terkait dengan proyek jangka panjang reklasifikasi aturan, dan pekerjaan terkait akan terus berlanjut
Pemformatan blok kode Markdown
ruff format memformat blok kode fenced Python yang ada di file Markdown
- String info yang didukung adalah
python, py, python3, py3, pyi, pycon
pyi diperlakukan sebagai format file stub
pycon diperlakukan sebagai format sesi REPL
- Sisanya diformat seperti file Python biasa
- Nama bahasa yang diapit kurung kurawal seperti
{python} juga dikenali, sehingga dapat digunakan untuk notebook Quarto
- Jika memakai ekstensi
.qmd, konfigurasi pemetaan extension mungkin diperlukan
- Di dalam blok kode, sebagian pemformatan dapat ditekan dengan
fmt: off dan fmt: on
- Seluruh area dokumen Markdown dapat dikecualikan dengan komentar HTML
<!-- fmt: off --> dan <!-- fmt: on -->
- Untuk mengecualikan semua file Markdown, tetapkan glob seperti
*.md pada extend-exclude
- Detail perilakunya dapat dilihat di dokumen pemformatan kode Markdown
Komentar penekan diagnosis baru
- Setelah penekanan berbasis cakupan
ruff: disable dan ruff: enable di v0.15, v0.16 menambahkan ruff: ignore dan ruff: file-ignore
ruff: ignore, seperti noqa, dapat menekan diagnosis pada baris yang sama, atau ditulis sebagai komentar tersendiri untuk diterapkan ke seluruh baris logis berikutnya
- Pada header fungsi yang ditulis beberapa baris, bagian dari
def hingga titik dua diperlakukan sebagai satu baris logis
ruff: file-ignore, seperti ruff: noqa, menekan diagnosis yang ditentukan di seluruh file
- Pada setiap komentar penekan, alasan penerapan dapat ditulis setelah kode aturan
- Opsi CLI
--add-ignore otomatis menambahkan komentar ruff: ignore yang diperlukan
- Dalam mode pratinjau, nama aturan seperti
unused-import juga dapat digunakan sebagai ganti kode seperti F401
- Spesifikasi komentar lengkap dirangkum dalam dokumen linter Ruff
Diff perbaikan dan format output
check dan format sebelumnya juga mendukung --diff, tetapi bekerja terpisah dari diagnosis umum sehingga tidak ditampilkan bersama diagnosis yang menunjukkan alasan perbaikan
- Output default
full di v0.16 menampilkan perbaikan linter dan formatter yang memungkinkan sebagai diff di bawah diagnosis
format --check juga dapat menggunakan seluruh format output yang didukung linter
- Dapat menghasilkan JSON yang dapat dibaca mesin
- Dapat mengeluarkan format yang dirender GitHub dan GitLab sebagai anotasi di CI
- Format yang didukung dapat dilihat di bantuan CLI dan dokumen format output
Kompatibilitas dan stabilisasi
- Perubahan breaking di v0.16 hanya sedikit, sehingga sebagian besar dapat diperbarui tanpa banyak mengubah kode atau konfigurasi
filename, location, end_location, fix.edits[].location, fix.edits[].end_location pada output JSON dapat menjadi null, alih-alih memakai string kosong atau baris 1 kolom 1 sebagai nilai default
- Diagnosis yang terdampak saat ini sangat sedikit, tetapi pada aturan mendatang hal ini dapat menjadi lebih umum
- 12 aturan beralih dari pratinjau ke status stabil
- Kompatibilitas signature fungsi Airflow 3
AIR303, pemberitahuan hak cipta CPY001, konversi float FURB164, min/max yang diurutkan FURB192
- Penggabungan string literal koleksi
ISC004, logging exception di luar exception handler LOG004, tipe pengembalian bool yang salah PLE0304
- Argumen posisi berlebihan
PLR0917, pengembalian StopIteration PLR1708, posisi None dalam Union RUF036
- Akses annotation pada dictionary kelas
RUF063, item duplikat di __all__ RUF068
- Beberapa perilaku stabil dari aturan yang sudah ada juga diterapkan secara default
BLE001 juga ditekan saat exception dicatat dengan metode logging selain critical, error, dan exception
FA102 memeriksa API tambahan yang kompatibel dengan PEP 585 seperti collections.abc
INT001·INT002·INT003 juga memeriksa pola penggunaan umum seperti menetapkan gettext ke builtins._
S310 menafsirkan binding literal string lokal untuk mengurangi false positive
S508·S509 mendukung API yang direkomendasikan pada PySNMP terbaru
UP019 mengenali bukan hanya typing.Text, tetapi juga typing_extensions.Text
- Perubahan lengkap dapat dilihat di rilis GitHub
1 komentar
Komentar Hacker News
Saya menaikkan proyek Python sekitar 3 ribu baris dari v0.15.x ke versi baru; tidak memakan waktu lama, dan versi baru menemukan banyak masalah yang luput dari versi sebelumnya sehingga kualitas kode juga membaik
Perbaikan manual sesuai saran: https://github.com/nickjj/plutus/commit/9af66d31f98bef841588...
Mengaktifkan kembali aturan panjang baris: https://github.com/nickjj/plutus/commit/21789f89bbcee37913c1...
Memaksa variabel yang tidak digunakan memakai prefiks
_: https://github.com/nickjj/plutus/commit/a272c77b932e1c78558a...Perbaikan otomatis Ruff: https://github.com/nickjj/plutus/commit/6fe69cf88385ebdf9b8c...
Senang melihat Ruff, ty, uv tetap aktif dikembangkan bahkan setelah Astral diakuisisi OpenAI
uv dan Ruff luar biasa, dan semoga ty suatu hari bisa mencapai level itu
Mengejutkan melihat orang begitu antusias terhadap alat polisi sintaks yang menerapkan aturan sewenang-wenang masing-masing dan bahkan tidak bisa sepakat soal seperti apa kode Python yang baik
Misalnya menggabungkan dictionary multi-baris menjadi satu baris sehingga merusak maksud komentar, lalu hanya membetulkan format remeh seperti dua spasi atau tanda kutip ganda. Masalah sebenarnya bukan spasi di akhir baris atau pengurutan import, melainkan list comprehension 10 baris yang sulit dipahami, dan alat-alat seperti ini tidak menangkapnya
Di kantor, penggunaan pylint, flake8, black, dan Ruff menghasilkan ratusan commit untuk setiap perubahan; energi itu seharusnya bisa dipakai di tempat lain
Jika menerima begitu saja hasil yang dijalankan otomatis, kita bisa keluar dari diskusi lint; tetapi di organisasi tanpa alat seperti ini, waktu nyata harus dihabiskan untuk memikirkan dan memperdebatkan format
Dalam pengembangan tim, alih-alih terlalu memaksakan preferensi pribadi, kita perlu mendengarkan pendapat sekitar dan meninjau ulang prioritas antara kolaborasi dan craftsmanship
Perilaku menggabungkan baris padahal ada komentar baris terlihat tidak tepat. Tanda kutip ganda di Python hanyalah pilihan gaya, dan jika ada tanda kutip ganda di dalam tanda kutip tunggal, Ruff juga membiarkannya apa adanya
Akan bagus jika Go punya alat seperti Ruff. Banyak bahasa punya alat yang hebat, tetapi ekosistem Go terasa terfragmentasi, dan tidak ada alat yang terasa sematang Ruff, Oxc, Biome, Mago
Karena relatif baru, ini belum begitu dikenal, tetapi menjadi dasar go fix dan go vet; tampaknya tim Go sedang berupaya agar penulis modul dapat dengan mudah mendefinisikan analysis pass kustom yang otomatis berjalan saat go fix dijalankan
Dengan struct
analysis.Analyzer, kita bisa mengakses AST, tipe, dan informasi SSA serta menggabungkan informasi antar-analyzer; jika dikompilasi menjadi binary dan diberikan ke go fix, toolchain akan menangani caching yang rumit. Karena dibuat langsung oleh tim Go dan disertakan dalam toolchain, alat seperti golangci-lint kemungkinan besar dalam jangka panjang juga akan terkonsolidasi ke framework iniKita bisa meminta agen AI menulis analyzer Go Analysis dan menjalankannya lewat go fix; di proyek saya sendiri, ini juga saya pakai untuk menegakkan beberapa aturan secara otomatis dan deterministik, alih-alih mengandalkan instruksi Markdown yang tidak akurat
gofmtuntuk Python. Ruff memang linter, bukan formatter, tetapi arah perkembangan ekosistem Python belakangan ini menggembirakanBerbeda dengan Python atau TypeScript, yang alat resminya tidak memaksakan gaya tertentu, di Go sulit mendapatkan efek dramatis seperti saat pertama kali memakai Ruff atau Biome
Mengaktifkan 413 aturan secara default adalah perubahan yang baik karena sebagian besar proyek bisa mendapatkan lint yang berguna tanpa perlu mengutak-atik konfigurasi
Saat ini mungkin bisa menyerahkan semua peringatan lint kepada agen untuk diperbaiki sesuai standar yang ditentukan lalu membiarkannya beberapa jam, tetapi diagnosis mendetail yang disediakan Ruff sendiri tetap patut disambut
Ruff juga membutuhkan fitur seperti stateVersion di Nix untuk menentukan kumpulan default yang akan diterapkan. Jika Ruff diperbarui di banyak repositori, setiap kali aturan default baru ditambahkan kita harus segera menonaktifkannya atau memperbaiki pelanggarannya, sehingga hasilnya sulit diprediksi
Memang bisa saja menuliskan semua aturan yang ingin diaktifkan dalam allowlist, tetapi lebih baik menjaga konfigurasi tetap sederhana dan hanya menaikkan versi status ketika semua orang bisa meluangkan beberapa jam
pyproject.tomlpada tiap proyek. Dengan begitu tiap proyek bisa menaikkan versi ketika sudah siap, tidak perlu mengoordinasikan banyak proyek sekaligus, dan jika satu tertinggal proyek lainnya tidak ikut terhambathttps://github.com/astral-sh/ruff/releases/tag/v0.1.0
Di era coding dengan agen, linting yang kuat lebih penting dari sebelumnya, dan saya ingin melihat alat seperti forbidigo di lebih banyak bahasa
Agen coding juga menghabiskan banyak token untuk memperbaiki masalah kecil, atau bahkan menonaktifkannya sama sekali saat tes gagal. Saya sudah mulai percaya pada akurasi umum hasil AI, tetapi penilaian terhadap kualitas kode masih sulit dipercaya
Meski aturannya sudah sebanyak 413, setiap kali bergabung ke codebase baru kita tetap mengulang tiga perdebatan yang sama soal pengurutan import
Senang rasanya karena sekarang penggunaan tanpa konfigurasi tampaknya direkomendasikan. Di
.ruff.tomlbaru cukup menyisakanline-length = 300