diff --git a/pyproject.toml b/pyproject.toml index c2a4c4d0..113fdd13 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -107,6 +107,150 @@ exclude = ["__init__.py"] # TODO: Remove after this is fixed: https://github.co target-version = "py310" line-length = 100 + +[tool.ruff.lint] +select = [ + # For rules reference, see https://docs.astral.sh/ruff/rules/ + "A", # flake8-builtins + "ANN", # flake8-annotations + "ARG", # flake8-unused-arguments + "ASYNC", # flake8-async + "B", # flake8-bugbear + "FBT", # flake8-boolean-trap + "BLE", # Blind except + "C4", # flake8-comprehensions + "C90", # mccabe (complexity) + "COM", # flake8-commas + "CPY", # missing copyright notice + "D", # pydocstyle (Docstring conventions) + "DTZ", # flake8-datetimez + "E", # pycodestyle (errors) + "ERA", # flake8-eradicate (commented out code) + "EXE", # flake8-executable + "F", # Pyflakes + "FA", # flake8-future-annotations + "FIX", # flake8-fixme + "FLY", # flynt + "FURB", # Refurb + "I", # isort + "ICN", # flake8-import-conventions + "INP", # flake8-no-pep420 + "INT", # flake8-gettext + "ISC", # flake8-implicit-str-concat + "ICN", # flake8-import-conventions + "LOG", # flake8-logging + "N", # pep8-naming + "PD", # pandas-vet + "PERF", # Perflint + "PIE", # flake8-pie + "PGH", # pygrep-hooks + "PL", # Pylint + "PT", # flake8-pytest-style + "PTH", # flake8-use-pathlib + "PYI", # flake8-pyi + "Q", # flake8-quotes + "RET", # flake8-return + "RSE", # flake8-raise + "RUF", # Ruff-specific rules + "SIM", # flake8-simplify + "SLF", # flake8-self + "SLOT", # flake8-slots + "T10", # debugger calls + # "T20", # flake8-print # TODO: Re-enable once we have logging + "TCH", # flake8-type-checking + "TD", # flake8-todos + "TID", # flake8-tidy-imports + "TRY", # tryceratops + "TRY002", # Disallow raising vanilla Exception. Create or use a custom exception instead. + "TRY003", # Disallow vanilla string passing. Prefer kwargs to the exception constructur. + "UP", # pyupgrade + "W", # pycodestyle (warnings) + "YTT", # flake8-2020 +] +ignore = [ + # For rules reference, see https://docs.astral.sh/ruff/rules/ + + # These we don't agree with or don't want to prioritize to enforce: + "ANN003", # kwargs missing type annotations + "ANN101", # Type annotations for 'self' args + "ANN102", # Type annotations for 'cls' args + "COM812", # Because it conflicts with ruff auto-format + "EM", # flake8-errmsgs (may reconsider later) + "DJ", # Django linting + "G", # flake8-logging-format + "ISC001", # Conflicts with ruff auto-format + "NPY", # NumPy-specific rules + "PIE790", # Allow unnecssary 'pass' (sometimes useful for readability) + "PERF203", # exception handling in loop + "PLR6301", # Allow class methods that don't use 'self' (otherwise noisy) + "RUF022", # Allow unsorted __all__ (sometimes useful for grouping by type with pdoc) + "S", # flake8-bandit (noisy, security related) + "SIM910", # Allow "None" as second argument to Dict.get(). "Explicit is better than implicit." + "TD002", # Require author for TODOs + "ASYNC1", # flake8-trio (opinionated, noisy) + "INP001", # Dir 'examples' is part of an implicit namespace package. Add an __init__.py. + + # TODO: Consider re-enabling these before release: + "A003", # Class attribute 'type' is shadowing a Python builtin + "BLE001", # Do not catch blind exception: Exception + "ERA001", # Remove commented-out code + "FIX002", # Allow "TODO:" until release (then switch to requiring links via TDO003) + "PLW0603", # Using the global statement to update _cache is discouraged + "PLW0108", # Lambda may be unnecessary; consider inlining inner function + # "TD003", # Require links for TODOs (now enabled) +] +fixable = ["ALL"] +unfixable = [ + "ERA001", # Commented-out code (avoid silent loss of code) + "T201", # print() calls (avoid silent loss of code / log messages) +] +dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" + +[tool.ruff.lint.pylint] +max-args = 8 # Relaxed from default of 5 +max-branches = 15 # Relaxed from default of 12 + + +[tool.ruff.lint.isort] +force-sort-within-sections = false +lines-after-imports = 2 +known-first-party = [ + "airbyte_cdk", + "airbyte_protocol", + "airbyte_protocol_dataclasses", +] +known-local-folder = ["airbyte"] +required-imports = ["from __future__ import annotations"] +known-third-party = [] +section-order = [ + "future", + "standard-library", + "third-party", + "first-party", + "local-folder", +] + +[tool.ruff.lint.mccabe] +max-complexity = 24 + +[tool.ruff.lint.pycodestyle] +ignore-overlong-task-comments = true + +[tool.ruff.lint.pydocstyle] +convention = "google" + +[tool.ruff.lint.flake8-annotations] +allow-star-arg-any = false +ignore-fully-untyped = false + +[tool.ruff.format] +quote-style = "double" +indent-style = "space" +skip-magic-trailing-comma = false +line-ending = "auto" +preview = false +docstring-code-format = true + [tool.poe.tasks] # Build tasks assemble = {cmd = "bin/generate-component-manifest-dagger.sh", help = "Generate component manifest files."}