content: [build-system]
  build-backend = "setuptools.build_meta"
  requires = ["setuptools"]
  
  [project]
  name = "django-prodserver"
  version = "2.3.0"
  description = "A management command to start production servers/workers with a consistent interface"
  readme = "README.md"
  license = { text = "MIT" }
  authors = [{ name = "Andy Miller", email = "info@akmiller.co.uk" }]
  requires-python = ">=3.9"
  classifiers = [
      "Development Status :: 2 - Pre-Alpha",
      "Intended Audience :: Developers",
      "Natural Language :: English",
      "Operating System :: OS Independent",
      "Framework :: Django",
      "Framework :: Django :: 5.2",
      "Programming Language :: Python :: 3.12",
      "Programming Language :: Python :: 3.13",
      "Topic :: Software Development :: Libraries",
  ]
  
  dependencies = ["django>=4.2"]
  urls."Bug Tracker" = "https://github.com/nanorepublica/django-prodserver/issues"
  urls.Changelog = "https://github.com/nanorepublica/django-prodserver/blob/main/CHANGELOG.md"
  urls.documentation = "https://django-prodserver.readthedocs.io"
  urls.repository = "https://github.com/nanorepublica/django-prodserver"
  
  [project.optional-dependencies]
  gunicorn = ["gunicorn>=23.0.0"]
  django-tasks = ["django-tasks>=0.7.0"]
  celery = ["celery>=5.5.2"]
  django-q2 = ["django-q2>=1.6.0", "django-picklefield"]
  granian = ["granian>=1.0.0"]
  uvicorn = ["uvicorn>=0.34.2"]
  waitress = ["waitress>=3.0.2"]
  
  [dependency-groups]
  dev = ["pytest>=8,<9", "pytest-cov>=6,<7", "pytest-django>=4.5,<5"]
  docs = [
      "furo>=2023.5.20; python_version>='3.11'",
      "myst-parser>=0.16; python_version>='3.11'",
      "sphinx>=4; python_version>='3.11'",
      "sphinx-autobuild>=2024,<2025; python_version>='3.11'",
  ]
  
  [tool.ruff]
  line-length = 88
  lint.select = [
      "B",   # flake8-bugbear
      "D",   # flake8-docstrings
      "C4",  # flake8-comprehensions
      "S",   # flake8-bandit
      "F",   # pyflake
      "E",   # pycodestyle
      "W",   # pycodestyle
      "UP",  # pyupgrade
      "I",   # isort
      "RUF", # ruff specific
  ]
  lint.ignore = [
      "D203", # 1 blank line required before class docstring
      "D212", # Multi-line docstring summary should start at the first line
      "D100", # Missing docstring in public module
      "D104", # Missing docstring in public package
      "D107", # Missing docstring in `__init__`
      "D401", # First line of docstring should be in imperative mood
  ]
  lint.per-file-ignores."conftest.py" = ["D100"]
  lint.per-file-ignores."docs/conf.py" = ["D100"]
  lint.per-file-ignores."setup.py" = ["D100"]
  lint.per-file-ignores."tests/**/*" = [
      "D100",
      "D101",
      "D102",
      "D103",
      "D104",
      "S101",
      "S104",
  ]
  lint.isort.known-first-party = ["django_prodserver", "tests"]
  
  [tool.pytest.ini_options]
  addopts = """\
      -v
      -Wdefault
      --ds=tests.settings
      """
  pythonpath = ["src"]
  
  [tool.coverage.run]
  branch = true
  
  [tool.coverage.report]
  exclude_lines = [
      "pragma: no cover",
      "@overload",
      "if TYPE_CHECKING",
      "raise NotImplementedError",
      'if __name__ == "__main__":',
  ]
  
  [tool.mypy]
  check_untyped_defs = true
  disallow_any_generics = true
  disallow_incomplete_defs = true
  disallow_untyped_defs = true
  mypy_path = "src/"
  no_implicit_optional = true
  show_error_codes = true
  warn_unreachable = true
  warn_unused_ignores = true
  exclude = ['docs/.*', 'setup.py']
  
  [[tool.mypy.overrides]]
  module = "tests.*"
  allow_untyped_defs = true
  
  [[tool.mypy.overrides]]
  module = "docs.*"
  ignore_errors = true
  
  [tool.semantic_release]
  version_toml = ["pyproject.toml:project.version"]
  version_variables = [
      "src/django_prodserver/__init__.py:__version__",
      "docs/conf.py:release",
  ]
  build_command = """
  pip install uv
  uv lock
  git add uv.lock
  uv build
  """
  
  [tool.semantic_release.changelog]
  exclude_commit_patterns = [
      '''chore(?:\([^)]*?\))?: .+''',
      '''ci(?:\([^)]*?\))?: .+''',
      '''refactor(?:\([^)]*?\))?: .+''',
      '''style(?:\([^)]*?\))?: .+''',
      '''test(?:\([^)]*?\))?: .+''',
      '''build\((?!deps\): .+)''',
      '''Merged? .*''',
      '''Initial [Cc]ommit.*''',         # codespell:ignore
  ]
  
  [tool.semantic_release.changelog.environment]
  keep_trailing_newline = true
  
  [tool.semantic_release.branches.main]
  match = "main"
  
  [tool.semantic_release.branches.noop]
  match = "(?!main$)"
  prerelease = true
  