content: [tool.coverage.run]
  omit = ["tests/*"]
  
  [tool.pytest.ini_options]
  asyncio_mode = "auto"
  asyncio_default_fixture_loop_scope = "function"
  testpaths = ["unit_tests", "e2e_tests"]
  python_files = ["test_*.py"]
  addopts = "-v --cov=custom_components.custom_conversation --cov-report=term-missing --tb=short"
  timeout = 45
  log_format = "%(asctime)s.%(msecs)03d %(levelname)-8s %(threadName)s %(name)s:%(filename)s:%(lineno)s %(message)s"
  
  [tool.pylint.MAIN]
  py-version = "3.12"
  load-plugins = [
      "pylint.extensions.code_style",
      "pylint.extensions.typing",
      "hass_decorator",
      "hass_enforce_class_module",
      "hass_enforce_sorted_platforms",
      "hass_enforce_super_call",
      "hass_enforce_type_hints",
      "hass_inheritance",
      "hass_imports",
      "hass_logger",
      "pylint_per_file_ignores",
  ]
  persistent = false
  
  [tool.pylint.BASIC]
  class-const-naming-style = "any"
  
  [tool.pylint."MESSAGES CONTROL"]
  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",
  ]
  
  [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 = [
      "builtins.BaseException",
      "builtins.Exception",
      # "homeassistant.exceptions.HomeAssistantError",  # too many issues
  ]
  
  [tool.pylint.TYPING]
  runtime-typing = false
  
  [tool.pylint.CODE_STYLE]
  max-line-length-suggestions = 72
  
  [tool.ruff]
  required-version = ">=0.9.1"
  
  [tool.ruff.lint]
  select = [
      "A001", # Variable {name} is shadowing a Python builtin
      "ASYNC210", # Async functions should not call blocking HTTP methods
      "ASYNC220", # Async functions should not create subprocesses with blocking methods
      "ASYNC221", # Async functions should not run processes with blocking methods
      "ASYNC222", # Async functions should not wait on processes with blocking methods
      "ASYNC230", # Async functions should not open files with blocking methods like open
      "ASYNC251", # Async functions should not call time.sleep
      "B002", # Python does not support the unary prefix increment
      "B005", # Using .strip() with multi-character strings is misleading
      "B007", # Loop control variable {name} not used within loop body
      "B014", # Exception handler with duplicate exception
      "B015", # Pointless comparison. Did you mean to assign a value? Otherwise, prepend assert or remove it.
      "B017", # pytest.raises(BaseException) should be considered evil
      "B018", # Found useless attribute access. Either assign it to a variable or remove it.
      "B023", # Function definition does not bind loop variable {name}
      "B024", # `{name}` is an abstract base class, but it has no abstract methods or properties
      "B026", # Star-arg unpacking after a keyword argument is strongly discouraged
      "B032", # Possible unintentional type annotation (using :). Did you mean to assign (using =)?
      "B035", # Dictionary comprehension uses static key
      "B904", # Use raise from to specify exception cause
      "B905", # zip() without an explicit strict= parameter
      "BLE",
      "C", # complexity
      "COM818", # Trailing comma on bare tuple prohibited
      "D", # docstrings
      "DTZ003", # Use datetime.now(tz=) instead of datetime.utcnow()
      "DTZ004", # Use datetime.fromtimestamp(ts, tz=) instead of datetime.utcfromtimestamp(ts)
      "E", # pycodestyle
      "F", # pyflakes/autoflake
      "F541", # f-string without any placeholders
      "FLY", # flynt
      "FURB", # refurb
      "G", # flake8-logging-format
      "I", # isort
      "INP", # flake8-no-pep420
      "ISC", # flake8-implicit-str-concat
      "ICN001", # import concentions; {name} should be imported as {asname}
      "LOG", # flake8-logging
      "N804", # First argument of a class method should be named cls
      "N805", # First argument of a method should be named self
      "N815", # Variable {name} in class scope should not be mixedCase
      "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
      "RUF005", # Consider iterable unpacking instead of concatenation
      "RUF006", # Store a reference to the return value of asyncio.create_task
      "RUF007", # Prefer itertools.pairwise() over zip() when iterating over successive pairs
      "RUF008", # Do not use mutable default values for dataclass attributes
      "RUF010", # Use explicit conversion flag
      "RUF013", # PEP 484 prohibits implicit Optional
      "RUF016", # Slice in indexed access to type {value_type} uses type {index_type} instead of an integer
      "RUF017", # Avoid quadratic list summation
      "RUF018", # Avoid assignment expressions in assert statements
      "RUF019", # Unnecessary key check before dictionary access
      "RUF020", # {never_like} | T is equivalent to T
      "RUF021", # Parenthesize a and b expressions when chaining and and or together, to make the precedence clear
      "RUF022", # Sort __all__
      "RUF023", # Sort __slots__
      "RUF024", # Do not pass mutable objects as values to dict.fromkeys
      "RUF026", # default_factory is a positional-only argument to defaultdict
      "RUF030", # print() call in assert statement is likely unintentional
      "RUF032", # Decimal() called with float literal argument
      "RUF033", # __post_init__ method with argument defaults
      "RUF034", # Useless if-else condition
      "RUF100", # Unused `noqa` directive
      "RUF101", # noqa directives that use redirected rule codes
      "RUF200", # Failed to parse pyproject.toml: {message}
      "S102", # Use of exec detected
      "S103", # bad-file-permissions
      "S108", # hardcoded-temp-file
      "S306", # suspicious-mktemp-usage
      "S307", # suspicious-eval-usage
      "S313", # suspicious-xmlc-element-tree-usage
      "S314", # suspicious-xml-element-tree-usage
      "S315", # suspicious-xml-expat-reader-usage
      "S316", # suspicious-xml-expat-builder-usage
      "S317", # suspicious-xml-sax-usage
      "S318", # suspicious-xml-mini-dom-usage
      "S319", # suspicious-xml-pull-dom-usage
      "S320", # suspicious-xmle-tree-usage
      "S601", # paramiko-call
      "S602", # subprocess-popen-with-shell-equals-true
      "S604", # call-with-shell-equals-true
      "S608", # hardcoded-sql-expression
      "S609", # unix-command-wildcard-injection
      "SIM", # flake8-simplify
      "SLF", # flake8-self
      "SLOT", # flake8-slots
      "T100", # Trace found: {name} used
      "T20", # flake8-print
      "TC", # flake8-type-checking
      "TID", # Tidy imports
      "TRY", # tryceratops
      "UP", # pyupgrade
      "UP031", # Use format specifiers instead of percent format
      "UP032", # Use f-string instead of `format` call
      "W", # pycodestyle
  ]
  
  ignore = [
      "D202", # No blank lines allowed after function docstring
      "D203", # 1 blank line required before class docstring
      "D213", # Multi-line docstring summary should start at the second line
      "D406", # Section name should end with a newline
      "D407", # Section name underlining
      "E501", # line too long
  
      "PLC1901", # {existing} can be simplified to {replacement} as an empty string is falsey; too many false positives
      "PLR0911", # Too many return statements ({returns} > {max_returns})
      "PLR0912", # Too many branches ({branches} > {max_branches})
      "PLR0913", # Too many arguments to function call ({c_args} > {max_args})
      "PLR0915", # Too many statements ({statements} > {max_statements})
      "PLR2004", # Magic value used in comparison, consider replacing {value} with a constant variable
      "PLW2901", # Outer {outer_kind} variable {name} overwritten by inner {inner_kind} target
      "PT011", # pytest.raises({exception}) is too broad, set the `match` parameter or use a more specific exception
      "PT018", # Assertion should be broken down into multiple parts
      "RUF001", # String contains ambiguous unicode character.
      "RUF002", # Docstring contains ambiguous unicode character.
      "RUF003", # Comment contains ambiguous unicode character.
      "RUF015", # Prefer next(...) over single element slice
      "SIM102", # Use a single if statement instead of nested if statements
      "SIM103", # Return the condition {condition} directly
      "SIM108", # Use ternary operator {contents} instead of if-else-block
      "SIM115", # Use context handler for opening files
  
      # Moving imports into type-checking blocks can mess with pytest.patch()
      "TC001", # Move application import {} into a type-checking block
      "TC002", # Move third-party import {} into a type-checking block
      "TC003", # Move standard library import {} into a type-checking block
  
      "TRY003", # Avoid specifying long messages outside the exception class
      "TRY400", # Use `logging.exception` instead of `logging.error`
      # Ignored due to performance: https://github.com/charliermarsh/ruff/issues/2923
      "UP038", # Use `X | Y` in `isinstance` call instead of `(X, Y)`
  
      # May conflict with the formatter, https://docs.astral.sh/ruff/formatter/#conflicting-lint-rules
      "W191",
      "E111",
      "E114",
      "E117",
      "D206",
      "D300",
      "Q",
      "COM812",
      "COM819",
  
      # Disabled because ruff does not understand type of __all__ generated by a function
      "PLE0605"
  ]
  
  [tool.ruff.lint.flake8-import-conventions.extend-aliases]
  voluptuous = "vol"
  "homeassistant.components.air_quality.PLATFORM_SCHEMA" = "AIR_QUALITY_PLATFORM_SCHEMA"
  "homeassistant.components.alarm_control_panel.PLATFORM_SCHEMA" = "ALARM_CONTROL_PANEL_PLATFORM_SCHEMA"
  "homeassistant.components.binary_sensor.PLATFORM_SCHEMA" = "BINARY_SENSOR_PLATFORM_SCHEMA"
  "homeassistant.components.button.PLATFORM_SCHEMA" = "BUTTON_PLATFORM_SCHEMA"
  "homeassistant.components.calendar.PLATFORM_SCHEMA" = "CALENDAR_PLATFORM_SCHEMA"
  "homeassistant.components.camera.PLATFORM_SCHEMA" = "CAMERA_PLATFORM_SCHEMA"
  "homeassistant.components.climate.PLATFORM_SCHEMA" = "CLIMATE_PLATFORM_SCHEMA"
  "homeassistant.components.conversation.PLATFORM_SCHEMA" = "CONVERSATION_PLATFORM_SCHEMA"
  "homeassistant.components.cover.PLATFORM_SCHEMA" = "COVER_PLATFORM_SCHEMA"
  "homeassistant.components.date.PLATFORM_SCHEMA" = "DATE_PLATFORM_SCHEMA"
  "homeassistant.components.datetime.PLATFORM_SCHEMA" = "DATETIME_PLATFORM_SCHEMA"
  "homeassistant.components.device_tracker.PLATFORM_SCHEMA" = "DEVICE_TRACKER_PLATFORM_SCHEMA"
  "homeassistant.components.event.PLATFORM_SCHEMA" = "EVENT_PLATFORM_SCHEMA"
  "homeassistant.components.fan.PLATFORM_SCHEMA" = "FAN_PLATFORM_SCHEMA"
  "homeassistant.components.geo_location.PLATFORM_SCHEMA" = "GEO_LOCATION_PLATFORM_SCHEMA"
  "homeassistant.components.humidifier.PLATFORM_SCHEMA" = "HUMIDIFIER_PLATFORM_SCHEMA"
  "homeassistant.components.image.PLATFORM_SCHEMA" = "IMAGE_PLATFORM_SCHEMA"
  "homeassistant.components.image_processing.PLATFORM_SCHEMA" = "IMAGE_PROCESSING_PLATFORM_SCHEMA"
  "homeassistant.components.lawn_mower.PLATFORM_SCHEMA" = "LAWN_MOWER_PLATFORM_SCHEMA"
  "homeassistant.components.light.PLATFORM_SCHEMA" = "LIGHT_PLATFORM_SCHEMA"
  "homeassistant.components.lock.PLATFORM_SCHEMA" = "LOCK_PLATFORM_SCHEMA"
  "homeassistant.components.media_player.PLATFORM_SCHEMA" = "MEDIA_PLAYER_PLATFORM_SCHEMA"
  "homeassistant.components.notify.PLATFORM_SCHEMA" = "NOTIFY_PLATFORM_SCHEMA"
  "homeassistant.components.number.PLATFORM_SCHEMA" = "NUMBER_PLATFORM_SCHEMA"
  "homeassistant.components.remote.PLATFORM_SCHEMA" = "REMOTE_PLATFORM_SCHEMA"
  "homeassistant.components.scene.PLATFORM_SCHEMA" = "SCENE_PLATFORM_SCHEMA"
  "homeassistant.components.select.PLATFORM_SCHEMA" = "SELECT_PLATFORM_SCHEMA"
  "homeassistant.components.sensor.PLATFORM_SCHEMA" = "SENSOR_PLATFORM_SCHEMA"
  "homeassistant.components.siren.PLATFORM_SCHEMA" = "SIREN_PLATFORM_SCHEMA"
  "homeassistant.components.stt.PLATFORM_SCHEMA" = "STT_PLATFORM_SCHEMA"
  "homeassistant.components.switch.PLATFORM_SCHEMA" = "SWITCH_PLATFORM_SCHEMA"
  "homeassistant.components.text.PLATFORM_SCHEMA" = "TEXT_PLATFORM_SCHEMA"
  "homeassistant.components.time.PLATFORM_SCHEMA" = "TIME_PLATFORM_SCHEMA"
  "homeassistant.components.todo.PLATFORM_SCHEMA" = "TODO_PLATFORM_SCHEMA"
  "homeassistant.components.tts.PLATFORM_SCHEMA" = "TTS_PLATFORM_SCHEMA"
  "homeassistant.components.vacuum.PLATFORM_SCHEMA" = "VACUUM_PLATFORM_SCHEMA"
  "homeassistant.components.valve.PLATFORM_SCHEMA" = "VALVE_PLATFORM_SCHEMA"
  "homeassistant.components.update.PLATFORM_SCHEMA" = "UPDATE_PLATFORM_SCHEMA"
  "homeassistant.components.wake_word.PLATFORM_SCHEMA" = "WAKE_WORD_PLATFORM_SCHEMA"
  "homeassistant.components.water_heater.PLATFORM_SCHEMA" = "WATER_HEATER_PLATFORM_SCHEMA"
  "homeassistant.components.weather.PLATFORM_SCHEMA" = "WEATHER_PLATFORM_SCHEMA"
  "homeassistant.core.DOMAIN" = "HOMEASSISTANT_DOMAIN"
  "homeassistant.helpers.area_registry" = "ar"
  "homeassistant.helpers.category_registry" = "cr"
  "homeassistant.helpers.config_validation" = "cv"
  "homeassistant.helpers.device_registry" = "dr"
  "homeassistant.helpers.entity_registry" = "er"
  "homeassistant.helpers.floor_registry" = "fr"
  "homeassistant.helpers.issue_registry" = "ir"
  "homeassistant.helpers.label_registry" = "lr"
  "homeassistant.util.color" = "color_util"
  "homeassistant.util.dt" = "dt_util"
  "homeassistant.util.json" = "json_util"
  "homeassistant.util.location" = "location_util"
  "homeassistant.util.logging" = "logging_util"
  "homeassistant.util.network" = "network_util"
  "homeassistant.util.ulid" = "ulid_util"
  "homeassistant.util.uuid" = "uuid_util"
  "homeassistant.util.yaml" = "yaml_util"
  
  [tool.ruff.lint.flake8-pytest-style]
  fixture-parentheses = false
  mark-parentheses = false
  
  [tool.ruff.lint.flake8-tidy-imports.banned-api]
  "async_timeout".msg = "use asyncio.timeout instead"
  "pytz".msg = "use zoneinfo instead"
  "tests".msg = "You should not import tests"
  
  [tool.ruff.lint.isort]
  force-sort-within-sections = true
  known-first-party = [
      "homeassistant",
  ]
  combine-as-imports = true
  split-on-trailing-comma = false
  
  [tool.ruff.lint.mccabe]
  max-complexity = 25
  
  [tool.ruff.lint.pydocstyle]
  property-decorators = ["propcache.api.cached_property"]