clear-skies-aws 1.9.18__tar.gz → 1.10.0__tar.gz

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.
Files changed (73) hide show
  1. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/PKG-INFO +5 -1
  2. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/pyproject.toml +8 -5
  3. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/actions/assume_role_test.py +5 -2
  4. clear_skies_aws-1.10.0/src/clearskies_aws/backends/__init__.py +12 -0
  5. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/backends/dynamo_db_backend.py +10 -7
  6. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/backends/dynamo_db_backend_test.py +71 -65
  7. clear_skies_aws-1.10.0/src/clearskies_aws/backends/dynamo_db_condition_parser.py +365 -0
  8. clear_skies_aws-1.10.0/src/clearskies_aws/backends/dynamo_db_condition_parser_test.py +266 -0
  9. clear_skies_aws-1.10.0/src/clearskies_aws/backends/dynamo_db_parti_ql_backend.py +1000 -0
  10. clear_skies_aws-1.10.0/src/clearskies_aws/backends/dynamo_db_parti_ql_backend_test.py +540 -0
  11. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/contexts/lambda_sqs_standard_partial_batch_test.py +11 -16
  12. clear_skies_aws-1.10.0/src/clearskies_aws/di/standard_dependencies.py +60 -0
  13. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/input_outputs/lambda_api_gateway_test.py +27 -19
  14. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/secrets/parameter_store_test.py +5 -2
  15. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/secrets/secrets_manager_test.py +5 -2
  16. clear_skies_aws-1.9.18/src/clearskies_aws/backends/__init__.py +0 -2
  17. clear_skies_aws-1.9.18/src/clearskies_aws/di/standard_dependencies.py +0 -18
  18. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/LICENSE +0 -0
  19. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/README.md +0 -0
  20. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/__init__.py +0 -0
  21. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/actions/__init__.py +0 -0
  22. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/actions/action_aws.py +0 -0
  23. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/actions/assume_role.py +0 -0
  24. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/actions/ses.py +0 -0
  25. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/actions/ses_test.py +0 -0
  26. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/actions/sns.py +0 -0
  27. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/actions/sns_test.py +0 -0
  28. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/actions/sqs.py +0 -0
  29. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/actions/sqs_test.py +0 -0
  30. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/actions/step_function.py +0 -0
  31. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/actions/step_function_test.py +0 -0
  32. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/backends/sqs_backend.py +0 -0
  33. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/backends/sqs_backend_test.py +0 -0
  34. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/contexts/__init__.py +0 -0
  35. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/contexts/cli.py +0 -0
  36. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/contexts/cli_websocket_mock.py +0 -0
  37. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/contexts/lambda_api_gateway.py +0 -0
  38. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/contexts/lambda_api_gateway_web_socket.py +0 -0
  39. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/contexts/lambda_elb.py +0 -0
  40. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/contexts/lambda_http_gateway.py +0 -0
  41. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/contexts/lambda_invocation.py +0 -0
  42. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/contexts/lambda_sns.py +0 -0
  43. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/contexts/lambda_sqs_standard_partial_batch.py +0 -0
  44. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/contexts/wsgi.py +0 -0
  45. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/di/__init__.py +0 -0
  46. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/handlers/__init__.py +0 -0
  47. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/handlers/secrets_manager_rotation.py +0 -0
  48. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/handlers/simple_body_routing.py +0 -0
  49. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/input_outputs/__init__.py +0 -0
  50. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/input_outputs/cli_websocket_mock.py +0 -0
  51. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/input_outputs/lambda_api_gateway.py +0 -0
  52. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/input_outputs/lambda_api_gateway_web_socket.py +0 -0
  53. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/input_outputs/lambda_elb.py +0 -0
  54. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/input_outputs/lambda_http_gateway.py +0 -0
  55. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/input_outputs/lambda_invocation.py +0 -0
  56. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/input_outputs/lambda_sns.py +0 -0
  57. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/input_outputs/lambda_sqs_standard.py +0 -0
  58. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/mocks/__init__.py +0 -0
  59. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/mocks/actions/__init__.py +0 -0
  60. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/mocks/actions/ses.py +0 -0
  61. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/mocks/actions/sns.py +0 -0
  62. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/mocks/actions/sqs.py +0 -0
  63. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/mocks/actions/step_function.py +0 -0
  64. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/secrets/__init__.py +0 -0
  65. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/secrets/additional_configs/__init__.py +0 -0
  66. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/secrets/additional_configs/iam_db_auth.py +0 -0
  67. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/secrets/additional_configs/iam_db_auth_with_ssm.py +0 -0
  68. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/secrets/additional_configs/mysql_connection_dynamic_producer_via_ssh_cert_bastion.py +0 -0
  69. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/secrets/additional_configs/mysql_connection_dynamic_producer_via_ssm_bastion.py +0 -0
  70. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/secrets/akeyless_with_ssm_cache.py +0 -0
  71. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/secrets/parameter_store.py +0 -0
  72. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/secrets/secrets_manager.py +0 -0
  73. {clear_skies_aws-1.9.18 → clear_skies_aws-1.10.0}/src/clearskies_aws/web_socket_connection_model.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: clear-skies-aws
3
- Version: 1.9.18
3
+ Version: 1.10.0
4
4
  Summary: clearskies bindings for working in AWS
5
5
  License: MIT
6
6
  Author: Conor Mancone
@@ -14,8 +14,12 @@ Classifier: Programming Language :: Python :: 3.12
14
14
  Classifier: Programming Language :: Python :: 3.13
15
15
  Provides-Extra: akeyless
16
16
  Provides-Extra: ses
17
+ Requires-Dist: akeyless (>=4.0.0,<5.0.0) ; extra == "akeyless"
18
+ Requires-Dist: akeyless-cloud-id (>=0.2.3,<0.3.0) ; extra == "akeyless"
17
19
  Requires-Dist: boto3 (>=1.26.148,<2.0.0)
18
20
  Requires-Dist: clear-skies (>=1.14.4,<2.0.0)
21
+ Requires-Dist: jinja2 (>=3.1.2,<4.0.0) ; extra == "ses"
22
+ Requires-Dist: types-boto3[dynamodb,sns,sqs] (>=1.38.13,<2.0.0)
19
23
  Project-URL: Repository, https://github.com/cmancone/clearskies-aws
20
24
  Description-Content-Type: text/markdown
21
25
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  [tool.poetry]
4
4
  name = "clear-skies-aws"
5
- version = "1.9.18"
5
+ version = "1.10.0"
6
6
  description = "clearskies bindings for working in AWS"
7
7
  authors = [
8
8
  "Conor Mancone <cmancone@gmail.com>",
@@ -17,18 +17,21 @@ packages = [
17
17
 
18
18
  [tool.poetry.dependencies]
19
19
  python = "^3.10"
20
- clear-skies = "^1.14.4"
21
20
  boto3 = "^1.26.148"
21
+ clear-skies = "^1.14.4"
22
+ types-boto3 = {extras = ["dynamodb", "sns", "sqs"], version = "^1.38.13"}
23
+ akeyless = {version = "^4.0.0", optional = true}
24
+ akeyless-cloud-id = {version = "^0.2.3", optional = true}
25
+ jinja2 = {version = "^3.1.2", optional = true}
22
26
 
23
27
  [[tool.poetry.source]]
24
28
  name = "PyPI"
25
29
  priority = "primary"
26
30
 
27
31
  [tool.poetry.group.dev.dependencies]
32
+
28
33
  pre-commit = "^3.2.2"
29
- jinja2 = {version = "^3.1.2", optional = true}
30
- akeyless = {version = "^4.0.0", optional = true}
31
- akeyless-cloud-id = {version = "^0.2.3", optional = true}
34
+ pytest = "^8.3.5"
32
35
 
33
36
  [tool.poetry.extras]
34
37
  akeyless = ["akeyless-cloud-id", "akeyless"]
@@ -1,6 +1,9 @@
1
1
  import unittest
2
2
  from unittest.mock import MagicMock, call
3
+
3
4
  from .assume_role import AssumeRole
5
+
6
+
4
7
  class AssumeRoleTest(unittest.TestCase):
5
8
  def test_with_external_id(self):
6
9
  sts = MagicMock()
@@ -18,7 +21,7 @@ class AssumeRoleTest(unittest.TestCase):
18
21
  boto3.Session = MagicMock(return_value='MOAR BOTO')
19
22
 
20
23
  assume_role = AssumeRole(role_arn='aws:arn:role/name', external_id='12345')
21
- self.assertEquals('MOAR BOTO', assume_role(boto3))
24
+ self.assertEqual("MOAR BOTO", assume_role(boto3))
22
25
  boto3.client.assert_called_with("sts")
23
26
  boto3.Session.assert_called_with(
24
27
  aws_access_key_id="access-key",
@@ -54,7 +57,7 @@ class AssumeRoleTest(unittest.TestCase):
54
57
  role_session_name="sup",
55
58
  duration=7200,
56
59
  )
57
- self.assertEquals('MOAR BOTO', assume_role("not-boto3"))
60
+ self.assertEqual("MOAR BOTO", assume_role("not-boto3"))
58
61
  boto3.client.assert_called_with("sts")
59
62
  boto3.Session.assert_called_with(
60
63
  aws_access_key_id="access-key",
@@ -0,0 +1,12 @@
1
+ from .dynamo_db_backend import DynamoDBBackend
2
+ from .dynamo_db_parti_ql_backend import DynamoDBPartiQLBackend, DynamoDBPartiQLCursor
3
+ from .dynamo_db_condition_parser import DynamoDBConditionParser
4
+ from .sqs_backend import SqsBackend
5
+
6
+ __all__ = [
7
+ "DynamoDBBackend",
8
+ "SqsBackend",
9
+ "DynamoDBPartiQLBackend",
10
+ "DynamoDBPartiQLCursor",
11
+ "DynamoDBConditionParser",
12
+ ]
@@ -1,14 +1,17 @@
1
- from clearskies.backends.backend import Backend
2
- from boto3.dynamodb import conditions as dynamodb_conditions
3
- from decimal import Decimal
4
- from clearskies.column_types.float import Float
5
- from clearskies.column_types.integer import Integer
6
- from clearskies.column_types.boolean import Boolean
7
- import json
8
1
  import base64
2
+ import json
3
+ from decimal import Decimal
9
4
  from typing import Any, Callable, Dict, List, Tuple
5
+
6
+ from boto3.dynamodb import conditions as dynamodb_conditions
10
7
  from clearskies import model
11
8
  from clearskies.autodoc.schema import String as AutoDocString
9
+ from clearskies.backends.backend import Backend
10
+ from clearskies.column_types.boolean import Boolean
11
+ from clearskies.column_types.float import Float
12
+ from clearskies.column_types.integer import Integer
13
+
14
+
12
15
  class DynamoDBBackend(Backend):
13
16
  """
14
17
  DynamoDB is complicated.
@@ -1,12 +1,15 @@
1
1
  import unittest
2
- from unittest.mock import MagicMock
3
2
  from collections import OrderedDict
4
- from types import SimpleNamespace
5
3
  from decimal import Decimal
6
- from .dynamo_db_backend import DynamoDBBackend
4
+ from types import SimpleNamespace
5
+ from unittest.mock import MagicMock
6
+
7
7
  import clearskies
8
- from ..di import StandardDependencies
9
8
  from boto3.dynamodb import conditions as dynamodb_conditions
9
+
10
+ from ..di import StandardDependencies
11
+
12
+
10
13
  class User(clearskies.Model):
11
14
  def __init__(self, dynamo_db_backend, columns):
12
15
  super().__init__(dynamo_db_backend, columns)
@@ -87,24 +90,27 @@ class DynamoDBBackendTest(unittest.TestCase):
87
90
  user.save({'name': 'sup', 'age': 5, 'category_id': '1-2-3-4'})
88
91
  self.boto3.resource.assert_called_with('dynamodb', region_name='us-east-2')
89
92
  self.dynamo_db.Table.assert_called_with('users')
90
- self.assertEquals(1, len(self.dynamo_db_table.put_item.call_args_list))
93
+ self.assertEqual(1, len(self.dynamo_db_table.put_item.call_args_list))
91
94
  call = self.dynamo_db_table.put_item.call_args_list[0]
92
- self.assertEquals((), call.args)
93
- self.assertEquals(1, len(call.kwargs))
95
+ self.assertEqual((), call.args)
96
+ self.assertEqual(1, len(call.kwargs))
94
97
  self.assertTrue('Item' in call.kwargs)
95
98
  saved_data = call.kwargs['Item']
96
99
  # we're doing this a bit weird because the UUIDs will generate random values.
97
100
  # I could mock it, or I could just be lazy and grab it from the data I was given.
98
- self.assertEquals({
99
- 'id': saved_data['id'],
100
- 'name': 'sup',
101
- 'age': 5,
102
- 'category_id': '1-2-3-4',
103
- }, saved_data)
104
- self.assertEquals(saved_data['id'], user.id)
105
- self.assertEquals(5, user.age)
106
- self.assertEquals('1-2-3-4', user.category_id)
107
- self.assertEquals('sup', user.name)
101
+ self.assertEqual(
102
+ {
103
+ "id": saved_data["id"],
104
+ "name": "sup",
105
+ "age": 5,
106
+ "category_id": "1-2-3-4",
107
+ },
108
+ saved_data,
109
+ )
110
+ self.assertEqual(saved_data["id"], user.id)
111
+ self.assertEqual(5, user.age)
112
+ self.assertEqual("1-2-3-4", user.category_id)
113
+ self.assertEqual("sup", user.name)
108
114
 
109
115
  def test_update(self):
110
116
  self.dynamo_db_table.update_item = MagicMock(
@@ -135,10 +141,10 @@ class DynamoDBBackendTest(unittest.TestCase):
135
141
  },
136
142
  ReturnValues="ALL_NEW",
137
143
  )
138
- self.assertEquals('1-2-3-4', user.id)
139
- self.assertEquals('hello', user.name)
140
- self.assertEquals(10, user.age)
141
- self.assertEquals('1-2-3-5', user.category_id)
144
+ self.assertEqual("1-2-3-4", user.id)
145
+ self.assertEqual("hello", user.name)
146
+ self.assertEqual(10, user.age)
147
+ self.assertEqual("1-2-3-5", user.category_id)
142
148
 
143
149
  def test_delete(self):
144
150
  self.dynamo_db_table.delete_item = MagicMock()
@@ -158,24 +164,24 @@ class DynamoDBBackendTest(unittest.TestCase):
158
164
  users = self.di.build(Users)
159
165
  user = users.where('id=1-2-3-4').first()
160
166
  self.assertTrue(user.exists)
161
- self.assertEquals('1-2-3-4', user.id)
162
- self.assertEquals(10, user.age)
163
- self.assertEquals('4-5-6', user.category_id)
164
- self.assertEquals(1, len(self.dynamo_db_table.query.call_args_list))
167
+ self.assertEqual("1-2-3-4", user.id)
168
+ self.assertEqual(10, user.age)
169
+ self.assertEqual("4-5-6", user.category_id)
170
+ self.assertEqual(1, len(self.dynamo_db_table.query.call_args_list))
165
171
  call = self.dynamo_db_table.query.call_args_list[0]
166
- self.assertEquals(3, len(call.kwargs))
167
- self.assertEquals('ALL_ATTRIBUTES', call.kwargs['Select'])
168
- self.assertEquals(True, call.kwargs['ScanIndexForward'])
172
+ self.assertEqual(3, len(call.kwargs))
173
+ self.assertEqual("ALL_ATTRIBUTES", call.kwargs["Select"])
174
+ self.assertEqual(True, call.kwargs["ScanIndexForward"])
169
175
  key_condition = call.kwargs['KeyConditionExpression']
170
176
 
171
177
  # dynamodb does not make it easy to verify that the key expression was built properly,
172
178
  # and I don't think that mocking will make this any better. Hoepfully they don't
173
179
  # change their library often...
174
180
  key_column = key_condition.get_expression()['values'][0]
175
- self.assertEquals('id', key_column.name)
181
+ self.assertEqual("id", key_column.name)
176
182
  self.assertTrue(isinstance(key_column, dynamodb_conditions.Key))
177
- self.assertEquals('=', key_condition.expression_operator)
178
- self.assertEquals('1-2-3-4', key_condition.get_expression()['values'][1])
183
+ self.assertEqual("=", key_condition.expression_operator)
184
+ self.assertEqual("1-2-3-4", key_condition.get_expression()["values"][1])
179
185
 
180
186
  def test_fetch_by_id_with_sort(self):
181
187
  self.dynamo_db_table.query = MagicMock(
@@ -187,22 +193,22 @@ class DynamoDBBackendTest(unittest.TestCase):
187
193
  )
188
194
  users = self.di.build(Users)
189
195
  users = users.where('id=1-2-3-4').sort_by('category_id', 'desc').__iter__()
190
- self.assertEquals(1, len(self.dynamo_db_table.query.call_args_list))
196
+ self.assertEqual(1, len(self.dynamo_db_table.query.call_args_list))
191
197
  call = self.dynamo_db_table.query.call_args_list[0]
192
- self.assertEquals(4, len(call.kwargs))
193
- self.assertEquals('ALL_ATTRIBUTES', call.kwargs['Select'])
194
- self.assertEquals('id-category_id-index', call.kwargs['IndexName'])
195
- self.assertEquals(False, call.kwargs['ScanIndexForward'])
198
+ self.assertEqual(4, len(call.kwargs))
199
+ self.assertEqual("ALL_ATTRIBUTES", call.kwargs["Select"])
200
+ self.assertEqual("id-category_id-index", call.kwargs["IndexName"])
201
+ self.assertEqual(False, call.kwargs["ScanIndexForward"])
196
202
  key_condition = call.kwargs['KeyConditionExpression']
197
203
 
198
204
  # dynamodb does not make it easy to verify that the key expression was built properly,
199
205
  # and I don't think that mocking will make this any better. Hoepfully they don't
200
206
  # change their library often...
201
207
  key_column = key_condition.get_expression()['values'][0]
202
- self.assertEquals('id', key_column.name)
208
+ self.assertEqual("id", key_column.name)
203
209
  self.assertTrue(isinstance(key_column, dynamodb_conditions.Key))
204
- self.assertEquals('=', key_condition.expression_operator)
205
- self.assertEquals('1-2-3-4', key_condition.get_expression()['values'][1])
210
+ self.assertEqual("=", key_condition.expression_operator)
211
+ self.assertEqual("1-2-3-4", key_condition.get_expression()["values"][1])
206
212
 
207
213
  def test_fetch_by_secondary_index_twice(self):
208
214
  self.dynamo_db_table.query = MagicMock(
@@ -214,12 +220,12 @@ class DynamoDBBackendTest(unittest.TestCase):
214
220
  )
215
221
  users = self.di.build(Users)
216
222
  users = users.where('category_id=1-2-3-4').where('age>10').__iter__()
217
- self.assertEquals(1, len(self.dynamo_db_table.query.call_args_list))
223
+ self.assertEqual(1, len(self.dynamo_db_table.query.call_args_list))
218
224
  call = self.dynamo_db_table.query.call_args_list[0]
219
- self.assertEquals(4, len(call.kwargs))
220
- self.assertEquals('ALL_ATTRIBUTES', call.kwargs['Select'])
221
- self.assertEquals('category_id-age-index', call.kwargs['IndexName'])
222
- self.assertEquals(True, call.kwargs['ScanIndexForward'])
225
+ self.assertEqual(4, len(call.kwargs))
226
+ self.assertEqual("ALL_ATTRIBUTES", call.kwargs["Select"])
227
+ self.assertEqual("category_id-age-index", call.kwargs["IndexName"])
228
+ self.assertEqual(True, call.kwargs["ScanIndexForward"])
223
229
  key_condition = call.kwargs['KeyConditionExpression']
224
230
  self.assertTrue(isinstance(key_condition, dynamodb_conditions.And))
225
231
  gt_condition = key_condition.get_expression()['values'][0]
@@ -227,17 +233,17 @@ class DynamoDBBackendTest(unittest.TestCase):
227
233
 
228
234
  self.assertTrue(isinstance(equal_condition, dynamodb_conditions.Equals))
229
235
  key_column = equal_condition.get_expression()['values'][0]
230
- self.assertEquals('category_id', key_column.name)
236
+ self.assertEqual("category_id", key_column.name)
231
237
  self.assertTrue(isinstance(key_column, dynamodb_conditions.Key))
232
- self.assertEquals('=', equal_condition.expression_operator)
233
- self.assertEquals('1-2-3-4', equal_condition.get_expression()['values'][1])
238
+ self.assertEqual("=", equal_condition.expression_operator)
239
+ self.assertEqual("1-2-3-4", equal_condition.get_expression()["values"][1])
234
240
 
235
241
  self.assertTrue(isinstance(gt_condition, dynamodb_conditions.GreaterThan))
236
242
  key_column = gt_condition.get_expression()['values'][0]
237
- self.assertEquals('age', key_column.name)
243
+ self.assertEqual("age", key_column.name)
238
244
  self.assertTrue(isinstance(key_column, dynamodb_conditions.Key))
239
- self.assertEquals('>', gt_condition.expression_operator)
240
- self.assertEquals(Decimal('10'), gt_condition.get_expression()['values'][1])
245
+ self.assertEqual(">", gt_condition.expression_operator)
246
+ self.assertEqual(Decimal("10"), gt_condition.get_expression()["values"][1])
241
247
 
242
248
  def test_index_and_scan(self):
243
249
  self.dynamo_db_table.query = MagicMock(
@@ -249,27 +255,27 @@ class DynamoDBBackendTest(unittest.TestCase):
249
255
  )
250
256
  users = self.di.build(Users)
251
257
  users = users.where('category_id=1-2-3-4').where('age is not null').__iter__()
252
- self.assertEquals(1, len(self.dynamo_db_table.query.call_args_list))
258
+ self.assertEqual(1, len(self.dynamo_db_table.query.call_args_list))
253
259
  call = self.dynamo_db_table.query.call_args_list[0]
254
- self.assertEquals(5, len(call.kwargs))
255
- self.assertEquals('ALL_ATTRIBUTES', call.kwargs['Select'])
256
- self.assertEquals('category_id-name-index', call.kwargs['IndexName'])
257
- self.assertEquals(True, call.kwargs['ScanIndexForward'])
260
+ self.assertEqual(5, len(call.kwargs))
261
+ self.assertEqual("ALL_ATTRIBUTES", call.kwargs["Select"])
262
+ self.assertEqual("category_id-name-index", call.kwargs["IndexName"])
263
+ self.assertEqual(True, call.kwargs["ScanIndexForward"])
258
264
 
259
265
  # our key condition should be an equal search on category_id
260
266
  key_condition = call.kwargs['KeyConditionExpression']
261
267
  key_column = key_condition.get_expression()['values'][0]
262
- self.assertEquals('category_id', key_column.name)
268
+ self.assertEqual("category_id", key_column.name)
263
269
  self.assertTrue(isinstance(key_column, dynamodb_conditions.Key))
264
- self.assertEquals('=', key_condition.expression_operator)
265
- self.assertEquals('1-2-3-4', key_condition.get_expression()['values'][1])
270
+ self.assertEqual("=", key_condition.expression_operator)
271
+ self.assertEqual("1-2-3-4", key_condition.get_expression()["values"][1])
266
272
 
267
273
  # and we should have a FilterExpression which is an 'is not null' condition
268
274
  filter_condition = call.kwargs['FilterExpression']
269
275
  key_column = filter_condition.get_expression()['values'][0]
270
- self.assertEquals('age', key_column.name)
276
+ self.assertEqual("age", key_column.name)
271
277
  self.assertTrue(isinstance(key_column, dynamodb_conditions.Attr))
272
- self.assertEquals('attribute_not_exists', filter_condition.expression_operator)
278
+ self.assertEqual("attribute_not_exists", filter_condition.expression_operator)
273
279
 
274
280
  def test_scan_only(self):
275
281
  self.dynamo_db_table.scan = MagicMock(
@@ -281,14 +287,14 @@ class DynamoDBBackendTest(unittest.TestCase):
281
287
  )
282
288
  users = self.di.build(Users)
283
289
  users = users.where('category_id>1-2-3-4').__iter__()
284
- self.assertEquals(1, len(self.dynamo_db_table.scan.call_args_list))
290
+ self.assertEqual(1, len(self.dynamo_db_table.scan.call_args_list))
285
291
  call = self.dynamo_db_table.scan.call_args_list[0]
286
- self.assertEquals(2, len(call.kwargs))
287
- self.assertEquals('ALL_ATTRIBUTES', call.kwargs['Select'])
292
+ self.assertEqual(2, len(call.kwargs))
293
+ self.assertEqual("ALL_ATTRIBUTES", call.kwargs["Select"])
288
294
 
289
295
  # and we should have a FilterExpression which is an 'is not null' condition
290
296
  filter_condition = call.kwargs['FilterExpression']
291
297
  key_column = filter_condition.get_expression()['values'][0]
292
- self.assertEquals('category_id', key_column.name)
298
+ self.assertEqual("category_id", key_column.name)
293
299
  self.assertTrue(isinstance(key_column, dynamodb_conditions.Attr))
294
- self.assertEquals('>', filter_condition.expression_operator)
300
+ self.assertEqual(">", filter_condition.expression_operator)