clear-skies-aws 1.9.4__py3-none-any.whl → 1.9.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: clear-skies-aws
3
- Version: 1.9.4
3
+ Version: 1.9.6
4
4
  Summary: clearskies bindings for working in AWS
5
5
  Home-page: https://github.com/cmancone/clearskies-aws
6
6
  License: MIT
@@ -1,5 +1,5 @@
1
1
  clearskies_aws/__init__.py,sha256=BZKL4SIyxx4MXpyP5hmwsMo2oJatyv5c2wjJOPzKBQ4,134
2
- clearskies_aws/actions/__init__.py,sha256=QEKR3TKEp7NWqhfz0g19Dv2v8KTTVewKi_3zeX_WyqI,2865
2
+ clearskies_aws/actions/__init__.py,sha256=w_IWJg4UHV9Opv69zheH7ZHj1BnCzYLlm2JhFvHQCf8,2998
3
3
  clearskies_aws/actions/action_aws.py,sha256=hWYnYA0QNegWp2LDMYILs0Dk1TOsFykW5JgSEMwfDE8,3877
4
4
  clearskies_aws/actions/assume_role.py,sha256=tZHKMTQaImj_EAWormFZdIPkR_db7yBwOJxYaUyuGdA,4085
5
5
  clearskies_aws/actions/assume_role_test.py,sha256=MDMGePZLVyDNTjdAlGBDJzBlfMpGIpA3Q1Ur0qEPl1w,2450
@@ -7,8 +7,8 @@ clearskies_aws/actions/ses.py,sha256=iSo-dtQoreqOCveGpDAKWkbaa0gZx1xTymHYqlvL7hk
7
7
  clearskies_aws/actions/ses_test.py,sha256=lyNbqI46Ld_ZUKtWLgSwwfSOFksQ39H4hzPS3eTx7nk,3076
8
8
  clearskies_aws/actions/sns.py,sha256=m9LEoogTGGPr-u8oj39PIiOd9rkoF340nFbWefXJREA,2197
9
9
  clearskies_aws/actions/sns_test.py,sha256=iqlaZOA-0YHPOu52-XqpCIAgAv1JZodDdlm4YYYhj8U,2306
10
- clearskies_aws/actions/sqs.py,sha256=UZykBoi83EzzlqaPVdobZ8D_JRYqPFCwrCjWqg0ACzk,2340
11
- clearskies_aws/actions/sqs_test.py,sha256=Gsz1TxZDMlas6KS_splfs8cM75WeN5OKJeiddFHsARA,2346
10
+ clearskies_aws/actions/sqs.py,sha256=3aY9plfYH8P6IkKS39C3t9q4ZIxIlNYsqtPgjdiywYQ,3338
11
+ clearskies_aws/actions/sqs_test.py,sha256=aazVN-bY6E17Pu3hDwLldj6YPirbqXjM6LfYFomUVmQ,4040
12
12
  clearskies_aws/actions/step_function.py,sha256=0Sz1CVVeKJi3IohtLnnNmhAbuxR7Gl9ic56ml0K3Qmg,2363
13
13
  clearskies_aws/actions/step_function_test.py,sha256=3xrNYFQ8fCe3CqPEnVnJsE0rIUlnnFez4rfPzphYVUU,2742
14
14
  clearskies_aws/backends/__init__.py,sha256=kS6pmMKZuWzBefO7qQu1fkFdcXo180t76-a-pPc1YX8,83
@@ -61,7 +61,7 @@ clearskies_aws/secrets/parameter_store_test.py,sha256=UyqKE4AZYlldj9ww5f0fR15qsV
61
61
  clearskies_aws/secrets/secrets_manager.py,sha256=jlpfAFC23EeSpm50L8B-yrXg4IROQq-M_90zzXDp_ak,3056
62
62
  clearskies_aws/secrets/secrets_manager_test.py,sha256=mlNWtDm1wWS5C8aV0vJAzZVZB82KFR6NGRAPEkLtTyk,786
63
63
  clearskies_aws/web_socket_connection_model.py,sha256=d_Au_Pu7YXBfc7_lbuI7zz4MZ8ZOOwGM0oooppEofcI,1776
64
- clear_skies_aws-1.9.4.dist-info/LICENSE,sha256=3Ehd0g3YOpCj8sqj0Xjq5qbOtjjgk9qzhhD9YjRQgOA,1053
65
- clear_skies_aws-1.9.4.dist-info/METADATA,sha256=jl5h5-AsvmXaQo6rwOA2yYsshSDdH8NQXw2l9VuqMqk,8480
66
- clear_skies_aws-1.9.4.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
67
- clear_skies_aws-1.9.4.dist-info/RECORD,,
64
+ clear_skies_aws-1.9.6.dist-info/LICENSE,sha256=3Ehd0g3YOpCj8sqj0Xjq5qbOtjjgk9qzhhD9YjRQgOA,1053
65
+ clear_skies_aws-1.9.6.dist-info/METADATA,sha256=9mOuyI9iqb6pIqU6K_3vg_wXNVxu63pkG6tsbnfZrcw,8480
66
+ clear_skies_aws-1.9.6.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
67
+ clear_skies_aws-1.9.6.dist-info/RECORD,,
@@ -1,6 +1,6 @@
1
1
  import clearskies
2
2
 
3
- from typing import Optional, Callable
3
+ from typing import Optional, Callable, Union
4
4
 
5
5
  from .assume_role import AssumeRole
6
6
  from .ses import SES
@@ -57,9 +57,10 @@ def sqs(
57
57
  queue_url: str = '',
58
58
  queue_url_environment_key: str = '',
59
59
  queue_url_callable: Callable = '',
60
- message_callable=None,
61
- when=None,
60
+ message_callable: Callable = None,
61
+ when: Callable = None,
62
62
  assume_role=None,
63
+ message_group_id: Optional[Union[Callable, str]]=None,
63
64
  ):
64
65
  return clearskies.BindingConfig(
65
66
  SQS,
@@ -69,6 +70,7 @@ def sqs(
69
70
  message_callable=message_callable,
70
71
  when=when,
71
72
  assume_role=assume_role,
73
+ message_group_id=message_group_id,
72
74
  )
73
75
  def step_function(
74
76
  arn: str = "",
@@ -8,7 +8,7 @@ from clearskies.model import Model
8
8
  from collections.abc import Sequence
9
9
  from collections import OrderedDict
10
10
  from types import ModuleType
11
- from typing import List, Optional, Callable
11
+ from typing import List, Optional, Callable, Union
12
12
 
13
13
  from ..di import StandardDependencies
14
14
  from . import assume_role
@@ -28,12 +28,14 @@ class SQS(ActionAws):
28
28
  message_callable: Optional[Callable] = None,
29
29
  when: Optional[Callable] = None,
30
30
  assume_role: Optional[assume_role.AssumeRole] = None,
31
+ message_group_id: Optional[Union[str, Callable]] = None,
31
32
  ) -> None:
32
33
  super().configure(message_callable=message_callable, when=when, assume_role=assume_role)
33
34
 
34
35
  self.queue_url = queue_url
35
36
  self.queue_url_environment_key = queue_url_environment_key
36
37
  self.queue_url_callable = queue_url_callable
38
+ self.message_group_id = message_group_id
37
39
 
38
40
  queue_urls = 0
39
41
  for value in [queue_url, queue_url_environment_key, queue_url_callable]:
@@ -47,13 +49,28 @@ class SQS(ActionAws):
47
49
  raise ValueError(
48
50
  "You must provide at least one of 'queue_url', 'queue_url_environment_key', or 'queue_url_callable'."
49
51
  )
52
+ if message_group_id and not callable(message_group_id) and not isinstance(message_group_id, str):
53
+ raise ValueError(
54
+ "If provided, 'message_group_id' must be a string or callable, but the provided value was neither."
55
+ )
50
56
 
51
57
  def _execute_action(self, client: ModuleType, model: Model) -> None:
52
58
  """Send a notification as configured."""
53
- client.send_message(
54
- QueueUrl=self.get_queue_url(model),
55
- MessageBody=self.get_message_body(model),
56
- )
59
+ params = {
60
+ "QueueUrl": self.get_queue_url(model),
61
+ "MessageBody": self.get_message_body(model),
62
+ }
63
+
64
+ if self.message_group_id:
65
+ if callable(self.message_group_id):
66
+ message_group_id = self.di.call_function(self.message_group_id, model=model)
67
+ if not isinstance(message_group_id, str):
68
+ raise ValueError(f"I called the message_group_id function for SQS for model '{model.__class__.__name__}' but the value it returned was not a string. The message group id must be a string.")
69
+ else:
70
+ message_group_id = self.message_group_id
71
+ params["MessageGroupId"] = message_group_id
72
+
73
+ client.send_message(**params)
57
74
 
58
75
  def get_queue_url(self, model: Model):
59
76
  if self.queue_url:
@@ -59,6 +59,58 @@ class SQSTest(unittest.TestCase):
59
59
  ])
60
60
  self.assertEqual(id(user), id(self.when))
61
61
 
62
+ def test_send_message_group_id(self):
63
+ sqs = SQS(self.environment, self.boto3, self.di)
64
+ sqs.configure(
65
+ queue_url='https://queue.example.com',
66
+ when=self.always,
67
+ message_group_id='heysup',
68
+ )
69
+ user = self.users.model({
70
+ "id": "1-2-3-4",
71
+ "name": "Jane",
72
+ "email": "jane@example.com",
73
+ })
74
+ sqs(user)
75
+ self.sqs.send_message.assert_has_calls([
76
+ call(
77
+ QueueUrl='https://queue.example.com',
78
+ MessageGroupId='heysup',
79
+ MessageBody=json.dumps({
80
+ "id": "1-2-3-4",
81
+ "name": "Jane",
82
+ "email": "jane@example.com",
83
+ }),
84
+ ),
85
+ ])
86
+ self.assertEqual(id(user), id(self.when))
87
+
88
+ def test_send_message_group_id_callable(self):
89
+ sqs = SQS(self.environment, self.boto3, self.di)
90
+ sqs.configure(
91
+ queue_url='https://queue.example.com',
92
+ when=self.always,
93
+ message_group_id=lambda model: model.id,
94
+ )
95
+ user = self.users.model({
96
+ "id": "1-2-3-4",
97
+ "name": "Jane",
98
+ "email": "jane@example.com",
99
+ })
100
+ sqs(user)
101
+ self.sqs.send_message.assert_has_calls([
102
+ call(
103
+ QueueUrl='https://queue.example.com',
104
+ MessageGroupId='1-2-3-4',
105
+ MessageBody=json.dumps({
106
+ "id": "1-2-3-4",
107
+ "name": "Jane",
108
+ "email": "jane@example.com",
109
+ }),
110
+ ),
111
+ ])
112
+ self.assertEqual(id(user), id(self.when))
113
+
62
114
  def test_not_now(self):
63
115
  sqs = SQS(self.environment, self.boto3, self.di)
64
116
  sqs.configure(