Ruff v0.16.0 릴리스 노트 / 새로운 내용

Ruff v0.16.0 릴리스 노트 / 새로운 내용

Ruff v0.16.0이 기본 린팅을 413개의 규칙으로 확장합니다

Ruff v0.16.0은 기본으로 활성화된 규칙 수를 59개에서 413개로 늘립니다. 이 변경으로 사용자는 구문 오류와 즉시 발생하는 런타임 오류와 같은 심각한 문제를 수동 설정 없이도 잡을 수 있습니다. 확장된 규칙 집합에는 flake8-bugbear(B), pyupgrade(UP), 그리고 Ruff 자체의 RUF 카테고리 규칙이 포함됩니다.

이전 기본 규칙 집합을 선호하는 사용자는 다음 설정을 사용해 되돌릴 수 있습니다:

[lint]
select = ["E4", "E7", "E9", "F"]

Markdown 코드 블록 포맷팅

Ruff v0.16.0은 이제 Markdown 파일에 포함된 Python 코드 블록을 포맷할 수 있습니다. 포맷터는 python, py, python3, py3, pyi, pycon과 같은 정보 문자열이 있는 fenced 코드 블록을 대상으로 합니다.

  • pyi 블록: 스텁 파일처럼 포맷됩니다.
  • pycon 블록: REPL 세션처럼 포맷됩니다.
  • 표준 Python 블록: 일반 Python 파일 포맷팅 방식으로 포맷됩니다.

이 기능은 Quarto 노트북(예: ````{python}``)에도 적용됩니다. 포맷팅은 코드 블록 내에서 fmt: offfmt: on 주석을 사용하거나, HTML 주석(<!-- fmt: off -->)으로 문서의 영역을 감싸서 억제할 수 있습니다. 전체 Markdown 파일은 extend-exclude 설정을 통해 제외할 수 있습니다.

ruff: ignore를 사용한 향상된 억제

버전 0.16.0은 자체 라인에 사용할 수 있는 새로운 억제 주석 형식을 도입하여 기존 ruff: disableruff: enable 범위 메커니즘보다 더 유연하게 만들었습니다.

  • ruff: ignore: 같은 라인 또는 다음 논리 라인에서 진단을 억제합니다. 여러 라인에 걸친 함수 헤더에 특히 유용합니다.
  • ruff: file-ignore: 전체 파일에 대해 특정 진단을 억제하며, ruff: noqa와 유사하게 동작합니다.

두 주석 유형 모두 억제 이유를 설명하는 선택적 "reason" 문자열을 지원합니다. 또한 새로운 --add-ignore CLI 플래그를 통해 이러한 주석을 자동으로 추가할 수 있습니다. 프리뷰 모드에서는 규칙 코드를 대신 규칙 이름(예: unused-import)을 사용할 수 있습니다.

CLI 출력에 통합된 수정 diff

Linter와 formatter의 수정 사항이 이제 checkformat --check 하위 명령의 기본 full 출력 형식 내에서 diff 형태로 직접 표시됩니다. 이전에는 --diff 플래그를 사용할 때만 이러한 변경 사항이 보였으며, 이 경우 설명 진단이 억제되었습니다.

format --check는 이제 linter에서 사용할 수 있는 모든 출력 형식을 지원합니다. 여기에는 기계가 읽을 수 있는 JSON과 GitHub 및 GitLab CI 주석과 호환되는 형식이 포함됩니다.

JSON 출력에 대한 참고: filename, location, end_location, fix.edits 위치 필드가 이제 빈 문자열이나 기본 좌표(행 1, 열 1) 대신 null이 될 수 있는 파괴적인 변경이 도입되었습니다.

안정화된 규칙 및 동작

안정화된 규칙

다음 규칙들이 프리뷰 단계에서 안정화 단계로 이동했습니다:

  • AIR303 (airflow3-incompatible-function-signature)
  • CPY001 (missing-copyright-notice)
  • FURB164 (unnecessary-from-float)
  • FURB192 (sorted-min-max)
  • ISC004 (implicit-string-concatenation-in-collection-literal)
  • LOG004 (log-exception-outside-except-handler)
  • PLE0304 (invalid-bool-return-type)
  • PLR0917 (too-many-positional-arguments)
  • PLR1708 (stop-iteration-return)
  • RUF036 (none-not-at-end-of-union)
  • RUF063 (access-annotations-from-class-dict)
  • RUF068 (duplicate-entry-in-dunder-all)

안정화된 동작

  • BLE001 (blind-except): critical, error, exception이 아닌 메서드로 예외를 로깅할 경우 억제됩니다.
  • FA102 (future-required-type-annotation): 이제 collections.abc를 포함한 추가 PEP 585 호환 API를 검사합니다.
  • INT001, INT002, INT003: 이제 builtins._에 대한 할당과 같은 보다 일반적인 gettext 모듈 사용 패턴을 검사합니다.
  • S310 (suspicious-url-open-usage): 이제 로컬 문자열 리터럴 바인딩을 해결해 false positive를 줄입니다.
  • S508S509: 이제 최신 PySNMP 버전의 권장 API를 지원합니다.
  • UP019 (typing-text-str-alias): 이제 typing_extensions.Text를 인식합니다.

커뮤니티 관점

릴리스에 대한 커뮤니티 피드백은 자동화 확대를 가치 있게 보는 사람들과 엄격한 린팅을 임의적이라고 느끼는 사람들 사이에 갈등이 있음을 강조합니다.

일부 사용자는 업데이트 후 즉시 코드 품질이 개선되었다고 보고했으며, 확장된 규칙 집합이 이전 버전에서 놓쳤던 문제들을 잡아준다고 언급했습니다. 반면 다른 사용자들은 이러한 도구가 "문법 나치"처럼 작동한다며, 과도한 포맷팅이 작성자의 의도를 가릴 수 있다고 우려했습니다.

업데이트가 운영에 미치는 영향에 대해, 몇몇 개발자는 CI 환경에서 버전 고정 없이 v0.16.0으로 업데이트하면 새로운 기본 규칙이 대거 추가되어 즉시 실패가 발생할 수 있다고 지적했습니다.

"잘 들어보면 최신 UV를 바로 가져와서 동시에 실패하는 수천 개의 CI 작업 소리를 들을 수 있습니다."

또한 일부 사용자는 stateVersion(Nix와 유사) 도입을 제안했으며, 이를 통해 팀이 도구 업데이트 시 자동으로 새로운 기본 규칙을 상속받는 대신 자체 속도에 맞춰 옵션을 선택할 수 있게 하고자 했습니다.


요약: Ruff v0.16.0은 기본 규칙 집합을 59개에서 413개로 크게 확장하고, Markdown 코드 블록 포맷팅 및 새로운 억제 주석 형식을 도입했습니다.

제목: Ruff v0.16.0 릴리스 노트 / 새로운 내용

Sources