Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ref(integrations): Remove indirect imports from messaging integrations #77094

Merged
merged 13 commits into from
Sep 19, 2024
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions src/sentry/conf/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -2489,7 +2489,7 @@ def custom_parameter_sort(parameter: dict) -> tuple[str, int]:
SENTRY_DEFAULT_INTEGRATIONS = (
"sentry.integrations.bitbucket.BitbucketIntegrationProvider",
"sentry.integrations.bitbucket_server.BitbucketServerIntegrationProvider",
"sentry.integrations.slack.SlackIntegrationProvider",
"sentry.integrations.slack.integration.SlackIntegrationProvider",
"sentry.integrations.github.GitHubIntegrationProvider",
"sentry.integrations.github_enterprise.GitHubEnterpriseIntegrationProvider",
"sentry.integrations.gitlab.GitlabIntegrationProvider",
Expand All @@ -2499,9 +2499,9 @@ def custom_parameter_sort(parameter: dict) -> tuple[str, int]:
"sentry.integrations.vsts_extension.VstsExtensionIntegrationProvider",
"sentry.integrations.pagerduty.integration.PagerDutyIntegrationProvider",
"sentry.integrations.vercel.VercelIntegrationProvider",
"sentry.integrations.msteams.MsTeamsIntegrationProvider",
"sentry.integrations.msteams.integration.MsTeamsIntegrationProvider",
"sentry.integrations.aws_lambda.AwsLambdaIntegrationProvider",
"sentry.integrations.discord.DiscordIntegrationProvider",
"sentry.integrations.discord.integration.DiscordIntegrationProvider",
"sentry.integrations.opsgenie.OpsgenieIntegrationProvider",
)

Expand Down
10 changes: 0 additions & 10 deletions src/sentry/integrations/discord/__init__.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,3 @@
from sentry.integrations.discord.spec import DiscordMessagingSpec

from .actions import * # noqa: F401,F403
from .analytics import * # noqa: F401,F403
from .client import * # noqa: F401,F403
from .integration import * # noqa: F401,F403
from .message_builder.base import * # noqa: F401,F403
from .message_builder.issues import * # noqa: F401,F403
from .urls import * # noqa: F401,F403
from .utils import * # noqa: F401,F403
from .views import * # noqa: F401,F403

DiscordMessagingSpec().initialize()
3 changes: 0 additions & 3 deletions src/sentry/integrations/discord/actions/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +0,0 @@
from .issue_alert.form import * # noqa: F401, F403
from .issue_alert.notification import * # noqa: F401, F403
from .metric_alert import * # noqa: F401, F403
20 changes: 0 additions & 20 deletions src/sentry/integrations/discord/message_builder/__init__.py
Original file line number Diff line number Diff line change
@@ -1,20 +0,0 @@
from __future__ import annotations

# Discord likes colors as decimal integers
LEVEL_TO_COLOR = {
"_actioned_issue": int("0xEDEEEF", 16),
"_incident_resolved": int("0x4DC771", 16),
"debug": int("0xFBE14F", 16),
"error": int("0xE03E2F", 16),
"fatal": int("0xFA4747", 16),
"info": int("0x2788CE", 16),
"warning": int("0xFFC227", 16),
}

INCIDENT_COLOR_MAPPING = {
"Resolved": "_incident_resolved",
"Warning": "warning",
"Critical": "fatal",
}

DISCORD_URL_FORMAT = "[{text}]({url})"
20 changes: 20 additions & 0 deletions src/sentry/integrations/discord/message_builder/constants.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from __future__ import annotations

# Discord likes colors as decimal integers
LEVEL_TO_COLOR = {
"_actioned_issue": int("0xEDEEEF", 16),
"_incident_resolved": int("0x4DC771", 16),
"debug": int("0xFBE14F", 16),
"error": int("0xE03E2F", 16),
"fatal": int("0xFA4747", 16),
"info": int("0x2788CE", 16),
"warning": int("0xFFC227", 16),
}

INCIDENT_COLOR_MAPPING = {
"Resolved": "_incident_resolved",
"Warning": "warning",
"Critical": "fatal",
}

DISCORD_URL_FORMAT = "[{text}]({url})"
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

from sentry import tagstore
from sentry.eventstore.models import GroupEvent
from sentry.integrations.discord.message_builder import LEVEL_TO_COLOR
from sentry.integrations.discord.message_builder.base.base import DiscordMessageBuilder
from sentry.integrations.discord.message_builder.base.component.action_row import DiscordActionRow
from sentry.integrations.discord.message_builder.base.component.base import DiscordMessageComponent
from sentry.integrations.discord.message_builder.base.component.button import DiscordButton
from sentry.integrations.discord.message_builder.base.embed.base import DiscordMessageEmbed
from sentry.integrations.discord.message_builder.base.embed.field import DiscordMessageEmbedField
from sentry.integrations.discord.message_builder.base.embed.footer import DiscordMessageEmbedFooter
from sentry.integrations.discord.message_builder.constants import LEVEL_TO_COLOR
from sentry.integrations.messaging.message_builder import (
build_attachment_text,
build_attachment_title,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,13 @@

from sentry.incidents.models.alert_rule import AlertRule
from sentry.incidents.models.incident import Incident, IncidentStatus
from sentry.integrations.discord.message_builder import INCIDENT_COLOR_MAPPING, LEVEL_TO_COLOR
from sentry.integrations.discord.message_builder.base.base import DiscordMessageBuilder
from sentry.integrations.discord.message_builder.base.embed.base import DiscordMessageEmbed
from sentry.integrations.discord.message_builder.base.embed.image import DiscordMessageEmbedImage
from sentry.integrations.discord.message_builder.constants import (
INCIDENT_COLOR_MAPPING,
LEVEL_TO_COLOR,
)
from sentry.integrations.metric_alerts import metric_alert_attachment_info


Expand Down
18 changes: 0 additions & 18 deletions src/sentry/integrations/msteams/__init__.py
Original file line number Diff line number Diff line change
@@ -1,21 +1,3 @@
from sentry.integrations.msteams.spec import MsTeamsMessagingSpec

from .actions.form import * # noqa: F401,F403
from .actions.notification import * # noqa: F401,F403
from .analytics import * # noqa: F401,F403
from .card_builder.base import * # noqa: F401,F403
from .card_builder.block import * # noqa: F401,F403
from .card_builder.help import * # noqa: F401,F403
from .card_builder.identity import * # noqa: F401,F403
from .card_builder.installation import * # noqa: F401,F403
from .card_builder.notifications import * # noqa: F401,F403
from .client import * # noqa: F401,F403
from .integration import * # noqa: F401,F403
from .link_identity import * # noqa: F401,F403
from .notifications import * # noqa: F401,F403
from .unlink_identity import * # noqa: F401,F403
from .urls import * # noqa: F401,F403
from .utils import * # noqa: F401,F403
from .webhook import * # noqa: F401,F403

MsTeamsMessagingSpec().initialize()
7 changes: 0 additions & 7 deletions src/sentry/integrations/msteams/actions/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +0,0 @@
from .form import MsTeamsNotifyServiceForm
from .notification import MsTeamsNotifyServiceAction

__all__ = (
"MsTeamsNotifyServiceForm",
"MsTeamsNotifyServiceAction",
)
4 changes: 0 additions & 4 deletions src/sentry/integrations/msteams/card_builder/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +0,0 @@
from __future__ import annotations

ME = "ME"
MSTEAMS_URL_FORMAT = "[{text}]({url})"
3 changes: 3 additions & 0 deletions src/sentry/integrations/msteams/card_builder/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@
create_text_block,
)

ME = "ME"
MSTEAMS_URL_FORMAT = "[{text}]({url})"


class MSTeamsMessageBuilder:
def build(
Expand Down
26 changes: 13 additions & 13 deletions src/sentry/integrations/msteams/card_builder/issues.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,28 +13,22 @@
format_actor_option_non_slack,
format_actor_options_non_slack,
)
from sentry.integrations.msteams.card_builder import ME, MSTEAMS_URL_FORMAT
from sentry.integrations.msteams.card_builder.base import (
ME,
MSTEAMS_URL_FORMAT,
MSTeamsMessageBuilder,
)
from sentry.integrations.msteams.card_builder.block import (
Action,
ActionType,
AdaptiveCard,
Block,
ColumnSetBlock,
ContainerBlock,
ContentAlignment,
ShowCardAction,
SubmitAction,
TextBlock,
)
from sentry.integrations.msteams.card_builder.utils import IssueConstants
from sentry.integrations.services.integration import RpcIntegration
from sentry.models.group import Group, GroupStatus
from sentry.models.project import Project
from sentry.models.rule import Rule

from ..utils import ACTION_TYPE
from .base import MSTeamsMessageBuilder
from .block import (
ActionType,
ContentAlignment,
TextSize,
TextWeight,
create_action_set_block,
Expand All @@ -47,6 +41,12 @@
create_input_choice_set_block,
create_text_block,
)
from sentry.integrations.msteams.card_builder.utils import IssueConstants
from sentry.integrations.msteams.utils import ACTION_TYPE
from sentry.integrations.services.integration import RpcIntegration
from sentry.models.group import Group, GroupStatus
from sentry.models.project import Project
from sentry.models.rule import Rule

logger = logging.getLogger(__name__)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@
build_attachment_title,
get_title_link,
)
from sentry.integrations.msteams.card_builder import MSTEAMS_URL_FORMAT
from sentry.integrations.msteams.card_builder.base import MSTeamsMessageBuilder
from sentry.integrations.msteams.card_builder.base import MSTEAMS_URL_FORMAT, MSTeamsMessageBuilder
from sentry.integrations.msteams.card_builder.block import OpenUrlAction
from sentry.integrations.types import ExternalProviders
from sentry.notifications.notifications.activity.base import GroupActivityNotification
Expand Down
2 changes: 1 addition & 1 deletion src/sentry/integrations/msteams/spec.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ def action_service(self) -> ActionService:

@property
def integration_provider(self) -> type[IntegrationProvider]:
from sentry.integrations.msteams import MsTeamsIntegrationProvider
from sentry.integrations.msteams.integration import MsTeamsIntegrationProvider

return MsTeamsIntegrationProvider

Expand Down
2 changes: 1 addition & 1 deletion src/sentry/integrations/services/integration/impl.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
from sentry.integrations.models.integration import Integration
from sentry.integrations.models.integration_external_project import IntegrationExternalProject
from sentry.integrations.models.organization_integration import OrganizationIntegration
from sentry.integrations.msteams import MsTeamsClient
from sentry.integrations.msteams.client import MsTeamsClient
from sentry.integrations.services.integration import (
IntegrationService,
RpcIntegration,
Expand Down
40 changes: 0 additions & 40 deletions src/sentry/integrations/slack/__init__.py
Original file line number Diff line number Diff line change
@@ -1,43 +1,3 @@
from sentry.integrations.slack.spec import SlackMessagingSpec

from .actions.form import * # noqa: F401,F403
from .actions.notification import * # noqa: F401,F403
from .analytics import * # noqa: F401,F403
from .integration import * # noqa: F401,F403
from .message_builder.base.base import * # noqa: F401,F403
from .message_builder.base.block import * # noqa: F401,F403
from .message_builder.disconnected import * # noqa: F401,F403
from .message_builder.discover import * # noqa: F401,F403
from .message_builder.help import * # noqa: F401,F403
from .message_builder.incidents import * # noqa: F401,F403
from .message_builder.issues import * # noqa: F401,F403
from .message_builder.metric_alerts import * # noqa: F401,F403
from .message_builder.notifications.base import * # noqa: F401,F403
from .message_builder.notifications.digest import * # noqa: F401,F403
from .message_builder.notifications.issues import * # noqa: F401,F403
from .message_builder.prompt import * # noqa: F401,F403
from .notifications import * # noqa: F401,F403
from .requests.action import * # noqa: F401,F403
from .requests.base import * # noqa: F401,F403
from .requests.command import * # noqa: F401,F403
from .requests.event import * # noqa: F401,F403
from .unfurl.discover import * # noqa: F401,F403
from .unfurl.issues import * # noqa: F401,F403
from .unfurl.metric_alerts import * # noqa: F401,F403
from .urls import * # noqa: F401,F403
from .utils.auth import * # noqa: F401,F403
from .utils.channel import * # noqa: F401,F403
from .utils.escape import * # noqa: F401,F403
from .utils.notifications import * # noqa: F401,F403
from .utils.rule_status import * # noqa: F401,F403
from .utils.users import * # noqa: F401,F403
from .views.link_identity import * # noqa: F401,F403
from .views.link_team import * # noqa: F401,F403
from .views.unlink_identity import * # noqa: F401,F403
from .views.unlink_team import * # noqa: F401,F403
from .webhooks.action import * # noqa: F401,F403
from .webhooks.base import * # noqa: F401,F403
from .webhooks.command import * # noqa: F401,F403
from .webhooks.event import * # noqa: F401,F403

SlackMessagingSpec().initialize()
7 changes: 0 additions & 7 deletions src/sentry/integrations/slack/actions/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +0,0 @@
from .form import SlackNotifyServiceForm
from .notification import SlackNotifyServiceAction

__all__ = (
"SlackNotifyServiceForm",
"SlackNotifyServiceAction",
)
Original file line number Diff line number Diff line change
@@ -1,25 +0,0 @@
from __future__ import annotations

from .base import SlackNotificationsMessageBuilder
from .daily_summary import SlackDailySummaryMessageBuilder
from .digest import DigestNotificationMessageBuilder
from .issues import IssueNotificationMessageBuilder


def get_message_builder(class_name: str) -> type[SlackNotificationsMessageBuilder]:
"""TODO(mgaeta): HACK to get around circular imports."""
return {
"DigestNotificationMessageBuilder": DigestNotificationMessageBuilder,
"IssueNotificationMessageBuilder": IssueNotificationMessageBuilder,
"SlackNotificationsMessageBuilder": SlackNotificationsMessageBuilder,
"SlackDailySummaryMessageBuilder": SlackDailySummaryMessageBuilder,
}[class_name]


__all__ = (
"get_message_builder",
"DigestNotificationMessageBuilder",
"IssueNotificationMessageBuilder",
"SlackNotificationsMessageBuilder",
"SlackDailySummaryMessageBuilder",
)
3 changes: 0 additions & 3 deletions src/sentry/integrations/slack/requests/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +0,0 @@
__all__ = ("SlackRequest", "SlackRequestError")

from .base import SlackRequest, SlackRequestError
25 changes: 23 additions & 2 deletions src/sentry/integrations/slack/service.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@
IssueAlertNotificationMessageRepository,
)
from sentry.integrations.slack.message_builder.base.block import BlockSlackMessageBuilder
from sentry.integrations.slack.message_builder.notifications import get_message_builder
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we should audit if we even need this service

from sentry.integrations.slack.message_builder.notifications.base import (
SlackNotificationsMessageBuilder,
)
from sentry.integrations.slack.message_builder.types import SlackBlock
from sentry.integrations.slack.metrics import (
SLACK_ACTIVITY_THREAD_FAILURE_DATADOG_METRIC,
Expand Down Expand Up @@ -413,10 +415,29 @@ def get_attachments(
extra_context_by_actor[recipient] if extra_context_by_actor and recipient else {}
)
context = get_context(notification, recipient, shared_context, extra_context)
cls = get_message_builder(notification.message_builder)
cls = self._get_message_builder(notification.message_builder)
attachments = cls(notification, context, recipient).build()
return attachments

@staticmethod
def _get_message_builder(class_name: str) -> type[SlackNotificationsMessageBuilder]:
from sentry.integrations.slack.message_builder.notifications.daily_summary import (
SlackDailySummaryMessageBuilder,
)
from sentry.integrations.slack.message_builder.notifications.digest import (
DigestNotificationMessageBuilder,
)
from sentry.integrations.slack.message_builder.notifications.issues import (
IssueNotificationMessageBuilder,
)

return {
"DigestNotificationMessageBuilder": DigestNotificationMessageBuilder,
"IssueNotificationMessageBuilder": IssueNotificationMessageBuilder,
"SlackNotificationsMessageBuilder": SlackNotificationsMessageBuilder,
"SlackDailySummaryMessageBuilder": SlackDailySummaryMessageBuilder,
}[class_name]

def send_message_to_slack_channel(
self,
integration_id: int,
Expand Down
14 changes: 0 additions & 14 deletions src/sentry/integrations/slack/tasks/__init__.py
Original file line number Diff line number Diff line change
@@ -1,14 +0,0 @@
from .find_channel_id_for_alert_rule import find_channel_id_for_alert_rule
from .find_channel_id_for_rule import find_channel_id_for_rule
from .link_slack_user_identities import link_slack_user_identities
from .post_message import post_message, post_message_control
from .send_notifications_on_activity import send_activity_notifications_to_slack_threads

__all__ = (
"send_activity_notifications_to_slack_threads",
"find_channel_id_for_alert_rule",
"find_channel_id_for_rule",
"link_slack_user_identities",
"post_message",
"post_message_control",
)
Loading
Loading