# The contents of this file is based on https://github.com/home-assistant/core/blob/dev/pyproject.toml

[MAIN]
# Specify the Python version
py-version=3.12

# Use a conservative default here; 2 should speed up most setups and not hurt
# any too bad. Override on command line as appropriate.
jobs=2

load-plugins=
    pylint.extensions.code_style,
    pylint.extensions.typing

persistent = false
fail-on = [
    "I",
]

[BASIC]
class-const-naming-style = "any"

["MESSAGES CONTROL"]
# Reasons disabled:
# format - handled by ruff
# locally-disabled - it spams too much
# duplicate-code - unavoidable
# cyclic-import - doesn't test if both import on load
# abstract-class-little-used - prevents from setting right foundation
# unused-argument - generic callbacks and setup methods create a lot of warnings
# too-many-* - are not enforced for the sake of readability
# too-few-* - same as too-many-*
# abstract-method - with intro of async there are always methods missing
# inconsistent-return-statements - doesn't handle raise
# too-many-ancestors - it's too strict.
# wrong-import-order - isort guards this
# possibly-used-before-assignment - too many errors / not necessarily issues
# ---
# Pylint CodeStyle plugin
# consider-using-namedtuple-or-dataclass - too opinionated
# consider-using-assignment-expr - decision to use := better left to devs
disable = [
    "format",
    "abstract-method",
    "cyclic-import",
    "duplicate-code",
    "inconsistent-return-statements",
    "locally-disabled",
    "not-context-manager",
    "too-few-public-methods",
    "too-many-ancestors",
    "too-many-arguments",
    "too-many-instance-attributes",
    "too-many-lines",
    "too-many-locals",
    "too-many-public-methods",
    "too-many-boolean-expressions",
    "too-many-positional-arguments",
    "wrong-import-order",
    "consider-using-namedtuple-or-dataclass",
    "consider-using-assignment-expr",
    "possibly-used-before-assignment",

    # Handled by ruff
    # Ref: <https://github.com/astral-sh/ruff/issues/970>
    "await-outside-async", # PLE1142
    "bad-str-strip-call", # PLE1310
    "bad-string-format-type", # PLE1307
    "bidirectional-unicode", # PLE2502
    "continue-in-finally", # PLE0116
    "duplicate-bases", # PLE0241
    "misplaced-bare-raise", # PLE0704
    "format-needs-mapping", # F502
    "function-redefined", # F811
    # Needed because ruff does not understand type of __all__ generated by a function
    # "invalid-all-format", # PLE0605
    "invalid-all-object", # PLE0604
    "invalid-character-backspace", # PLE2510
    "invalid-character-esc", # PLE2513
    "invalid-character-nul", # PLE2514
    "invalid-character-sub", # PLE2512
    "invalid-character-zero-width-space", # PLE2515
    "logging-too-few-args", # PLE1206
    "logging-too-many-args", # PLE1205
    "missing-format-string-key", # F524
    "mixed-format-string", # F506
    "no-method-argument", # N805
    "no-self-argument", # N805
    "nonexistent-operator", # B002
    "nonlocal-without-binding", # PLE0117
    "not-in-loop", # F701, F702
    "notimplemented-raised", # F901
    "return-in-init", # PLE0101
    "return-outside-function", # F706
    "syntax-error", # E999
    "too-few-format-args", # F524
    "too-many-format-args", # F522
    "too-many-star-expressions", # F622
    "truncated-format-string", # F501
    "undefined-all-variable", # F822
    "undefined-variable", # F821
    "used-prior-global-declaration", # PLE0118
    "yield-inside-async-function", # PLE1700
    "yield-outside-function", # F704
    "anomalous-backslash-in-string", # W605
    "assert-on-string-literal", # PLW0129
    "assert-on-tuple", # F631
    "bad-format-string", # W1302, F
    "bad-format-string-key", # W1300, F
    "bare-except", # E722
    "binary-op-exception", # PLW0711
    "cell-var-from-loop", # B023
    # "dangerous-default-value", # B006, ruff catches new occurrences, needs more work
    "duplicate-except", # B014
    "duplicate-key", # F601
    "duplicate-string-formatting-argument", # F
    "duplicate-value", # F
    "eval-used", # S307
    "exec-used", # S102
    "expression-not-assigned", # B018
    "f-string-without-interpolation", # F541
    "forgotten-debug-statement", # T100
    "format-string-without-interpolation", # F
    # "global-statement", # PLW0603, ruff catches new occurrences, needs more work
    "global-variable-not-assigned", # PLW0602
    "implicit-str-concat", # ISC001
    "import-self", # PLW0406
    "inconsistent-quotes", # Q000
    "invalid-envvar-default", # PLW1508
    "keyword-arg-before-vararg", # B026
    "logging-format-interpolation", # G
    "logging-fstring-interpolation", # G
    "logging-not-lazy", # G
    "misplaced-future", # F404
    "named-expr-without-context", # PLW0131
    "nested-min-max", # PLW3301
    "pointless-statement", # B018
    "raise-missing-from", # B904
    "redefined-builtin", # A001
    "try-except-raise", # TRY302
    "unused-argument", # ARG001, we don't use it
    "unused-format-string-argument", #F507
    "unused-format-string-key", # F504
    "unused-import", # F401
    "unused-variable", # F841
    "useless-else-on-loop", # PLW0120
    "wildcard-import", # F403
    "bad-classmethod-argument", # N804
    "consider-iterating-dictionary", # SIM118
    "empty-docstring", # D419
    "invalid-name", # N815
    "line-too-long", # E501, disabled globally
    "missing-class-docstring", # D101
    "missing-final-newline", # W292
    "missing-function-docstring", # D103
    "missing-module-docstring", # D100
    "multiple-imports", #E401
    "singleton-comparison", # E711, E712
    "subprocess-run-check", # PLW1510
    "superfluous-parens", # UP034
    "ungrouped-imports", # I001
    "unidiomatic-typecheck", # E721
    "unnecessary-direct-lambda-call", # PLC3002
    "unnecessary-lambda-assignment", # PLC3001
    "unnecessary-pass", # PIE790
    "unneeded-not", # SIM208
    "useless-import-alias", # PLC0414
    "wrong-import-order", # I001
    "wrong-import-position", # E402
    "comparison-of-constants", # PLR0133
    "comparison-with-itself", # PLR0124
    "consider-alternative-union-syntax", # UP007
    "consider-merging-isinstance", # PLR1701
    "consider-using-alias", # UP006
    "consider-using-dict-comprehension", # C402
    "consider-using-generator", # C417
    "consider-using-get", # SIM401
    "consider-using-set-comprehension", # C401
    "consider-using-sys-exit", # PLR1722
    "consider-using-ternary", # SIM108
    "literal-comparison", # F632
    "property-with-parameters", # PLR0206
    "super-with-arguments", # UP008
    "too-many-branches", # PLR0912
    "too-many-return-statements", # PLR0911
    "too-many-statements", # PLR0915
    "trailing-comma-tuple", # COM818
    "unnecessary-comprehension", # C416
    "use-a-generator", # C417
    "use-dict-literal", # C406
    "use-list-literal", # C405
    "useless-object-inheritance", # UP004
    "useless-return", # PLR1711
    "no-else-break", # RET508
    "no-else-continue", # RET507
    "no-else-raise", # RET506
    "no-else-return", # RET505
    "broad-except", # BLE001
    "protected-access", # SLF001
    "broad-exception-raised", # TRY002
    "consider-using-f-string", # PLC0209
    # "no-self-use", # PLR6301  # Optional plugin, not enabled

    # Handled by mypy
    # Ref: <https://github.com/antonagestam/pylint-mypy-overlap>
    "abstract-class-instantiated",
    "arguments-differ",
    "assigning-non-slot",
    "assignment-from-no-return",
    "assignment-from-none",
    "bad-exception-cause",
    "bad-format-character",
    "bad-reversed-sequence",
    "bad-super-call",
    "bad-thread-instantiation",
    "catching-non-exception",
    "comparison-with-callable",
    "deprecated-class",
    "dict-iter-missing-items",
    "format-combined-specification",
    "global-variable-undefined",
    "import-error",
    "inconsistent-mro",
    "inherit-non-class",
    "init-is-generator",
    "invalid-class-object",
    "invalid-enum-extension",
    "invalid-envvar-value",
    "invalid-format-returned",
    "invalid-hash-returned",
    "invalid-metaclass",
    "invalid-overridden-method",
    "invalid-repr-returned",
    "invalid-sequence-index",
    "invalid-slice-index",
    "invalid-slots-object",
    "invalid-slots",
    "invalid-star-assignment-target",
    "invalid-str-returned",
    "invalid-unary-operand-type",
    "invalid-unicode-codec",
    "isinstance-second-argument-not-valid-type",
    "method-hidden",
    "misplaced-format-function",
    "missing-format-argument-key",
    "missing-format-attribute",
    "missing-kwoa",
    "no-member",
    "no-value-for-parameter",
    "non-iterator-returned",
    "non-str-assignment-to-dunder-name",
    "nonlocal-and-global",
    "not-a-mapping",
    "not-an-iterable",
    "not-async-context-manager",
    "not-callable",
    "not-context-manager",
    "overridden-final-method",
    "raising-bad-type",
    "raising-non-exception",
    "redundant-keyword-arg",
    "relative-beyond-top-level",
    "self-cls-assignment",
    "signature-differs",
    "star-needs-assignment-target",
    "subclassed-final-class",
    "super-without-brackets",
    "too-many-function-args",
    "typevar-double-variance",
    "typevar-name-mismatch",
    "unbalanced-dict-unpacking",
    "unbalanced-tuple-unpacking",
    "unexpected-keyword-arg",
    "unhashable-member",
    "unpacking-non-sequence",
    "unsubscriptable-object",
    "unsupported-assignment-operation",
    "unsupported-binary-operation",
    "unsupported-delete-operation",
    "unsupported-membership-test",
    "used-before-assignment",
    "using-final-decorator-in-unsupported-version",
    "wrong-exception-operation",
]
enable = [
    #"useless-suppression",  # temporarily every now and then to clean them up
    "use-symbolic-message-instead",
]
per-file-ignores = [
    # redefined-outer-name: Tests reference fixtures in the test function
    # use-implicit-booleaness-not-comparison: Tests need to validate that a list
    # or a dict is returned
    "/tests/:redefined-outer-name,use-implicit-booleaness-not-comparison",
]

[REPORTS]
score = false

[TYPECHECK]
ignored-classes = [
    "_CountingAttr",  # for attrs
]
mixin-class-rgx = ".*[Mm]ix[Ii]n"

[FORMAT]
expected-line-ending-format = "LF"

[EXCEPTIONS]
overgeneral-exceptions = [
    "builtins.BaseException",
    "builtins.Exception",
]

[TYPING]
runtime-typing = false

[CODE_STYLE]
max-line-length-suggestions = 72
