Ruff — Linter & Formatter
Ruff menggabungkan linter dan formatter Python jadi satu tool yang sangat cepat. Ini konfigurasi minimal yang perlu kamu tahu.
Intisari
- Dua peran berbeda dalam satu tool:
ruff format(merapikan) danruff check(menemukan masalah). - Menggantikan black + flake8 + isort + pyupgrade + autoflake sekaligus.
- Aturan dipilih lewat kode huruf:
E/Fdasar,Iurutan import,UPmodernisasi sintaks,Bjebakan umum. --fixmemperbaiki otomatis sebagian besar temuan. Aman dipakai rutin.- Aktifkan format-on-save di editor sejak hari pertama — supaya kamu tidak pernah memikirkan format lagi.
Dua peran yang harus kamu bedakan
ruff format | ruff check | |
|---|---|---|
| Menggantikan | black | flake8, isort, pyupgrade |
| Mengurus | Tata letak: indentasi, kutip, panjang baris | Kebenaran: variabel tak terpakai, import mati, bug kecil |
| Bisa salah? | Tidak — perubahan tidak mengubah arti kode | Kadang: sebagian aturan bersifat opini |
| Kapan jalan | Setiap kali save | Sebelum commit & di CI |
Pemakaian dasar
uvx ruff format . # rapikan semua file
uvx ruff format --check . # cek saja, jangan ubah (untuk CI)
uvx ruff check . # cari masalah
uvx ruff check --fix . # cari + perbaiki yang bisa diperbaiki otomatis
uvx ruff check --watch . # jalan terus, cek tiap file berubah
Konfigurasi di pyproject.toml
Ruff punya default yang masuk akal. Kamu hanya perlu menambahkan ini:
[tool.ruff]
line-length = 100
target-version = "py313"
[tool.ruff.lint]
select = [
"E", # pycodestyle — error gaya penulisan
"F", # pyflakes — variabel/import tak terpakai, nama tak dikenal
"I", # isort — urutan import
"UP", # pyupgrade — modernisasi sintaks lama
"B", # flake8-bugbear — jebakan yang sering jadi bug
"SIM", # flake8-simplify — kode yang bisa lebih sederhana
]
ignore = [
"E501", # panjang baris — sudah diurus formatter
]
[tool.ruff.lint.per-file-ignores]
"tests/*" = ["S101"] # assert boleh di file test
Kode aturan yang layak diaktifkan
| Kode | Isinya | Contoh temuan |
|---|---|---|
F | Kesalahan nyata | Import tak terpakai, variabel tak didefinisikan |
E | Gaya PEP 8 | Spasi ganda, baris terlalu panjang |
I | Urutan import | stdlib → third-party → lokal, otomatis dirapikan |
UP | Modernisasi | List[str] → list[str], % → f-string |
B | Jebakan umum | Mutable default argument, except terlalu luas |
SIM | Penyederhanaan | if x == True → if x |
ASYNC | Kesalahan async | Panggilan blocking di dalam async def |
UP adalah pilihan bernilai tinggi untuk pendatang baru. Karena kamu belajar dari
banyak sumber yang usianya berbeda-beda, kamu pasti akan menulis idiom lama tanpa sadar.
Aturan UP menangkapnya dan --fix langsung memodernkannya — semacam guru
gaya penulisan yang otomatis.
Mematikan aturan pada baris tertentu
import os # noqa: F401 — sengaja diimpor untuk side effect
# noqa polos (tanpa kode) sebaiknya dihindari:
# ia mematikan SEMUA aturan di baris itu, termasuk yang belum ada.
x = eval(data) # noqa: S307
Integrasi editor
VS Code: pasang extension Ruff (astral-sh.ruff), lalu di settings.json:
{
"[python]": {
"editor.defaultFormatter": "charliermarsh.ruff",
"editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"source.fixAll.ruff": "explicit",
"source.organizeImports.ruff": "explicit"
}
}
}
Setelah ini, setiap kali kamu tekan simpan: kode dirapikan, import diurutkan, masalah kecil diperbaiki.
Menjalankan di CI
uvx ruff format --check . # gagal kalau ada file yang belum rapi
uvx ruff check . # gagal kalau ada temuan lint
Kalau kamu mengambil alih proyek lama
Menyalakan Ruff pada codebase lama bisa memunculkan ratusan temuan sekaligus. Cara halusnya:
uvx ruff check --statistics . # lihat sebarannya dulu
uvx ruff check --add-noqa . # bubuhkan noqa di semua temuan yang ada
Perintah kedua "membekukan" utang teknis yang ada, sehingga kode baru tetap bersih.
Lalu kamu bisa mencicil menghapus noqa itu seiring waktu.
Rangkuman ini sengaja dipangkas ke bagian yang dipakai di roadmap. Buka sumber aslinya saat kamu butuh detail lengkap atau referensi parameter.