[build-system]
requires = ["setuptools~=62.3", "wheel~=0.37.1"]
build-backend = "setuptools.build_meta"

[project]
name        = "homeassistant"
version     = "2022.10.0.dev0"
license     = {text = "Apache-2.0"}
description = "Open-source home automation platform running on Python 3."
readme      = "README.rst"
authors     = [
    {name = "The Home Assistant Authors", email = "hello@home-assistant.io"}
]
keywords    = ["home", "automation"]
classifiers = [
    "Development Status :: 5 - Production/Stable",
    "Intended Audience :: End Users/Desktop",
    "Intended Audience :: Developers",
    "License :: OSI Approved :: Apache Software License",
    "Operating System :: OS Independent",
    "Programming Language :: Python :: 3.9",
    "Programming Language :: Python :: 3.10",
    "Topic :: Home Automation",
]
requires-python = ">=3.9.0"
dependencies    = [
    "aiohttp==3.8.1",
    "astral==2.2",
    "async_timeout==4.0.2",
    "attrs==21.2.0",
    "atomicwrites-homeassistant==1.4.1",
    "awesomeversion==22.8.0",
    "bcrypt==3.1.7",
    "certifi>=2021.5.30",
    "ciso8601==2.2.0",
    # When bumping httpx, please check the version pins of
    # httpcore, anyio, and h11 in gen_requirements_all
    "httpx==0.23.0",
    "home-assistant-bluetooth==1.3.0",
    "ifaddr==0.1.7",
    "jinja2==3.1.2",
    "lru-dict==1.1.8",
    "PyJWT==2.4.0",
    # PyJWT has loose dependency. We want the latest one.
    "cryptography==37.0.4",
    "orjson==3.7.11",
    "pip>=21.0,<22.3",
    "python-slugify==4.0.1",
    "pyyaml==6.0",
    "requests==2.28.1",
    "typing-extensions>=3.10.0.2,<5.0",
    "voluptuous==0.13.1",
    "voluptuous-serialize==2.5.0",
    "yarl==1.7.2",
]

[project.urls]
"Source Code" = "https://github.com/home-assistant/core"
"Bug Reports" = "https://github.com/home-assistant/core/issues"
"Docs: Dev"   = "https://developers.home-assistant.io/"
"Discord"     = "https://www.home-assistant.io/join-chat/"
"Forum"       = "https://community.home-assistant.io/"

[project.scripts]
hass = "homeassistant.__main__:main"

[tool.setuptools]
platforms = ["any"]
zip-safe  = false
include-package-data = true

[tool.setuptools.packages.find]
include = ["homeassistant*"]

[tool.black]
target-version = ["py39", "py310"]
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.MAIN]
py-version = "3.9"
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 pathlib import Path; \
    import sys; \

    from pylint.config import find_default_config_files; \

    sys.path.append( \
        str(Path(next(find_default_config_files())).parent.joinpath('pylint/plugins'))
    ) \
    """
load-plugins = [
    "pylint.extensions.code_style",
    "pylint.extensions.typing",
    "hass_constructor",
    "hass_enforce_type_hints",
    "hass_imports",
    "hass_logger",
]
persistent = false
extension-pkg-allow-list = [
    "av.audio.stream",
    "av.stream",
    "ciso8601",
    "orjson",
    "cv2",
]
fail-on = [
    "I",
]

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

[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-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
]
mixin-class-rgx = ".*[Mm]ix[Ii]n"

[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",
]
log_format = "%(asctime)s.%(msecs)03d %(levelname)-8s %(threadName)s %(name)s:%(filename)s:%(lineno)s %(message)s"
log_date_format = "%Y-%m-%d %H:%M:%S"