content: [tool.isort]
  line_length = 80
  multi_line_output = 3
  include_trailing_comma = true
  use_parentheses = true
  known_first_party = ["cloudbot", "plugins", "tests"]
  float_to_top = true
  
  [tool.black]
  line-length = 80
  target-version = ['py310']
  include = '\.pyi?$'
  exclude = '''
  (
    /(
        \.eggs         # exclude a few common directories in the
      | \.git          # root of the project
      | \.hg
      | \.mypy_cache
      | \.tox
      | \.venv
      | _build
      | buck-out
      | build
      | dist
      | venv
    )/
  )
  '''
  
  [tool.pylint.main]
  analyse-fallback-blocks = true
  py-version = "3.10"
  extension-pkg-allow-list=["lxml"]
  
  [tool.pylint.messages_control]
  disable = [
    "raw-checker-failed",
    "no-else-return",
    "nested-min-max",
    "bad-mcs-classmethod-argument",
    "bad-inline-option",
    "locally-disabled",
    "file-ignored",
    "suppressed-message",
    "useless-suppression",
    "deprecated-pragma",
    "use-symbolic-message-instead",
    "invalid-name",
    "duplicate-string-formatting-argument",
    "missing-module-docstring",
    "missing-class-docstring",
    "missing-function-docstring",
    "consider-using-f-string",
    "consider-using-dict-items",
    "consider-using-with",
    "consider-using-min-builtin",
    "arguments-renamed",
    "use-maxsplit-arg",
    "consider-iterating-dictionary",
    "redefined-outer-name",
    "unused-argument",
    "broad-except",
    "ungrouped-imports",
    "wrong-import-position",
    "arguments-differ",
    "too-many-arguments",
    "too-many-locals",
    "too-many-statements",
    "too-many-branches",
    "too-many-positional-arguments",
    "protected-access",
    "duplicate-code",
    "no-else-raise",
    "arguments-out-of-order",
    "redefined-builtin",
    "no-else-continue",
    "unnecessary-comprehension",
    "no-value-for-parameter",
    "too-few-public-methods",
    "fixme",
    "too-many-public-methods",
    "missing-timeout",
    "not-callable",
    "unnecessary-lambda-assignment",
    "abstract-method",
    "consider-using-generator",
    "too-many-return-statements",
    "line-too-long",
    "too-many-instance-attributes",
    "broad-exception-raised",
    "use-implicit-booleaness-not-comparison",
    "comparison-with-callable",
  ]
  
  enable = ["c-extension-no-member"]
  
  [tool.pylint.typecheck]
  generated-members = "(requests\\.)?codes\\.[a-zA-Z0-9_]+"
  
  [tool.mypy]
  namespace_packages = true
  python_version = "3.10"
  warn_unused_configs = true
  strict = false
  strict_optional = false
  ignore_missing_imports = true
  check_untyped_defs = true
  show_error_codes = true
  warn_unused_ignores = true
  warn_redundant_casts = true
  # strict_equality = true
  plugins = [
    "pydantic.mypy"
  ]
  
  follow_imports = "silent"
  # disallow_any_generics = true
  no_implicit_reexport = true
  
  # for strict mypy: (this is the tricky one :-))
  # disallow_untyped_defs = true
  
  [[tool.mypy.overrides]]
  module = 'cloudbot.*'
  check_untyped_defs = true
  warn_return_any = true
  
  [[tool.mypy.overrides]]
  module = 'cloudbot.config'
  check_untyped_defs = true
  warn_return_any = true
  disallow_untyped_defs = true
  
  [[tool.mypy.overrides]]
  module = 'plugins.cryptocurrency'
  strict_optional = true
  check_untyped_defs = true
  warn_return_any = true
  
  [tool.pydantic-mypy]
  init_forbid_extra = true
  init_typed = true
  warn_required_dynamic_aliases = true
  
  [tool.commitizen]
  name = "cz_conventional_commits"
  tag_format = "v$version"
  version_scheme = "semver"
  update_changelog_on_bump = true
  version_files = ["cloudbot/__init__.py:__version__"]
  version = "1.5.0"
  
  [tool.autoflake]
  remove-all-unused-imports = true
  in-place = true
  
  [tool.pytest.ini_options]
  addopts = [
      "--ignore=venv",
      "--ignore=.*",
      "--ignore=tools",
      "--cov=.",
      "--cov-report=xml",
      "--cov-report=html",
      "--doctest-modules",
      "--random-order",
      "--pythonhashseed=123",
  ]
  testpaths = ["."]
  filterwarnings = [
      "error",
      "ignore:.*asyncio\\.iscoroutinefunction.*:DeprecationWarning:mcstatus.*",
  ]
  asyncio_mode = "strict"
  asyncio_default_fixture_loop_scope = "function"
  
  [tool.coverage.report]
  fail_under = 80
  exclude_lines = [
      "@overload",
      "if TYPE_CHECKING:", # Type checking blocks are never accessible at test/runtime
      "pragma: no cover",
      "def __repr__",
      "raise AssertionError",
      "raise NotImplementedError",
      "class .*\\(.*(Error|Exception)\\):",
      "^ *\\.\\.\\.$",
  ]
  
  [tool.coverage.run]
  branch = true
  omit = [
      "tests/data/*",
      "tests/util/*",
      ".*", # Ignore any .cache, .venv, etc directories
      "venv/*",
      "tools/*", # Build/CI tools
  ]
  