[tool.black]
target-version = ["py38"]
exclude = 'generated'

[tool.isort]
# https://github.com/PyCQA/isort/wiki/isort-Settings
profile = "black"
# will group `import x` and `from x import` of the same module.
force_sort_within_sections = true
known_first_party = [
    "homeassistant",
    "tests",
]
forced_separate = [
    "tests",
]
combine_as_imports = true

[tool.pylint.MASTER]
py-version = "3.8"
ignore = [
    "tests",
]
# 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
init-hook='from pylint.config.find_default_config_files import find_default_config_files; from pathlib import Path; import sys; sys.path.append(str(Path(Path(list(find_default_config_files())[0]).parent, "pylint/plugins")))'
load-plugins = [
    "pylint.extensions.code_style",
    "pylint.extensions.typing",
    "pylint_strict_informational",
    "hass_constructor",
    "hass_imports",
    "hass_logger",
]
persistent = false
extension-pkg-allow-list = [
    "av.audio.stream",
    "av.stream",
    "ciso8601",
    "cv2",
]

[tool.pylint.BASIC]
class-const-naming-style = "any"
good-names = [
    "_",
    "ev",
    "ex",
    "fp",
    "i",
    "id",
    "j",
    "k",
    "Run",
    "T",
]

[tool.pylint."MESSAGES CONTROL"]
# Reasons disabled:
# format - handled by black
# 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
# consider-using-f-string - str.format sometimes more readable
# ---
# Enable once current issues are fixed:
# consider-using-namedtuple-or-dataclass (Pylint CodeStyle extension)
# consider-using-assignment-expr (Pylint CodeStyle extension)
disable = [
    "format",
    "abstract-class-little-used",
    "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-branches",
    "too-many-instance-attributes",
    "too-many-lines",
    "too-many-locals",
    "too-many-public-methods",
    "too-many-return-statements",
    "too-many-statements",
    "too-many-boolean-expressions",
    "unused-argument",
    "wrong-import-order",
    "consider-using-f-string",
    "consider-using-namedtuple-or-dataclass",
    "consider-using-assignment-expr",
]
enable = [
    #"useless-suppression",  # temporarily every now and then to clean them up
    "use-symbolic-message-instead",
]

[tool.pylint.REPORTS]
score = false

[tool.pylint.TYPECHECK]
ignored-classes = [
    "_CountingAttr",  # for attrs
]

[tool.pylint.FORMAT]
expected-line-ending-format = "LF"

[tool.pylint.EXCEPTIONS]
overgeneral-exceptions = [
    "BaseException",
    "Exception",
    "HomeAssistantError",
]

[tool.pylint.TYPING]
runtime-typing = false

[tool.pylint.CODE_STYLE]
max-line-length-suggestions = 72

[tool.pytest.ini_options]
testpaths = [
    "tests",
]
norecursedirs = [
    ".git",
    "testing_config",
]