content: [tool.poetry]
  name = "experimenter"
  version = "0.1.0"
  description = ""
  authors = ["Mozilla"]
  package-mode = false
  
  [tool.poetry.dependencies]
  asgiref = "3.10.0"
  celery = "^5.5.1"
  chardet = "4.0.0"
  click = "8.1.6"
  coverage = "^7.10.1"
  datadog = "0.52.0"
  dj-inmemorystorage = "^2.1.0"
  django = "^5.2"
  django-admin-rangefilter = "0.13.0"
  django-bootstrap5 = "^24.3"
  django-cors-headers = "3.14.0"
  django-countries = "7.6"
  django-filter = "^23.5"
  django-import-export = "^3.0"
  django-markdown2 = "0.3.1"
  django-mozilla-product-details = "0.14.1"
  django-redis = "^5.4.0"
  django-storages = "1.14"
  django-test-migrations = "^1.5.0"
  django-types = "^0.22.0"
  django-widget-tweaks = "1.5.0"
  djangorestframework = "3.16.0"
  djangorestframework-csv = "2.1.1"
  djangorestframework-dataclasses = "^1.4.0"
  djlint = "^1.36.1"
  dockerflow = "^2024.4.1"
  factory_boy = "3.3.0"
  fontawesomefree = "6.6.0"
  google-cloud-storage = "^3.4.0"
  graphene-django = "^3.2.0"
  graphene-file-upload = "^1.3.0"
  gunicorn = "23.0.0"
  ipdb = "0.13.9"
  jsonschema = "^4.25.0"
  kinto-http = "11.9.0"
  markdown2 = "2.5.0"
  markus = "3.0.0"
  mock = "4.0.3"
  mozilla-metric-config-parser = "^2024.11.1"
  mozilla-nimbus-schemas = "2025.1.1"
  packaging = "21.3"
  parameterized = "0.9.0"
  pillow = "^11.3.0"
  psycopg2 = "^2.9.10"
  pydantic = "^2"
  pyjexl = "^0.3.0"
  pyparsing = "2.4.7"
  pyright = "^1.1.291"
  pytest-cov = "^6.3.0"
  pytest-django = "4.11.1"
  pytest-testmon = "^2.1.3"
  pytest-watch = "4.2.0"
  pytest-xdist = "2.5.0"
  python = "^3.11"
  python-decouple = "3.8"
  pyyaml = "^6.0.1"
  PyYAML = "^6.0"
  redis = "4.6.0"
  requests = { version = "2.32.4", extras = ["security"] }
  responses = "0.25.0"
  ruff = "^0.13.0"
  sentry-sdk = "^2.40.0"
  sqlparse = "0.5.0"
  tblib = "1.7.0"
  toml = "^0.10.2"
  unicodecsv = "0.14.1"
  uritemplate = "3.0.1"
  whitenoise = "5.3.0"
  inflection = "^0.5.1"
  pytest = "^8.4.0"
  pyjwt = {extras = ["crypto"], version = "^2.10.1"}
  
  [tool.poetry.dev-dependencies]
  rope = "^0.23.0"
  
  [build-system]
  requires = ["poetry>=2.1.1"]
  build-backend = "poetry.masonry.api"
  
  [tool.pyright]
  include = ["experimenter"]
  exclude = [
      "**/node_modules",
      "**/__pycache__",
      "**/migrations",
      "experimenter/legacy",
      "**/tests",
  ]
  
  reportAttributeAccessIssue = false
  reportIndexIssue = false
  reportArgumentType = false
  reportCallInDefaultInitializer = true
  reportConstantRedefinition = false
  reportFunctionMemberAccess = false
  reportGeneralTypeIssues = false
  reportImplicitStringConcatenation = false
  reportIncompatibleMethodOverride = false
  reportIncompatibleVariableOverride = false
  reportMissingModuleSource = false
  reportMissingParameterType = false
  reportMissingSuperCall = false
  reportMissingTypeArgument = true
  reportOptionalCall = true
  reportOptionalIterable = true
  reportOptionalMemberAccess = true
  reportOptionalOperand = true
  reportOptionalSubscript = true
  reportPrivateUsage = true
  reportPropertyTypeMismatch = true
  reportSelfClsParameterName = false
  reportTypedDictNotRequiredAccess = true
  reportUninitializedInstanceVariable = false
  reportUnknownArgumentType = false
  reportUnknownLambdaType = false
  reportUnknownMemberType = false
  reportUnknownParameterType = false
  reportUnknownVariableType = false
  reportUnnecessaryTypeIgnoreComment = true
  reportUntypedBaseClass = false
  reportUntypedClassDecorator = true
  reportUntypedFunctionDecorator = false
  reportUnusedCallResult = false
  
  [tool.ruff]
  # Exclude a variety of commonly ignored directories.
  exclude = ["migrations", ".tox", "node_modules", "legacy", ".pyenv"]
  
  # Same as Black.
  line-length = 90
  
  [tool.ruff.format]
  quote-style = "double"
  indent-style = "space"
  docstring-code-format = true
  
  [tool.ruff.lint]
  select = [
      "A",
      "B",
      "C4",
      "DJ",
      "E",
      "F",
      "I",
      "ISC",
      "N",
      "PIE",
      "Q",
      "RET",
      "RSE",
      "RUF",
      "SIM",
      "TID",
      "UP",
      "W",
      "YTT",
      "PTH",
  ]
  ignore = [
      "A003",
      "A005",
      "B017",
      "B035",
      "DJ001",
      "DJ006",
      "DJ012",
      "E402",
      "E741",
      "F403",
      "N802",
      "N803",
      "N806",
      "N812",
      "N815",
      "PIE796",
      "PTH208",
      "RET503",
      "RET504",
      "RET505",
      "RUF012",
      "RUF059",
      "SIM102",
      "UP006",
      "UP007",
      "UP038",
      "UP045",
  ]
  
  [tool.djlint]
  profile = "django"
  ignore = "H021,H030,H031"
  blank_line_after_tag = "load,extends,include,endblock"
  indent = 2
  