# PEP8 line length: 120 chars — the codebase uses longer identifiers and SQLAlchemy chaining line-length = 120 [lint] # PEP8 compliance rules enforced: # E/W — pycodestyle (core PEP8 style and warnings) # F — pyflakes (unused imports, undefined names) # I — isort (import ordering per PEP8 convention) # N — pep8-naming (class/function/variable naming conventions) # ANN — flake8-annotations (type hint enforcement) select = ["E", "W", "F", "I", "N", "ANN"] ignore = [ # SQLAlchemy filter syntax requires `== True` / `== False` comparisons "E712", # ANN101/ANN102 (self/cls type annotations) removed from ruff — not needed ] [lint.per-file-ignores] # Tests use broad exception catching and unusual import patterns "tests/**" = ["E", "F", "N"] # Data file: D3FEND technique descriptions contain URLs and long strings that cannot be meaningfully wrapped "app/services/d3fend_import_service.py" = ["E501"]