[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.organizationmember", "sentry.api.bases.project", "sentry.api.bases.team", "sentry.api.endpoints.accept_organization_invite", "sentry.api.endpoints.auth_config", "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_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.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.auth.helper", "sentry.auth.provider", "sentry.auth.system", "sentry.db.mixin", "sentry.db.postgres.base", "sentry.discover.endpoints.discover_key_transactions", "sentry.eventstore.models", "sentry.grouping.strategies.legacy", "sentry.identity.bitbucket.provider", "sentry.identity.gitlab.provider", "sentry.identity.oauth2", "sentry.identity.pipeline", "sentry.identity.providers.dummy", "sentry.incidents.endpoints.bases", "sentry.incidents.endpoints.organization_alert_rule_details", "sentry.incidents.endpoints.organization_alert_rule_index", "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.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.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.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.helpers.notifications", "sentry.utils.auth", "sentry.utils.committers", "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.identity.github_enterprise.*", "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.services", "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