Skip to content

Commit f5f8ad7

Browse files
authored
Merge pull request #1922 from elementary-data/ele-4484-parse-message-context-in-integration
added message context parsing
2 parents 52fb0d1 + 8d1aede commit f5f8ad7

File tree

7 files changed

+32
-6
lines changed

7 files changed

+32
-6
lines changed

elementary/messages/messaging_integrations/base_messaging_integration.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from abc import ABC, abstractmethod
22
from datetime import datetime
3-
from typing import Generic, Optional, TypeVar
3+
from typing import Any, Generic, Optional, TypeVar
44

55
from pydantic import BaseModel
66

@@ -27,6 +27,10 @@ class MessageSendResult(BaseModel, Generic[T]):
2727

2828

2929
class BaseMessagingIntegration(ABC, Generic[DestinationType, MessageContextType]):
30+
@abstractmethod
31+
def parse_message_context(self, context: dict[str, Any]) -> MessageContextType:
32+
raise NotImplementedError
33+
3034
@abstractmethod
3135
def send_message(
3236
self,

elementary/messages/messaging_integrations/file_system.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import json
22
from datetime import datetime
33
from pathlib import Path
4+
from typing import Any
45

56
from elementary.messages.message_body import MessageBody
67
from elementary.messages.messaging_integrations.base_messaging_integration import (
@@ -36,6 +37,9 @@ def __init__(self, directory: str, create_if_missing: bool = True) -> None:
3637
f"Directory {self.directory} does not exist and create_if_missing is False"
3738
)
3839

40+
def parse_message_context(self, context: dict[str, Any]) -> EmptyMessageContext:
41+
return EmptyMessageContext(**context)
42+
3943
def supports_reply(self) -> bool:
4044
return False
4145

elementary/messages/messaging_integrations/mapped.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import Generic, Mapping
1+
from typing import Any, Generic, Mapping
22

33
from elementary.messages.message_body import MessageBody
44
from elementary.messages.messaging_integrations.base_messaging_integration import (
@@ -18,8 +18,14 @@ class MappedMessagingIntegration(
1818
def __init__(
1919
self, mapping: Mapping[str, BaseMessagingIntegration[None, MessageContextType]]
2020
):
21+
if len(mapping) == 0:
22+
raise MessagingIntegrationError("Mapping cannot be empty")
2123
self._mapping = mapping
2224

25+
def parse_message_context(self, context: dict[str, Any]) -> MessageContextType:
26+
sample_integration = next(iter(self._mapping.values()))
27+
return sample_integration.parse_message_context(context)
28+
2329
def send_message(
2430
self, destination: str, body: MessageBody
2531
) -> MessageSendResult[MessageContextType]:

elementary/messages/messaging_integrations/slack_web.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import json
2-
from typing import Dict, Iterator, Optional
2+
from typing import Any, Dict, Iterator, Optional
33

44
from pydantic import BaseModel
55
from ratelimit import limits, sleep_and_retry
@@ -53,6 +53,9 @@ def from_token(
5353
client.retry_handlers.append(RateLimitErrorRetryHandler(max_retry_count=5))
5454
return cls(client, tracking)
5555

56+
def parse_message_context(self, context: dict[str, Any]) -> SlackWebMessageContext:
57+
return SlackWebMessageContext(**context)
58+
5659
def supports_reply(self) -> bool:
5760
return True
5861

elementary/messages/messaging_integrations/slack_webhook.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from datetime import datetime
22
from http import HTTPStatus
3-
from typing import Optional
3+
from typing import Any, Optional
44

55
from ratelimit import limits, sleep_and_retry
66
from slack_sdk import WebhookClient
@@ -43,6 +43,9 @@ def from_url(
4343
client.retry_handlers.append(RateLimitErrorRetryHandler(max_retry_count=5))
4444
return cls(client, tracking)
4545

46+
def parse_message_context(self, context: dict[str, Any]) -> EmptyMessageContext:
47+
return EmptyMessageContext(**context)
48+
4649
@sleep_and_retry
4750
@limits(calls=1, period=ONE_SECOND)
4851
def _send_message(self, formatted_message: FormattedBlockKitMessage) -> None:

elementary/messages/messaging_integrations/teams_webhook.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from datetime import datetime
2-
from typing import Optional
2+
from typing import Any, Optional
33

44
import requests
55
from typing_extensions import TypeAlias
@@ -53,6 +53,9 @@ class TeamsWebhookMessagingIntegration(
5353
def __init__(self, url: str) -> None:
5454
self.url = url
5555

56+
def parse_message_context(self, context: dict[str, Any]) -> EmptyMessageContext:
57+
return EmptyMessageContext(**context)
58+
5659
def send_message(
5760
self,
5861
destination: None,

tests/unit/messages/messaging_integrations/test_mapped.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from datetime import datetime
2-
from typing import Dict, List
2+
from typing import Any, Dict, List
33
from unittest.mock import MagicMock
44

55
import pytest
@@ -38,6 +38,9 @@ def __init__(self, supports_reply: bool = True, supports_actions: bool = False):
3838
message_context=MockMessageContext(id="test_id"),
3939
)
4040

41+
def parse_message_context(self, context: dict[str, Any]) -> MockMessageContext:
42+
return MockMessageContext(**context)
43+
4144
def send_message(
4245
self, destination: None, body: MessageBody
4346
) -> MessageSendResult[MockMessageContext]:

0 commit comments

Comments
 (0)