[build-system] requires = ["setuptools>=40.2.0,<64.0.0", "wheel"] build-backend = "setuptools.build_meta" [tool.black] # File filtering is taken care of in pre-commit. line-length = 100 target-version = ['py311'] [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", ] filterwarnings = [ # Consider all warnings to be errors other than the ignored ones. "error", # a bunch of google packages use legacy namespace packages "ignore:pkg_resources is deprecated as an API", "ignore:Deprecated call to `pkg_resources.declare_namespace\\('google.*'\\)`.", # this warning in protobuf causes a segfault in 3.12+ protocolbuffers/protobuf#15077 "ignore:Type google\\._upb.*", # 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.11" 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"] [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.pubsub_v1.*", "google.cloud.storage.blob.*", "google.cloud.storage.bucket.*", "google.cloud.storage.client.*", "google.resumable_media.common.*", "google.rpc.status_pb2.*", "google_crc32c.*", "kombu.*", "mistune.*", "onelogin.saml2.auth.*", "onelogin.saml2.constants.*", "onelogin.saml2.idp_metadata_parser.*", "phabricator.*", "progressbar.*", "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.external_actor", "sentry.api.bases.incident", "sentry.api.bases.integration", "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.rule", "sentry.api.bases.sentryapps", "sentry.api.bases.team", "sentry.api.endpoints.accept_organization_invite", "sentry.api.endpoints.artifact_lookup", "sentry.api.endpoints.auth_config", "sentry.api.endpoints.auth_login", "sentry.api.endpoints.catchall", "sentry.api.endpoints.chunk", "sentry.api.endpoints.codeowners", "sentry.api.endpoints.codeowners.index", "sentry.api.endpoints.event_attachments", "sentry.api.endpoints.group_external_issues", "sentry.api.endpoints.group_integration_details", "sentry.api.endpoints.group_integrations", "sentry.api.endpoints.index", "sentry.api.endpoints.integrations.install_request", "sentry.api.endpoints.integrations.sentry_apps.details", "sentry.api.endpoints.integrations.sentry_apps.index", "sentry.api.endpoints.integrations.sentry_apps.installation.index", "sentry.api.endpoints.integrations.sentry_apps.internal_app_token.index", "sentry.api.endpoints.integrations.sentry_apps.publish_request", "sentry.api.endpoints.integrations.sentry_apps.requests", "sentry.api.endpoints.integrations.sentry_apps.stats.details", "sentry.api.endpoints.internal.mail", "sentry.api.endpoints.notifications.notification_actions_details", "sentry.api.endpoints.organization_code_mapping_codeowners", "sentry.api.endpoints.organization_code_mapping_details", "sentry.api.endpoints.organization_code_mappings", "sentry.api.endpoints.organization_dashboard_details", "sentry.api.endpoints.organization_details", "sentry.api.endpoints.organization_events", "sentry.api.endpoints.organization_events_facets", "sentry.api.endpoints.organization_events_facets_performance", "sentry.api.endpoints.organization_events_meta", "sentry.api.endpoints.organization_events_spans_performance", "sentry.api.endpoints.organization_events_stats", "sentry.api.endpoints.organization_events_trace", "sentry.api.endpoints.organization_events_trends", "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_member_unreleased_commits", "sentry.api.endpoints.organization_metrics", "sentry.api.endpoints.organization_metrics_meta", "sentry.api.endpoints.organization_onboarding_continuation_email", "sentry.api.endpoints.organization_projects", "sentry.api.endpoints.organization_projects_experiment", "sentry.api.endpoints.organization_releases", "sentry.api.endpoints.organization_repositories", "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.organization_teams", "sentry.api.endpoints.project_artifact_bundle_file_details", "sentry.api.endpoints.project_event_details", "sentry.api.endpoints.project_group_index", "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.team_time_to_resolution", "sentry.api.endpoints.user_details", "sentry.api.endpoints.user_subscriptions", "sentry.api.event_search", "sentry.api.helpers.deprecation", "sentry.api.helpers.group_index.index", "sentry.api.helpers.group_index.update", "sentry.api.helpers.group_index.validators.status_details", "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.doc_integration", "sentry.api.serializers.models.environment", "sentry.api.serializers.models.event", "sentry.api.serializers.models.external_actor", "sentry.api.serializers.models.group", "sentry.api.serializers.models.group_stream", "sentry.api.serializers.models.incident", "sentry.api.serializers.models.integration", "sentry.api.serializers.models.integration_feature", "sentry.api.serializers.models.notification_action", "sentry.api.serializers.models.organization", "sentry.api.serializers.models.organization_member.base", "sentry.api.serializers.models.plugin", "sentry.api.serializers.models.project", "sentry.api.serializers.models.projectcodeowners", "sentry.api.serializers.models.role", "sentry.api.serializers.models.rule", "sentry.api.serializers.models.sentry_app", "sentry.api.serializers.models.team", "sentry.api.serializers.models.user", "sentry.api.serializers.models.user_identity_config", "sentry.api.serializers.rest_framework.doc_integration", "sentry.api.serializers.rest_framework.mentions", "sentry.api.serializers.rest_framework.notification_action", "sentry.api.serializers.rest_framework.rule", "sentry.api.serializers.rest_framework.sentry_app_request", "sentry.api.serializers.snuba", "sentry.api.validators.email", "sentry.auth.helper", "sentry.auth.provider", "sentry.auth.providers.dummy", "sentry.auth.providers.github.views", "sentry.auth.providers.google.views", "sentry.auth.providers.oauth2", "sentry.auth.providers.saml2.generic.views", "sentry.auth.providers.saml2.provider", "sentry.auth.providers.saml2.rippling.provider", "sentry.auth.providers.saml2.views", "sentry.auth.system", "sentry.auth.view", "sentry.db.mixin", "sentry.db.models.manager.base", "sentry.db.models.paranoia", "sentry.db.models.query", "sentry.db.models.utils", "sentry.db.postgres.base", "sentry.db.router", "sentry.digests.notifications", "sentry.discover.endpoints.discover_key_transactions", "sentry.eventstore.models", "sentry.features.handler", "sentry.features.manager", "sentry.grouping.fingerprinting", "sentry.grouping.strategies.hierarchical", "sentry.grouping.strategies.legacy", "sentry.grouping.strategies.newstyle", "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.logic", "sentry.incidents.subscription_processor", "sentry.incidents.tasks", "sentry.integrations.aws_lambda.integration", "sentry.integrations.base", "sentry.integrations.bitbucket.client", "sentry.integrations.bitbucket.installed", "sentry.integrations.bitbucket.integration", "sentry.integrations.bitbucket.issues", "sentry.integrations.bitbucket.uninstalled", "sentry.integrations.bitbucket.webhook", "sentry.integrations.bitbucket_server.client", "sentry.integrations.bitbucket_server.integration", "sentry.integrations.bitbucket_server.webhook", "sentry.integrations.example.integration", "sentry.integrations.example.repository", "sentry.integrations.github.client", "sentry.integrations.github.integration", "sentry.integrations.github.issues", "sentry.integrations.github.repository", "sentry.integrations.github.webhook", "sentry.integrations.github_enterprise.integration", "sentry.integrations.github_enterprise.webhook", "sentry.integrations.gitlab.client", "sentry.integrations.gitlab.integration", "sentry.integrations.gitlab.issues", "sentry.integrations.gitlab.webhooks", "sentry.integrations.jira.actions.form", "sentry.integrations.jira.client", "sentry.integrations.jira.integration", "sentry.integrations.jira.views.base", "sentry.integrations.jira.views.sentry_issue_details", "sentry.integrations.jira.webhooks.base", "sentry.integrations.jira.webhooks.issue_updated", "sentry.integrations.jira_server.client", "sentry.integrations.jira_server.integration", "sentry.integrations.jira_server.webhooks", "sentry.integrations.manager", "sentry.integrations.message_builder", "sentry.integrations.metric_alerts", "sentry.integrations.mixins.issues", "sentry.integrations.mixins.notifications", "sentry.integrations.mixins.repositories", "sentry.integrations.msteams.actions.form", "sentry.integrations.msteams.client", "sentry.integrations.msteams.integration", "sentry.integrations.msteams.link_identity", "sentry.integrations.msteams.notifications", "sentry.integrations.msteams.webhook", "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.client", "sentry.integrations.slack.integration", "sentry.integrations.slack.message_builder.issues", "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.views.link_identity", "sentry.integrations.slack.views.link_team", "sentry.integrations.slack.views.unlink_team", "sentry.integrations.slack.webhooks.action", "sentry.integrations.slack.webhooks.base", "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.endpoints.group_events", "sentry.issues.endpoints.organization_group_index", "sentry.issues.endpoints.source_map_debug", "sentry.issues.search", "sentry.middleware.access_log", "sentry.middleware.auth", "sentry.middleware.ratelimit", "sentry.middleware.superuser", "sentry.models.auditlogentry", "sentry.models.integrations.external_issue", "sentry.models.integrations.sentry_app_installation", "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.additional_attachment_manager", "sentry.notifications.notifications.activity.base", "sentry.notifications.notifications.activity.release", "sentry.notifications.notifications.integration_nudge", "sentry.notifications.notifications.rules", "sentry.ownership.grammar", "sentry.pipeline.base", "sentry.pipeline.views.base", "sentry.pipeline.views.nested", "sentry.plugins.base.notifier", "sentry.plugins.base.urls", "sentry.plugins.bases.data_forwarding", "sentry.plugins.bases.issue", "sentry.plugins.bases.issue2", "sentry.plugins.bases.notify", "sentry.plugins.config", "sentry.plugins.endpoints", "sentry.plugins.providers.base", "sentry.plugins.providers.repository", "sentry.profiles.task", "sentry.profiles.utils", "sentry.receivers.releases", "sentry.receivers.sentry_apps", "sentry.release_health.metrics_sessions_v2", "sentry.release_health.tasks", "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.actions.notify_event_service", "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.discover", "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.datasets.profile_functions", "sentry.search.events.datasets.profiles", "sentry.search.events.datasets.spans_metrics", "sentry.search.events.fields", "sentry.search.events.filter", "sentry.search.snuba.backend", "sentry.search.snuba.executors", "sentry.search.utils", "sentry.sentry_apps.apps", "sentry.sentry_apps.installations", "sentry.sentry_metrics.configuration", "sentry.sentry_metrics.consumers.indexer.slicing_router", "sentry.sentry_metrics.indexer.postgres.postgres_v2", "sentry.shared_integrations.client.base", "sentry.shared_integrations.client.proxy", "sentry.similarity.features", "sentry.snuba.discover", "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.stacktraces.functions", "sentry.tagstore.snuba.backend", "sentry.tagstore.types", "sentry.tasks.auth", "sentry.tasks.base", "sentry.tasks.codeowners.update_code_owners_schema", "sentry.tasks.deliver_from_outbox", "sentry.tasks.digests", "sentry.tasks.groupowner", "sentry.tasks.integrations", "sentry.tasks.integrations.migrate_issues", "sentry.tasks.integrations.migrate_repo", "sentry.tasks.integrations.slack.find_channel_id_for_rule", "sentry.tasks.integrations.slack.link_slack_user_identities", "sentry.tasks.integrations.sync_assignee_outbound_impl", "sentry.tasks.integrations.sync_status_inbound", "sentry.tasks.integrations.sync_status_outbound", "sentry.tasks.merge", "sentry.tasks.process_buffer", "sentry.tasks.sentry_apps", "sentry.tasks.store", "sentry.tasks.unmerge", "sentry.templatetags.sentry_assets", "sentry.templatetags.sentry_helpers", "sentry.templatetags.sentry_plugins", "sentry.testutils.asserts", "sentry.testutils.cases", "sentry.testutils.fixtures", "sentry.testutils.helpers.features", "sentry.testutils.helpers.notifications", "sentry.testutils.helpers.slack", "sentry.testutils.helpers.task_runner", "sentry.testutils.performance_issues.span_builder", "sentry.testutils.performance_issues.store_transaction", "sentry.tsdb.dummy", "sentry.tsdb.inmemory", "sentry.types.integrations", "sentry.utils.audit", "sentry.utils.auth", "sentry.utils.committers", "sentry.utils.distutils.commands.base", "sentry.utils.distutils.commands.build_assets", "sentry.utils.email.signer", "sentry.utils.locking.backends.migration", "sentry.utils.performance_issues.detectors.io_main_thread_detector", "sentry.utils.performance_issues.detectors.mn_plus_one_db_span_detector", "sentry.utils.performance_issues.detectors.n_plus_one_api_calls_detector", "sentry.utils.performance_issues.detectors.n_plus_one_db_span_detector", "sentry.utils.performance_issues.detectors.render_blocking_asset_span_detector", "sentry.utils.performance_issues.detectors.slow_db_query_detector", "sentry.utils.performance_issues.performance_detection", "sentry.utils.sentry_apps.webhooks", "sentry.utils.services", "sentry.utils.snowflake", "sentry.utils.suspect_resolutions.get_suspect_resolutions", "sentry.utils.suspect_resolutions_releases.get_suspect_resolutions_releases", "sentry.web.forms.accounts", "sentry.web.frontend.account_identity", "sentry.web.frontend.auth_close", "sentry.web.frontend.auth_login", "sentry.web.frontend.auth_logout", "sentry.web.frontend.auth_organization_login", "sentry.web.frontend.auth_provider_login", "sentry.web.frontend.base", "sentry.web.frontend.debug.debug_codeowners_auto_sync_failure_email", "sentry.web.frontend.debug.debug_incident_activity_email", "sentry.web.frontend.debug.debug_incident_trigger_email", "sentry.web.frontend.debug.debug_mfa_added_email", "sentry.web.frontend.debug.debug_mfa_removed_email", "sentry.web.frontend.debug.debug_new_processing_issues_email", "sentry.web.frontend.debug.debug_organization_integration_request", "sentry.web.frontend.debug.debug_organization_invite_request", "sentry.web.frontend.debug.debug_organization_join_request", "sentry.web.frontend.disabled_member_view", "sentry.web.frontend.generic", "sentry.web.frontend.group_plugin_action", "sentry.web.frontend.idp_email_verification", "sentry.web.frontend.integration_extension_configuration", "sentry.web.frontend.js_sdk_loader", "sentry.web.frontend.newest_issue", "sentry.web.frontend.oauth_authorize", "sentry.web.frontend.oauth_token", "sentry.web.frontend.organization_integration_setup", "sentry.web.frontend.pipeline_advancer", "sentry.web.frontend.project_event", "sentry.web.frontend.react_page", "sentry.web.frontend.reactivate_account", "sentry.web.frontend.setup_wizard", "sentry.web.frontend.shared_group_details", "sentry.web.frontend.twofactor", "sentry_plugins.bitbucket.client", "sentry_plugins.bitbucket.endpoints.webhook", "sentry_plugins.bitbucket.mixins", "sentry_plugins.client", "sentry_plugins.github.client", "sentry_plugins.github.plugin", "sentry_plugins.github.webhooks.base", "sentry_plugins.github.webhooks.integration", "sentry_plugins.heroku.plugin", "sentry_plugins.jira.client", "sentry_plugins.jira.plugin", "sentry_plugins.pivotal.plugin", "sentry_plugins.redmine.forms", "sentry_plugins.redmine.plugin", "sentry_plugins.splunk.plugin", "sentry_plugins.trello.plugin", "sentry_plugins.twilio.plugin", "tests.sentry.api.bases.test_organization", "tests.sentry.api.bases.test_project", "tests.sentry.api.bases.test_sentryapps", "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.digests.test_notifications", "tests.sentry.eventstore.test_base", "tests.sentry.grouping.test_result", "tests.sentry.identity.test_oauth2", "tests.sentry.incidents.test_logic", "tests.sentry.ingest.test_slicing", "tests.sentry.integrations.github.test_client", "tests.sentry.integrations.slack.test_requests", "tests.sentry.issues.test_utils", "tests.sentry.models.test_organizationmember", "tests.sentry.replays.test_project_replay_recording_segment_index", "tests.sentry.tasks.test_post_process", ] disable_error_code = [ "arg-type", "assignment", "attr-defined", "call-arg", "call-overload", "dict-item", "has-type", "index", "list-item", "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.issues.*", "sentry.buffer.base", "sentry.buffer.redis", "sentry.eventstore.reprocessing.redis", "sentry.issues.related.*", "sentry.lang.java.processing", "sentry.nodestore.base", "sentry.nodestore.bigtable.backend", "sentry.nodestore.django.backend", "sentry.nodestore.django.models", "sentry.nodestore.filesystem.backend", "sentry.nodestore.models", "sentry.relay.config.metric_extraction", "sentry.reprocessing2", "sentry.runner.*", "sentry.snuba.metrics.extraction", "sentry.tasks.on_demand_metrics", "sentry.tasks.reprocessing2", "sentry.utils.locking.backends.redis", "sentry.utils.redis", "sentry.utils.redis_metrics", "sentry_plugins.base", "tests.sentry.api.endpoints.issues.*", "tests.sentry.relay.config.test_metric_extraction", "tests.sentry.tasks.test_on_demand_metrics", "tools.*", ] disallow_any_generics = true disallow_untyped_defs = true # end: stronger typing