content: [project]
  name = "nebula"
  version = "6.1.2"
  description = "Open source broadcast automation system"
  authors = [
    {name = "Nebula Broadcast", email = "info@nebulabroadcast.com"},
  ]
  
  requires-python = ">=3.13"
  dependencies = [
      "aiocache>=0.12.3",
      "aiofiles >=24.1.0",
      "asyncpg >=0.29.0",
      "authlib>=1.5.1",
      "email-validator >=2.1.1",
      "fastapi >=0.115.0",
      "geoip2 >=4.8.0",
      "gunicorn >=22.0.0",
      "httpx >=0.27.2",
      "itsdangerous>=2.2.0",
      "mistune >=3.0.1",
      "pydantic >=2.9.2",
      "python-dotenv >=1.0.1",
      "redis >=5.1.0",
      "requests >=2.32.3",
      "rich >=13.8.0",
      "shortuuid >=1.0.12",
      "unidecode>=1.4.0",
      "user-agents >=2.2.0",
      "uvicorn-worker>=0.3.0",
      "uvicorn[standard] >=0.31.0",
  ]
  
  [dependency-groups]
  dev = [
      "asyncpg-stubs >=0.29.1",
      "mypy >=1.11",
      "pytest >=8.0",
      "pytest-asyncio >=0.20.3",
      "ruff >=0.6.8",
      "types-aiofiles >=23.2.0.20240311",
      "types-authlib>=1.4.0.20241230",
      "types-requests >=2.31.0.20240311",
  ]
  
  #
  # Tools
  #
  
  [tool.ruff]
  line-length = 88
  
  [tool.ruff.format]
  indent-style = "space"
  line-ending = "auto"
  skip-magic-trailing-comma = false
  docstring-code-format = true
  
  [tool.ruff.lint]
  select = [
      "E",     # pycodestyle errors
      "W",     # pycodestyle warnings
      "F",     # pyflakes
      "I",     # isort
      "C4",    # flake8-comprehensions
      "B",     # flake8-bugbear
      "ISC",   # flake8-implicit-str-concat
      "C4",    # flake8-comprehensions
      "UP",    # pyupgrade
      "ASYNC", # flake8-async
      "SIM",   # flake8-simplify
      "ISC",   # flake8-implicit-str-concat
      "S",     # flake8-bandit
      "Q",     # flake8-quotes
      # "FBT",   # flake8-boolean-trap (nope)
      # "ANN",   # flake8-annotations (disallows Any :-( )
      # "N",     # pep8-naming
      # "D",     # pydocstyle
  ]
  
  ignore = [
      "S101", # asserts - slowly removing
      "S608", # string-based SQL query construction
      "S307", # eval (used somewhere)
      "UP046",
      "UP047",
  ]
  
  [tool.mypy]
  plugins = ["pydantic.mypy"]
  # strict = true
  warn_redundant_casts = true
  warn_unused_ignores = true
  disallow_any_generics = true
  check_untyped_defs = true
  disallow_untyped_defs = true
  no_implicit_reexport = true
  explicit_package_bases = true
  strict_optional = true
  exclude = "tests/|.venv/"
  
  [[tool.mypy.overrides]]
  module = ["user_agents", "aiocache"]
  ignore_errors = true
  follow_imports = "skip"
  ignore_missing_imports = true
  