Optimization quality-ruff
Ruff 린터/포맷터 설정 및 관리 스킬. pyproject.toml에 Ruff 설정을 구성하고 최적화한다. Flake8, isort, Black을 대체하는 고속 린터/포맷터 환경을 구축한다.
install
source · Clone the upstream repo
git clone https://github.com/sunLeee/optimization
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/sunLeee/optimization "$T" && mkdir -p ~/.claude/skills && cp -r "$T/.claude/skills/quality/check/quality-ruff" ~/.claude/skills/sunleee-optimization-quality-ruff && rm -rf "$T"
manifest:
.claude/skills/quality/check/quality-ruff/SKILL.mdsource content
Ruff 설정 관리
Ruff 린터/포맷터 환경을 구성하고 관리한다.
목적
- Ruff 린터/포맷터 설정
- 프로젝트별 규칙 세트 최적화
- pyproject.toml 설정 관리
- 기존 도구(Flake8, isort, Black) 마이그레이션
사용법
/quality-ruff init # 초기 설정 /quality-ruff check # 린트 검사 /quality-ruff fix # 자동 수정 /quality-ruff format # 코드 포맷팅
표준 설정
pyproject.toml
# ============================================================================= # Ruff Configuration # Documentation: https://docs.astral.sh/ruff/configuration/ # ============================================================================= [tool.ruff] # 기본 설정 target-version = "py311" line-length = 100 indent-width = 4 # 검사 대상 src = ["src", "tests"] include = ["*.py", "*.pyi"] exclude = [ ".git", ".ruff_cache", ".venv", "__pycache__", "build", "dist", "*.egg-info", ] # 캐시 설정 cache-dir = ".ruff_cache" # 출력 형식 output-format = "concise" # ============================================================================= # Lint 설정 # ============================================================================= [tool.ruff.lint] # 규칙 세트 select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # Pyflakes "I", # isort "B", # flake8-bugbear "C4", # flake8-comprehensions "UP", # pyupgrade "ARG", # flake8-unused-arguments "SIM", # flake8-simplify "TCH", # flake8-type-checking "PTH", # flake8-use-pathlib "RUF", # Ruff-specific rules ] # 무시 규칙 ignore = [ "E501", # line too long (포맷터가 처리) "B008", # function call in default argument (FastAPI Depends) "B904", # raise without from (불필요한 경우 많음) ] # 자동 수정 가능 규칙 fixable = ["ALL"] unfixable = [] # 더미 변수 패턴 dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" # ============================================================================= # isort 설정 (I 규칙) # ============================================================================= [tool.ruff.lint.isort] known-first-party = ["src"] force-single-line = false lines-after-imports = 2 section-order = [ "future", "standard-library", "third-party", "first-party", "local-folder", ] # ============================================================================= # flake8-bugbear 설정 (B 규칙) # ============================================================================= [tool.ruff.lint.flake8-bugbear] extend-immutable-calls = [ "fastapi.Depends", "fastapi.Query", "fastapi.Path", "fastapi.Body", ] # ============================================================================= # 파일별 규칙 오버라이드 # ============================================================================= [tool.ruff.lint.per-file-ignores] "tests/**/*.py" = [ "S101", # assert 허용 "ARG001", # 미사용 인자 허용 (fixtures) "ARG002", # 미사용 인자 허용 ] "__init__.py" = ["F401"] # 미사용 import 허용 "conftest.py" = ["ARG001"] # ============================================================================= # Format 설정 # ============================================================================= [tool.ruff.format] quote-style = "double" indent-style = "space" skip-magic-trailing-comma = false line-ending = "auto" docstring-code-format = true docstring-code-line-length = 80
규칙 세트 가이드
핵심 규칙
| 코드 | 카테고리 | 설명 |
|---|---|---|
, | pycodestyle | PEP 8 스타일 검사 |
| Pyflakes | 논리 오류 검사 |
| isort | import 정렬 |
| flake8-bugbear | 버그 유발 패턴 |
| flake8-comprehensions | 컴프리헨션 최적화 |
| pyupgrade | 최신 Python 문법 |
추가 권장 규칙
| 코드 | 카테고리 | 설명 |
|---|---|---|
| flake8-simplify | 코드 간소화 |
| flake8-type-checking | 타입 힌트 최적화 |
| flake8-use-pathlib | pathlib 사용 권장 |
| Ruff-specific | Ruff 전용 규칙 |
| flake8-unused-arguments | 미사용 인자 검사 |
Data Science 추가 규칙
| 코드 | 카테고리 | 설명 |
|---|---|---|
| NumPy-specific | NumPy 규칙 |
| pandas-vet | Pandas 규칙 |
프로젝트 유형별 설정
1. 일반 Python
[tool.ruff.lint] select = ["E", "W", "F", "I", "B", "C4", "UP", "SIM", "RUF"]
2. Data Science
[tool.ruff.lint] select = ["E", "W", "F", "I", "B", "C4", "UP", "NPY", "PD", "RUF"] ignore = ["E501", "PD901"] # df 변수명 허용
3. FastAPI/API 서버
[tool.ruff.lint] select = ["E", "W", "F", "I", "B", "C4", "UP", "ARG", "SIM", "TCH", "RUF"] ignore = ["B008"] # Depends 허용 [tool.ruff.lint.flake8-bugbear] extend-immutable-calls = ["fastapi.Depends", "fastapi.Query"]
실행 명령
린트 검사
# 기본 검사 uv run ruff check . # 상세 출력 uv run ruff check . --verbose # 자동 수정 uv run ruff check . --fix # 안전하지 않은 수정 포함 uv run ruff check . --fix --unsafe-fixes # 특정 규칙만 검사 uv run ruff check . --select E,W,F
포맷팅
# 포맷 검사 (변경 없이) uv run ruff format --check . # 포맷 적용 uv run ruff format . # diff 출력 uv run ruff format --diff .
VS Code 통합
settings.json
{ "[python]": { "editor.defaultFormatter": "charliermarsh.ruff", "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll.ruff": "explicit", "source.organizeImports.ruff": "explicit" } }, "ruff.lint.args": ["--config=pyproject.toml"], "ruff.format.args": ["--config=pyproject.toml"] }
마이그레이션
Flake8 → Ruff
# Flake8 규칙을 Ruff로 변환 ruff rule --all | grep "Flake8"
isort → Ruff
# 기존 isort 설정 [tool.isort] profile = "black" # Ruff isort 설정으로 변환 [tool.ruff.lint.isort] known-first-party = ["src"]
Black → Ruff
# Ruff 포맷터는 Black과 99% 호환 uv run ruff format .
규칙 무시
파일 수준
# ruff: noqa: E501
라인 수준
x = "long line" # noqa: E501
특정 규칙만 무시
# noqa: E501, F401
트러블슈팅
캐시 초기화
rm -rf .ruff_cache
규칙 설명 확인
ruff rule E501
설정 검증
ruff check --show-settings
관련 스킬
| 스킬 | 역할 |
|---|---|
| [@skills/quality-precommit/SKILL.md] | Pre-commit hook 설정 |
| [@skills/quality-mypy/SKILL.md] | mypy 타입 검사 설정 |
| [@skills/check-python-style/SKILL.md] | 코드 스타일 검증 |
| [@skills/convention-python/SKILL.md] | Python 코딩 컨벤션 |
Changelog
| 날짜 | 버전 | 변경 내용 |
|---|---|---|
| 2026-01-21 | 1.0.0 | 초기 생성 - Ruff 설정 관리 |
Gotchas (실패 포인트)
(포맷)과ruff format
(린트)는 별개 명령 — 둘 다 실행 필요ruff check- Black과 충돌: ruff format은 Black 호환이나 rule 일부 충돌 가능
주석 남용 금지 — 근본 원인 수정 후 제거# noqa
비활성화 후 line-length 설정 누락 시 모순E501