content: [build-system]
  build-backend = "hatchling.build"
  requires = [
    "hatchling",
  ]
  
  [project]
  name = "blacknoise"
  description = "An ASGI app for static file serving inspired by whitenoise"
  readme = "README.md"
  keywords = [
  ]
  license = { text = "MIT" }
  authors = [
    { name = "Matthias Kestenholz", email = "mk@feinheit.ch" },
  ]
  requires-python = ">=3.9"
  classifiers = [
    "Development Status :: 4 - Beta",
    "Programming Language :: Python",
    "Programming Language :: Python :: 3 :: Only",
    "Programming Language :: Python :: 3.9",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
    "Programming Language :: Python :: 3.12",
    "Programming Language :: Python :: 3.13",
    "Programming Language :: Python :: Implementation :: CPython",
    "Programming Language :: Python :: Implementation :: PyPy",
  ]
  dynamic = [
    "version",
  ]
  dependencies = [
    "starlette>=0.47",
  ]
  urls.Documentation = "https://github.com/matthiask/blacknoise#readme"
  urls.Issues = "https://github.com/matthiask/blacknoise/issues"
  urls.Source = "https://github.com/matthiask/blacknoise"
  
  [tool.hatch.version]
  path = "src/blacknoise/__about__.py"
  
  [tool.hatch.envs.default]
  dependencies = [
    "brotli",
    "coverage[toml]>=6.5",
    "httpx",
    "httpx-ws",
    "pytest",
    "pytest-asyncio",
  ]
  [tool.hatch.envs.default.scripts]
  test = "pytest {args:tests}"
  test-cov = "coverage run -m pytest {args:tests}"
  cov-report = [
    "- coverage combine",
    "coverage report -m",
  ]
  cov = [
    "test-cov",
    "cov-report",
  ]
  
  [[tool.hatch.envs.all.matrix]]
  python = [
    "3.9",
    "3.10",
    "3.11",
    "3.12",
    "3.13",
  ]
  
  [tool.ruff]
  target-version = "py39"
  
  fix = true
  lint.select = [
    "ARG",
    "B",
    "C",
    "DTZ",
    "E",
    "EM",
    "F",
    "FBT",
    "I",
    "ICN",
    "ISC",
    "N",
    "PLC",
    "PLE",
    "PLR",
    "PLW",
    "Q",
    "RUF",
    "S",
    # "T",
    "TID",
    "UP",
    "W",
    "YTT",
  ]
  lint.ignore = [
    # Allow non-abstract empty methods in abstract base classes
    "B027",
    # Ignore complexity
    "C901",
    # Stop warning about line lengths
    "E501",
    # Allow boolean positional values in function calls, like `dict.get(... True)`
    "FBT003",
    "PLR0911",
    "PLR0912",
    "PLR0913",
    "PLR0915",
    # Ignore checks for possible passwords
    "S105",
    "S106",
    "S107",
  ]
  
  lint.per-file-ignores."tests/**/*" = [
    "PLR2004",
    "S101",
    "TID252",
  ]
  lint.unfixable = [
    # Don't touch unused imports
    "F401",
  ]
  lint.flake8-tidy-imports.ban-relative-imports = "all"
  # Tests can use magic values, assertions, and relative imports
  lint.isort.known-first-party = [
    "blacknoise",
  ]
  
  [tool.coverage.run]
  source_pkgs = [
    "blacknoise",
    "tests",
  ]
  branch = true
  parallel = true
  omit = [
    "src/blacknoise/__about__.py",
  ]
  
  [tool.coverage.paths]
  blacknoise = [
    "src/blacknoise",
    "*/blacknoise/src/blacknoise",
  ]
  tests = [
    "tests",
    "*/blacknoise/tests",
  ]
  
  [tool.coverage.report]
  exclude_lines = [
    "no cov",
    "if __name__ == .__main__.:",
    "if TYPE_CHECKING:",
  ]
  