# Ruff configuration file adapted from astropy extend = "pyproject.toml" lint.ignore = [ # NOTE: to find a good code to fix, run: # ruff --select="ALL" --statistics astropy/<subpackage> # flake8-annotations (ANN) : static typing "ANN001", # Function argument without type annotation "ANN003", # `**kwargs` without type annotation "ANN201", # Public function without return type annotation "ANN202", # Private function without return type annotation "ANN401", # Use of `Any` type # flake8-unused-arguments (ARG) "ARG001", # unused-function-argument "ARG002", # unused-method-argument "ARG003", # unused-class-method-argument "ARG004", # unused-static-method-argument "ARG005", # unused-lambda-argument # flake8-bugbear (B) "B006", # MutableArgumentDefault "B007", # UnusedLoopControlVariable "B023", # FunctionUsesLoopVariable "B028", # No-explicit-stacklevel "B904", # RaiseWithoutFromInsideExcept "B905", # ZipWithoutExplicitStrict # requires 3.10+ # flake8-blind-except (BLE) "BLE001", # blind-except # mccabe (C90) : code complexity # TODO: configure maximum allowed complexity. "C901", # McCabeComplexity # pydocstyle (D) # Missing Docstrings "D100", # undocumented-public-module "D101", # undocumented-public-class "D103", # undocumented-public-function "D104", # undocumented-public-package "D205", # blank-line-after-summary # Quotes Issues "D300", # triple-single-quotes "D301", # escape-sequence-in-docstring # Docstring Content Issues "D403", # first-line-capitalized "D404", # docstring-starts-with-this "D401", # non-imperative-mood. "D414", # empty-docstring-section "D419", # docstring is empty # flake8-datetimez (DTZ) "DTZ001", # call-datetime-without-tzinfo "DTZ005", # call-datetime-now-without-tzinfo # pycodestyle (E, W) "E501", # line-too-long "E721", # type-comparison "E731", # lambda-assignment # flake8-errmsg (EM) : nicer error tracebacks "EM101", # raw-string-in-exception "EM102", # f-string-in-exception "EM103", # dot-format-in-exception # eradicate (ERA) # NOTE: be careful that developer notes are kept. "ERA001", # commented-out-code # flake8-executable (EXE) "EXE002", # shebang-missing-executable-file # Pyflakes (F) "F841", # unused-variable # flake8-boolean-trap (FBT) : boolean flags should be kwargs, not args # NOTE: a good thing to fix, but changes API. "FBT001", # boolean-positional-arg-in-function-definition "FBT002", # boolean-default-value-in-function-definition "FBT003", # boolean-positional-value-in-function-call # flake8-fixme (FIX) "FIX001", # Line contains FIXME. this should be fixed or at least FIXME replaced with TODO "FIX004", # Line contains HACK. replace HACK with NOTE. # pep8-naming (N) # NOTE: some of these can/should be fixed, but this changes the API. "N801", # invalid-class-name "N802", # invalid-function-name "N803", # invalid-argument-name "N804", # invalid-first-argument-name-for-class-method "N805", # invalid-first-argument-name-for-method "N807", # dunder-function-name "N813", # camelcase-imported-as-lowercase "N815", # mixed-case-variable-in-class-scope "N816", # mixed-case-variable-in-global-scope "N818", # error-suffix-on-exception-name # NumPy-specific rules (NPY) "NPY002", # Replace legacy `np.random.rand` call with `np.random.Generator` (2023-05-03) # Perflint (PERF) "PERF203", # `try`-`except` within a loop incurs performance overhead "PERF401", # Use a list comprehension to create a transformed list # Pylint (PLC, PLE, PLR, PLW) "PLE0101", # return-in-init "PLR0124", # Name compared with itself "PLR0402", # ConsiderUsingFromImport "PLR0912", # too-many-branches "PLR0913", # too-many-args "PLR0915", # too-many-statements "PLR1714", # Consider merging multiple comparisons "PLR2004", # MagicValueComparison "PLR5501", # collapsible-else-if "PLW0603", # global-statement "PLW2901", # redefined-loop-name # flake8-pytest-style (PT) "PT001", # pytest-fixture-incorrect-parentheses-style "PT003", # pytest-extraneous-scope-function "PT004", # pytest-missing-fixture-name-underscore "PT006", # pytest-parametrize-names-wrong-type "PT007", # pytest-parametrize-values-wrong-type "PT011", # pytest-raises-too-broad "PT012", # pytest-raises-with-multiple-statements "PT017", # pytest-assert-in-exceptinstead "PT018", # pytest-composite-assertion "PT022", # pytest-useless-yield-fixture "PT023", # pytest-incorrect-mark-parentheses-style # flake8-use-pathlib (PTH) "PTH100", # os-path-abspath "PTH101", # os-chmod "PTH102", # os-mkdir "PTH103", # os-makedirs "PTH104", # os-rename "PTH107", # os-remove "PTH108", # os-unlink "PTH109", # os-getcwd "PTH110", # os-path-exists "PTH111", # os-path-expanduser "PTH112", # os-path-isdir "PTH113", # os-path-isfile "PTH118", # os-path-join "PTH119", # os-path-basename "PTH120", # os-path-dirname "PTH122", # os-path-splitext "PTH123", # builtin-open "PTH202", # `os.path.getsize` should be replaced by `Path.stat().st_size` "PTH207", # Replace `glob` with `Path.glob` or `Path.rglob` # flake8-return (RET) "RET501", # unnecessary-return-none "RET502", # implicit-return-value "RET503", # implicit-return "RET504", # unnecessary-assign "RET507", # superfluous-else-continue # flake8-raise (RSE) "RSE102", # unnecessary-paren-on-raise-exception # Ruff-specific rules (RUF) "RUF001", # ambiguous-unicode-character-string "RUF002", # ambiguous-unicode-character-docstring "RUF010", # use conversion in f-string "RUF012", # Mutable class attributes should be annotated with `typing.ClassVar` # flake8-bandit (S) "S101", # Use of `assert` detected "S105", # hardcoded-password-string "S110", # try-except-pass "S112", # try-except-continue "S301", # suspicious-pickle-usage "S307", # Use of possibly insecure function; consider using `ast.literal_eval` "S311", # suspicious-non-cryptographic-randomness "S324", # hashlib-insecure-hash-function "S506", # UnsafeYAMLLoad "S310", # Suspicious-url-open-usage "S603", # `subprocess` call: check for execution of untrusted input "S607", # Starting a process with a partial executable path # flake8-simplify (SIM) "SIM102", # NestedIfStatements "SIM105", # UseContextlibSuppress "SIM108", # UseTernaryOperator "SIM114", # if-with-same-arms "SIM115", # OpenFileWithContextHandler "SIM117", # MultipleWithStatements "SIM118", # KeyInDict "SIM201", # NegateEqualOp "SIM300", # yoda condition # flake8-print (T20) "T201", # PrintUsed # flake8-todos (TD) "TD001", # Invalid TODO tag "TD003", # Missing issue link on the line following this TODO "TD004", # Missing colon in TODO "TD007", # Missing space after colon in TODO # tryceratops (TRY) "TRY002", # raise-vanilla-class "TRY003", # raise-vanilla-args "TRY004", # prefer-type-error "TRY201", # verbose-raise "TRY301", # raise-within-try # flake8-quotes (Q) "Q000", # use double quotes ] lint.unfixable = [ "E711" # NoneComparison. Hard to fix b/c numpy has it's own None. ] [lint.extend-per-file-ignores] "docs/*" = []