[tool.black]
# File filtering is taken care of in pre-commit.
line-length = 100
target-version = ['py312']

[tool.isort]
profile = "black"
line_length = 100
lines_between_sections = 1
known_first_party = "sentry"
skip = "migrations"

[tool.pytest.ini_options]
python_files = "test_*.py sentry/testutils/*"
# note: When updating the traceback format, make sure to update .github/pytest.json
# We don't use the celery pytest plugin.
addopts = "--tb=short -p no:celery --nomigrations"
# TODO: --import-mode=importlib will become the default soon,
# currently we have a few relative imports that don't work with that.
markers = [
  "snuba: test requires access to snuba",
  "snuba_ci: test is run in snuba ci",
  "sentry_metrics: test requires access to sentry metrics",
  "symbolicator: test requires access to symbolicator",
  "querybuilder: smoke tests for QueryBuilders",
]
filterwarnings = [
  # Consider all warnings to be errors other than the ignored ones.
  "error",

  # phabricator uses `pkg_resources` apis
  "ignore:pkg_resources is deprecated as an API",

  # this warning in protobuf causes a segfault in 3.12+ protocolbuffers/protobuf#15077
  "ignore:Type google\\._upb.*",

  # TODO: we should fix these, but for now there's a lot
  "ignore:datetime.datetime.utcfromtimestamp\\(\\) is deprecated.*",
  "ignore:datetime.datetime.utcnow\\(\\) is deprecated.*",

  # The following warning filters are for pytest only.
  "ignore:.*sentry.digests.backends.dummy.DummyBackend.*:sentry.utils.warnings.UnsupportedBackend",

  # pytest has not yet implemented the replacement for this yet
  "ignore:The --looponfail command line argument.*",
]
looponfailroots = ["src", "tests"]

[tool.mypy]
python_version = "3.12"
mypy_path = ["fixtures/stubs-for-mypy"]
plugins = [
  "pydantic.mypy",
  "mypy_django_plugin.main",
  "tools.mypy_helpers.plugin",
]
files = ["."]
exclude = ["^.venv/", "^venv/", "^self-hosted/"]

# minimal strictness settings
check_untyped_defs = true
no_implicit_reexport = true
warn_unreachable = true
warn_unused_configs = true
warn_unused_ignores = true
warn_redundant_casts = true
enable_error_code = ["ignore-without-code", "redundant-self"]

[tool.django-stubs]
django_settings_module = "sentry.conf.server_mypy"

# these have py.typed but incorrect types
[[tool.mypy.overrides]]
module = [
  # TODO: these cause type errors when followed
  "snuba_sdk.*",
]
follow_imports = "skip"

# python3 -m tools.mypy_helpers.make_stub_ignores
# begin: missing 3rd party stubs
# - add .pyi files to fixtures/stubs-for-mypy
# - or find a 3rd party stub
[[tool.mypy.overrides]]
module = [
    "boto3.*",
    "botocore.client.*",
    "botocore.exceptions.*",
    "celery.*",
    "confluent_kafka.*",
    "cssselect.*",
    "django_zero_downtime_migrations.backends.postgres.schema.*",
    "docker.*",
    "fido2.*",
    "google.auth.*",
    "google.cloud.*",
    "google.resumable_media.common.*",
    "google.rpc.status_pb2.*",
    "kombu.*",
    "mistune.*",
    "onelogin.saml2.auth.*",
    "onelogin.saml2.constants.*",
    "onelogin.saml2.idp_metadata_parser.*",
    "phabricator.*",
    "rb.*",
    "requests_oauthlib.*",
    "sqlparse.*",
    "statsd.*",
    "u2flib_server.model.*",
    "unidiff.*",
]
ignore_missing_imports = true
# end: missing 3rd party stubs

# python3 -m tools.mypy_helpers.make_module_ignores
# begin: sentry modules with typing issues
# - remove the module from the list and fix the issues!
# - python3 -m tools.mypy_helpers.find_easiest_modules
[[tool.mypy.overrides]]
module = [
    "sentry.api.base",
    "sentry.api.bases.organization_events",
    "sentry.api.bases.organization_request_change",
    "sentry.api.bases.organizationmember",
    "sentry.api.bases.project",
    "sentry.api.bases.project_request_change",
    "sentry.api.bases.team",
    "sentry.api.endpoints.accept_organization_invite",
    "sentry.api.endpoints.auth_config",
    "sentry.api.endpoints.auth_login",
    "sentry.api.endpoints.chunk",
    "sentry.api.endpoints.codeowners",
    "sentry.api.endpoints.codeowners.index",
    "sentry.api.endpoints.event_attachments",
    "sentry.api.endpoints.group_integration_details",
    "sentry.api.endpoints.group_integrations",
    "sentry.api.endpoints.index",
    "sentry.api.endpoints.internal.mail",
    "sentry.api.endpoints.organization_details",
    "sentry.api.endpoints.organization_events",
    "sentry.api.endpoints.organization_events_facets_performance",
    "sentry.api.endpoints.organization_events_meta",
    "sentry.api.endpoints.organization_events_spans_performance",
    "sentry.api.endpoints.organization_index",
    "sentry.api.endpoints.organization_issues_count",
    "sentry.api.endpoints.organization_member.details",
    "sentry.api.endpoints.organization_member.index",
    "sentry.api.endpoints.organization_member.requests.invite.details",
    "sentry.api.endpoints.organization_metrics_meta",
    "sentry.api.endpoints.organization_onboarding_continuation_email",
    "sentry.api.endpoints.organization_projects",
    "sentry.api.endpoints.organization_releases",
    "sentry.api.endpoints.organization_request_project_creation",
    "sentry.api.endpoints.organization_search_details",
    "sentry.api.endpoints.organization_sessions",
    "sentry.api.endpoints.organization_stats",
    "sentry.api.endpoints.project_index",
    "sentry.api.endpoints.project_ownership",
    "sentry.api.endpoints.project_release_files",
    "sentry.api.endpoints.project_repo_path_parsing",
    "sentry.api.endpoints.project_rule_preview",
    "sentry.api.endpoints.project_rules_configuration",
    "sentry.api.endpoints.project_servicehook_stats",
    "sentry.api.endpoints.project_transaction_names",
    "sentry.api.endpoints.rule_snooze",
    "sentry.api.endpoints.team_details",
    "sentry.api.endpoints.team_release_count",
    "sentry.api.endpoints.user_subscriptions",
    "sentry.api.event_search",
    "sentry.api.helpers.group_index.index",
    "sentry.api.helpers.group_index.update",
    "sentry.api.invite_helper",
    "sentry.api.issue_search",
    "sentry.api.paginator",
    "sentry.api.permissions",
    "sentry.api.serializers.models.auth_provider",
    "sentry.api.serializers.models.dashboard",
    "sentry.api.serializers.models.environment",
    "sentry.api.serializers.models.event",
    "sentry.api.serializers.models.group",
    "sentry.api.serializers.models.group_stream",
    "sentry.api.serializers.models.organization",
    "sentry.api.serializers.models.plugin",
    "sentry.api.serializers.models.project",
    "sentry.api.serializers.models.role",
    "sentry.api.serializers.models.rule",
    "sentry.api.serializers.models.team",
    "sentry.api.serializers.rest_framework.mentions",
    "sentry.api.serializers.rest_framework.notification_action",
    "sentry.api.serializers.rest_framework.rule",
    "sentry.auth.helper",
    "sentry.auth.provider",
    "sentry.auth.system",
    "sentry.db.mixin",
    "sentry.db.postgres.base",
    "sentry.db.router",
    "sentry.discover.endpoints.discover_key_transactions",
    "sentry.eventstore.models",
    "sentry.grouping.strategies.legacy",
    "sentry.identity.bitbucket.provider",
    "sentry.identity.github_enterprise.provider",
    "sentry.identity.gitlab.provider",
    "sentry.identity.oauth2",
    "sentry.identity.pipeline",
    "sentry.identity.providers.dummy",
    "sentry.identity.slack.provider",
    "sentry.incidents.endpoints.bases",
    "sentry.incidents.endpoints.organization_alert_rule_details",
    "sentry.incidents.endpoints.organization_alert_rule_index",
    "sentry.incidents.endpoints.organization_incident_comment_details",
    "sentry.incidents.endpoints.organization_incident_index",
    "sentry.incidents.subscription_processor",
    "sentry.incidents.tasks",
    "sentry.integrations.api.bases.integration",
    "sentry.integrations.aws_lambda.integration",
    "sentry.integrations.bitbucket.client",
    "sentry.integrations.bitbucket.installed",
    "sentry.integrations.bitbucket.integration",
    "sentry.integrations.bitbucket.issues",
    "sentry.integrations.bitbucket.uninstalled",
    "sentry.integrations.bitbucket_server.client",
    "sentry.integrations.bitbucket_server.integration",
    "sentry.integrations.example.integration",
    "sentry.integrations.example.repository",
    "sentry.integrations.github.client",
    "sentry.integrations.github.integration",
    "sentry.integrations.github.issues",
    "sentry.integrations.github_enterprise.integration",
    "sentry.integrations.gitlab.client",
    "sentry.integrations.gitlab.integration",
    "sentry.integrations.gitlab.issues",
    "sentry.integrations.jira.actions.form",
    "sentry.integrations.jira.client",
    "sentry.integrations.jira.integration",
    "sentry.integrations.jira.views.base",
    "sentry.integrations.jira.webhooks.base",
    "sentry.integrations.jira.webhooks.issue_updated",
    "sentry.integrations.jira_server.client",
    "sentry.integrations.jira_server.integration",
    "sentry.integrations.metric_alerts",
    "sentry.integrations.msteams.actions.form",
    "sentry.integrations.msteams.client",
    "sentry.integrations.msteams.integration",
    "sentry.integrations.msteams.notifications",
    "sentry.integrations.notifications",
    "sentry.integrations.pagerduty.actions.form",
    "sentry.integrations.pagerduty.client",
    "sentry.integrations.pagerduty.integration",
    "sentry.integrations.pipeline",
    "sentry.integrations.slack.actions.form",
    "sentry.integrations.slack.integration",
    "sentry.integrations.slack.message_builder.notifications.digest",
    "sentry.integrations.slack.message_builder.notifications.issues",
    "sentry.integrations.slack.notifications",
    "sentry.integrations.slack.unfurl.discover",
    "sentry.integrations.slack.utils.channel",
    "sentry.integrations.slack.utils.users",
    "sentry.integrations.slack.webhooks.command",
    "sentry.integrations.slack.webhooks.event",
    "sentry.integrations.utils.commit_context",
    "sentry.integrations.utils.sync",
    "sentry.integrations.vercel.client",
    "sentry.integrations.vercel.integration",
    "sentry.integrations.vercel.webhook",
    "sentry.integrations.vsts.client",
    "sentry.integrations.vsts.integration",
    "sentry.integrations.vsts.issues",
    "sentry.integrations.vsts.repository",
    "sentry.integrations.vsts_extension.integration",
    "sentry.issues.search",
    "sentry.middleware.auth",
    "sentry.middleware.ratelimit",
    "sentry.middleware.superuser",
    "sentry.models.organizationaccessrequest",
    "sentry.monitors.consumers.monitor_consumer",
    "sentry.monitors.endpoints.base",
    "sentry.monitors.endpoints.monitor_ingest_checkin_attachment",
    "sentry.monitors.endpoints.organization_monitor_index",
    "sentry.net.http",
    "sentry.net.socket",
    "sentry.notifications.notifications.activity.base",
    "sentry.notifications.notifications.activity.release",
    "sentry.notifications.notifications.integration_nudge",
    "sentry.pipeline.base",
    "sentry.pipeline.views.base",
    "sentry.pipeline.views.nested",
    "sentry.plugins.bases.data_forwarding",
    "sentry.plugins.bases.issue",
    "sentry.plugins.bases.issue2",
    "sentry.plugins.bases.notify",
    "sentry.plugins.config",
    "sentry.plugins.endpoints",
    "sentry.receivers.releases",
    "sentry.release_health.metrics_sessions_v2",
    "sentry.replays.endpoints.project_replay_clicks_index",
    "sentry.replays.lib.query",
    "sentry.rules.actions.integrations.base",
    "sentry.rules.actions.integrations.create_ticket.form",
    "sentry.rules.actions.integrations.create_ticket.utils",
    "sentry.rules.filters.assigned_to",
    "sentry.rules.history.preview",
    "sentry.scim.endpoints.members",
    "sentry.scim.endpoints.teams",
    "sentry.scim.endpoints.utils",
    "sentry.search.events.builder.errors",
    "sentry.search.events.builder.metrics",
    "sentry.search.events.datasets.discover",
    "sentry.search.events.datasets.filter_aliases",
    "sentry.search.events.datasets.function_aliases",
    "sentry.search.events.datasets.metrics",
    "sentry.search.events.datasets.metrics_layer",
    "sentry.search.events.fields",
    "sentry.search.events.filter",
    "sentry.search.snuba.executors",
    "sentry.search.utils",
    "sentry.sentry_apps.installations",
    "sentry.sentry_metrics.indexer.postgres.postgres_v2",
    "sentry.shared_integrations.client.proxy",
    "sentry.snuba.errors",
    "sentry.snuba.issue_platform",
    "sentry.snuba.metrics.datasource",
    "sentry.snuba.metrics.fields.base",
    "sentry.snuba.metrics.query_builder",
    "sentry.snuba.sessions_v2",
    "sentry.snuba.spans_indexed",
    "sentry.snuba.spans_metrics",
    "sentry.tagstore.snuba.backend",
    "sentry.tagstore.types",
    "sentry.tasks.auth",
    "sentry.tasks.base",
    "sentry.testutils.cases",
    "sentry.testutils.fixtures",
    "sentry.testutils.helpers.notifications",
    "sentry.utils.auth",
    "sentry.utils.committers",
    "sentry.utils.services",
    "sentry.web.forms.accounts",
    "sentry.web.frontend.auth_login",
    "sentry.web.frontend.auth_organization_login",
    "sentry.web.frontend.base",
    "sentry.web.frontend.oauth_authorize",
    "sentry.web.frontend.oauth_token",
    "sentry.web.frontend.react_page",
    "sentry.web.frontend.setup_wizard",
    "sentry.web.frontend.shared_group_details",
    "sentry.web.frontend.twofactor",
    "sentry_plugins.bitbucket.client",
    "sentry_plugins.bitbucket.mixins",
    "sentry_plugins.github.plugin",
    "sentry_plugins.jira.plugin",
    "tests.sentry.api.bases.test_organization",
    "tests.sentry.api.bases.test_project",
    "tests.sentry.api.bases.test_team",
    "tests.sentry.api.endpoints.notifications.test_notification_actions_details",
    "tests.sentry.api.endpoints.notifications.test_notification_actions_index",
    "tests.sentry.api.endpoints.test_event_attachment_details",
    "tests.sentry.api.helpers.test_group_index",
    "tests.sentry.api.test_authentication",
    "tests.sentry.api.test_base",
    "tests.sentry.api.test_event_search",
    "tests.sentry.eventstore.test_base",
    "tests.sentry.issues.test_utils",
]
disable_error_code = [
    "arg-type",
    "assignment",
    "attr-defined",
    "call-arg",
    "call-overload",
    "dict-item",
    "index",
    "misc",
    "operator",
    "override",
    "return-value",
    "typeddict-item",
    "typeddict-unknown-key",
    "union-attr",
    "unreachable",
    "var-annotated",
]
# end: sentry modules with typing issues

# begin: stronger typing
[[tool.mypy.overrides]]
module = [
    "sentry.api.endpoints.project_backfill_similar_issues_embeddings_records",
    "sentry.api.helpers.deprecation",
    "sentry.api.helpers.source_map_helper",
    "sentry.auth.services.*",
    "sentry.auth.view",
    "sentry.buffer.*",
    "sentry.build.*",
    "sentry.db.models.fields.citext",
    "sentry.db.models.fields.foreignkey",
    "sentry.db.models.fields.hybrid_cloud_foreign_key",
    "sentry.db.models.fields.types",
    "sentry.db.models.manager.*",
    "sentry.db.models.paranoia",
    "sentry.db.models.utils",
    "sentry.deletions.*",
    "sentry.digests.notifications",
    "sentry.eventstore.reprocessing.redis",
    "sentry.eventtypes.error",
    "sentry.grouping.component",
    "sentry.grouping.fingerprinting",
    "sentry.grouping.ingest.*",
    "sentry.grouping.parameterization",
    "sentry.hybridcloud.*",
    "sentry.ingest.slicing",
    "sentry.integrations.models.integration_feature",
    "sentry.issues",
    "sentry.issues.analytics",
    "sentry.issues.apps",
    "sentry.issues.constants",
    "sentry.issues.endpoints",
    "sentry.issues.endpoints.group_activities",
    "sentry.issues.endpoints.group_event_details",
    "sentry.issues.endpoints.group_events",
    "sentry.issues.endpoints.group_participants",
    "sentry.issues.endpoints.organization_group_index_stats",
    "sentry.issues.endpoints.organization_group_search_views",
    "sentry.issues.endpoints.organization_release_previous_commits",
    "sentry.issues.endpoints.organization_searches",
    "sentry.issues.endpoints.project_events",
    "sentry.issues.endpoints.project_stacktrace_link",
    "sentry.issues.endpoints.related_issues",
    "sentry.issues.endpoints.shared_group_details",
    "sentry.issues.endpoints.team_groups_old",
    "sentry.issues.escalating_group_forecast",
    "sentry.issues.escalating_issues_alg",
    "sentry.issues.forecasts",
    "sentry.issues.ignored",
    "sentry.issues.ingest",
    "sentry.issues.issue_occurrence",
    "sentry.issues.json_schemas",
    "sentry.issues.merge",
    "sentry.issues.occurrence_consumer",
    "sentry.issues.ongoing",
    "sentry.issues.priority",
    "sentry.issues.producer",
    "sentry.issues.query",
    "sentry.issues.receivers",
    "sentry.issues.related.*",
    "sentry.issues.run",
    "sentry.issues.status_change",
    "sentry.issues.status_change_consumer",
    "sentry.issues.status_change_message",
    "sentry.issues.update_inbox",
    "sentry.lang.java.processing",
    "sentry.llm.*",
    "sentry.migrations.*",
    "sentry.models.event",
    "sentry.models.eventattachment",
    "sentry.models.groupsubscription",
    "sentry.monkey",
    "sentry.nodestore.base",
    "sentry.nodestore.bigtable.backend",
    "sentry.nodestore.django.backend",
    "sentry.nodestore.django.models",
    "sentry.nodestore.filesystem.backend",
    "sentry.nodestore.models",
    "sentry.organizations.*",
    "sentry.ownership.*",
    "sentry.plugins.base.response",
    "sentry.plugins.base.view",
    "sentry.profiles.*",
    "sentry.projects.services.*",
    "sentry.ratelimits.leaky_bucket",
    "sentry.relay.config.metric_extraction",
    "sentry.reprocessing2",
    "sentry.runner.*",
    "sentry.search.snuba.backend",
    "sentry.sentry_metrics.consumers.indexer.slicing_router",
    "sentry.snuba.metrics.extraction",
    "sentry.stacktraces.platform",
    "sentry.tasks.beacon",
    "sentry.tasks.commit_context",
    "sentry.tasks.on_demand_metrics",
    "sentry.tasks.reprocessing2",
    "sentry.tasks.store",
    "sentry.taskworker.*",
    "sentry.testutils.helpers.task_runner",
    "sentry.types.actor",
    "sentry.types.region",
    "sentry.users.*",
    "sentry.utils.arroyo",
    "sentry.utils.assets",
    "sentry.utils.audit",
    "sentry.utils.celery",
    "sentry.utils.codeowners",
    "sentry.utils.colors",
    "sentry.utils.email.*",
    "sentry.utils.env",
    "sentry.utils.event",
    "sentry.utils.files",
    "sentry.utils.function_cache",
    "sentry.utils.geo",
    "sentry.utils.imports",
    "sentry.utils.iterators",
    "sentry.utils.javascript",
    "sentry.utils.lazy_service_wrapper",
    "sentry.utils.locking.*",
    "sentry.utils.migrations",
    "sentry.utils.numbers",
    "sentry.utils.otp",
    "sentry.utils.performance_issues.detectors.*",
    "sentry.utils.performance_issues.performance_detection",
    "sentry.utils.pubsub",
    "sentry.utils.redis",
    "sentry.utils.redis_metrics",
    "sentry.utils.sentry_apps.*",
    "sentry.utils.sms",
    "sentry.utils.snowflake",
    "sentry.utils.urls",
    "sentry.utils.uwsgi",
    "sentry.utils.zip",
    "sentry.web.frontend.auth_provider_login",
    "sentry.web.frontend.cli",
    "sentry.web.frontend.csv",
    "sentry_plugins.base",
    "tests.sentry.deletions.test_group",
    "tests.sentry.event_manager.test_event_manager",
    "tests.sentry.grouping.ingest.test_seer",
    "tests.sentry.grouping.test_fingerprinting",
    "tests.sentry.hybridcloud.*",
    "tests.sentry.issues",
    "tests.sentry.issues.endpoints",
    "tests.sentry.issues.endpoints.test_actionable_items",
    "tests.sentry.issues.endpoints.test_organization_group_search_views",
    "tests.sentry.issues.endpoints.test_organization_searches",
    "tests.sentry.issues.endpoints.test_project_stacktrace_link",
    "tests.sentry.issues.endpoints.test_related_issues",
    "tests.sentry.issues.endpoints.test_source_map_debug",
    "tests.sentry.issues.test_attributes",
    "tests.sentry.issues.test_escalating",
    "tests.sentry.issues.test_escalating_issues_alg",
    "tests.sentry.issues.test_group_attributes_dataset",
    "tests.sentry.issues.test_grouptype",
    "tests.sentry.issues.test_ignored",
    "tests.sentry.issues.test_ingest",
    "tests.sentry.issues.test_issue_occurrence",
    "tests.sentry.issues.test_issue_velocity",
    "tests.sentry.issues.test_json_schemas",
    "tests.sentry.issues.test_merge",
    "tests.sentry.issues.test_occurrence_consumer",
    "tests.sentry.issues.test_ongoing",
    "tests.sentry.issues.test_priority",
    "tests.sentry.issues.test_producer",
    "tests.sentry.issues.test_run",
    "tests.sentry.issues.test_search_issues_dataset",
    "tests.sentry.issues.test_status_change",
    "tests.sentry.issues.test_status_change_consumer",
    "tests.sentry.issues.test_update_inbox",
    "tests.sentry.ownership.*",
    "tests.sentry.ratelimits.test_leaky_bucket",
    "tests.sentry.relay.config.test_metric_extraction",
    "tests.sentry.tasks.test_on_demand_metrics",
    "tests.sentry.types.test_actor",
    "tests.sentry.types.test_region",
    "tests.sentry.web.frontend.test_cli",
    "tools.*",
]
disallow_any_generics = true
disallow_untyped_defs = true
# end: stronger typing