# Source: https://github.com/Jc2k/aiohomekit/blob/master/pyproject.toml

```toml
[project]
name = "aiohomekit"
version = "3.2.20"
description = "An asyncio HomeKit client"
authors = [{ name = "John Carr", email = "john.carr@unrouted.co.uk" }]
license = "Apache-2.0"
readme = "README.md"
requires-python = ">=3.10"
keywords = ["HomeKit", "home", "automation"]
dynamic = ["classifiers", "dependencies"]

[project.urls]
"Homepage" = "https://github.com/Jc2k/aiohomekit"
"Repository" = "https://github.com/Jc2k/aiohomekit"

[tool.poetry]
classifiers = [
    "Topic :: Home Automation",
    "Intended Audience :: Developers",
    "Intended Audience :: End Users/Desktop",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11"
]
include = ["aiohomekit/py.typed"]

[tool.poetry.dependencies]
python = "^3.10,<3.14"
cryptography = ">=2.9.2"
zeroconf = ">=0.132.2"
commentjson = "^0.9.0"
aiocoap = ">=0.4.5"
bleak = ">=0.22.0"
chacha20poly1305-reuseable = ">=0.12.1"
bleak-retry-connector = ">=2.9.0"
orjson = ">=3.7.8"
async-timeout = {version = ">=4.0.2", python = "<3.11"}
chacha20poly1305 = "^0.0.3"
async-interrupt = ">=1.1.1"
aiohappyeyeballs = ">=2.3.0"

[tool.poetry.group.dev.dependencies]
mypy = "^1.18"
flake8 = ">=4.0.1,<8.0.0"
pytest = ">=7.2,<9.0"
coverage = ">=6.3,<8.0"
pylint = ">=2.12.2,<4.0.0"
pytest-aiohttp = "^1.0.3"
pyupgrade = ">=2.31,<4.0"
pytest-cov = ">=5,<8"
asynctest = "^0.13.0"
aiohttp = ">=3.8.3"
ruff = "^0.14.2"

[tool.poetry.scripts]
aiohomekitctl = "aiohomekit.__main__:sync_main"

[tool.pytest.ini_options]
minversion = "6.0"
asyncio_mode = "auto"

[tool.coverage.run]
omit = ["tests/*"]

[tool.isort]
profile = "black"
indent = "    "
force_sort_within_sections = "true"
sections = "FUTURE,STDLIB,THIRDPARTY,FIRSTPARTY,LOCALFOLDER"
known_first_party = "aiohomekit,tests"
forced_separate = "tests"
combine_as_imports = "true"
extra_standard_library = "_socket"

[build-system]
requires = ["poetry_core>=2.1.0"]
build-backend = "poetry.core.masonry.api"

[tool.ruff]
line-length = 110

[tool.ruff.lint]
ignore = [
    "S101", # use of assert
    "S104",  # S104 Possible binding to all interfaces
    "PLR0912", # too many to fix right now
    "TID252", # skip
    "PLR0913", # too late to make changes here
    "PLR0911", # would be breaking change
    "TRY003", # too many to fix
    "SLF001", # design choice
    "PLR2004" , # too many to fix
    "PGH004",  # too many to fix
    "PGH003", # too many to fix
    "SIM110", # this is slower
    "PYI034", # enable when we drop Py3.10
    "PYI032", # breaks Cython
    "PYI041",  # breaks Cython
    "PERF401", # Cython: closures inside cpdef functions not yet supported
]
select = [
    "ASYNC", # async rules
    "B",   # flake8-bugbear
    "C4",  # flake8-comprehensions
    "S",   # flake8-bandit
    "F",   # pyflake
    "E",   # pycodestyle
    "W",   # pycodestyle
    "UP",  # pyupgrade
    "I",   # isort
    "RUF", # ruff specific
    "FLY", # flynt
    "G", # flake8-logging-format   ,
    "PERF", # Perflint
    "PGH", # pygrep-hooks
    "PIE", # flake8-pie
    "PL", # pylint
    "PT", # flake8-pytest-style
    "PTH", # flake8-pathlib
    "PYI", # flake8-pyi
    "RET", # flake8-return
    "RSE", # flake8-raise    ,
    "SIM", # flake8-simplify
    "SLF", # flake8-self
    "SLOT", # flake8-slots
    "T100", # Trace found: {name} used
    "T20", # flake8-print
    "TID", # Tidy imports
    "TRY", # tryceratops
]

[tool.ruff.lint.per-file-ignores]
"tests/**/*" = [
    "D100",
    "D101",
    "D102",
    "D103",
    "D104",
    "S101",
    "SLF001",
    "PLR2004", # too many to fix right now
    "PT011", # too many to fix right now
    "PT006", # too many to fix right now
    "PGH003", # too many to fix right now
    "PT007", # too many to fix right now
    "PT027",  # too many to fix right now
    "PLW0603" , # too many to fix right now
    "PLR0915", # too many to fix right now
    "FLY002", # too many to fix right now
    "PT018", # too many to fix right now
    "PLR0124", # too many to fix right now
    "SIM202" , # too many to fix right now
    "PT012" , # too many to fix right now
    "TID252", # too many to fix right now
    "PLR0913", # skip this one
    "SIM102" , # too many to fix right now
    "SIM108", # too many to fix right now
    "T201", # too many to fix right now
    "PT004", # nice to have
]
"bench/**/*" = [
    "T201", # intended
]
"examples/**/*" = [
    "T201", # intended
]
"setup.py" = ["D100"]
"conftest.py" = ["D100"]
"docs/conf.py" = ["D100"]

```