@@ -43,44 +43,25 @@ class EncryptedClient:
43
43
44
44
_client : botocore .client .BaseClient
45
45
_encryption_config : DynamoDbTablesEncryptionConfig
46
- _expect_standard_dictionaries : Optional [bool ]
47
46
_transformer : DynamoDbEncryptionTransforms
48
47
49
48
def __init__ (
50
49
self ,
51
50
* ,
52
51
client : botocore .client .BaseClient ,
53
52
encryption_config : DynamoDbTablesEncryptionConfig ,
54
- expect_standard_dictionaries : Optional [bool ] = False ,
55
53
):
56
54
"""
57
55
Parameters:
58
56
client (botocore.client.BaseClient): Initialized boto3 DynamoDB client
59
57
encryption_config (DynamoDbTablesEncryptionConfig): Initialized DynamoDbTablesEncryptionConfig
60
- expect_standard_dictionaries (Optional[bool]): Should we expect items to be standard Python
61
- dictionaries? (default: False)
62
58
"""
63
59
self ._client = client
64
60
self ._encryption_config = encryption_config
65
- self ._expect_standard_dictionaries = expect_standard_dictionaries
66
61
self ._transformer = DynamoDbEncryptionTransforms (
67
62
config = encryption_config
68
63
)
69
64
70
- def _maybe_transform_request_to_dynamodb_item (self , item_key , ** kwargs ):
71
- if self ._expect_standard_dictionaries :
72
- dynamodb_item = dict_to_ddb (kwargs [item_key ])
73
- dynamodb_input = kwargs
74
- dynamodb_input [item_key ] = dynamodb_item
75
- else :
76
- dynamodb_input = kwargs
77
- return dynamodb_input
78
-
79
- def _maybe_transform_response_item_to_python_dict (self , response ):
80
- if self ._expect_standard_dictionaries :
81
- if hasattr (response , "Item" ):
82
- response ["Item" ] = ddb_to_dict (response ["Item" ])
83
-
84
65
def _copy_sdk_response_to_dbesdk_response (self , sdk_response , dbesdk_response ):
85
66
for sdk_response_key , sdk_response_value in sdk_response .items ():
86
67
if sdk_response_key not in dbesdk_response :
@@ -94,168 +75,142 @@ def _get_protected_methods(self):
94
75
]
95
76
96
77
def put_item (self , ** kwargs ):
97
- # TODO: refactor shared logic (DDB/Python conversions, client/table)
98
- dynamodb_input = self ._maybe_transform_request_to_dynamodb_item (item_key = "Item" , ** kwargs )
99
- # if self._expect_standard_dictionaries:
100
- # dynamodb_item = dict_to_ddb(kwargs["Item"])
101
- # dynamodb_input = kwargs
102
- # dynamodb_input["Item"] = dynamodb_item
103
- # else:
104
- # dynamodb_input = kwargs
105
78
transformed_request = self ._transformer .put_item_input_transform (
106
79
PutItemInputTransformInput (
107
- sdk_input = dynamodb_input
80
+ sdk_input = kwargs
108
81
)
109
82
).transformed_input
110
83
sdk_response = self ._client .put_item (** transformed_request )
111
84
dbesdk_response = self ._transformer .put_item_output_transform (
112
85
PutItemOutputTransformInput (
113
- original_input = dynamodb_input ,
86
+ original_input = kwargs ,
114
87
sdk_output = sdk_response ,
115
88
)
116
89
).transformed_output
117
90
self ._copy_sdk_response_to_dbesdk_response (sdk_response , dbesdk_response )
118
- self ._maybe_transform_response_item_to_python_dict (dbesdk_response )
119
91
return dbesdk_response
120
92
121
93
def get_item (self , ** kwargs ):
122
- dynamodb_input = self ._maybe_transform_request_to_dynamodb_item (item_key = "Key" , ** kwargs )
123
94
transformed_request = self ._transformer .get_item_input_transform (
124
95
GetItemInputTransformInput (
125
- sdk_input = dynamodb_input
96
+ sdk_input = kwargs
126
97
)
127
98
).transformed_input
128
99
sdk_response = self ._client .get_item (** transformed_request )
129
100
dbesdk_response = self ._transformer .get_item_output_transform (
130
101
GetItemOutputTransformInput (
131
- original_input = dynamodb_input ,
102
+ original_input = kwargs ,
132
103
sdk_output = sdk_response ,
133
104
)
134
105
).transformed_output
135
106
self ._copy_sdk_response_to_dbesdk_response (sdk_response , dbesdk_response )
136
- self ._maybe_transform_response_item_to_python_dict (dbesdk_response )
137
107
return dbesdk_response
138
108
139
109
def batch_write_item (self , ** kwargs ):
140
- # dynamodb_input = self._maybe_transform_request_to_dynamodb_item(item_key = "Key", **kwargs)
141
- dynamodb_input = kwargs
142
110
transformed_request = self ._transformer .batch_write_item_input_transform (
143
111
BatchWriteItemInputTransformInput (
144
- sdk_input = dynamodb_input
112
+ sdk_input = kwargs
145
113
)
146
114
).transformed_input
147
115
sdk_response = self ._client .batch_write_item (** transformed_request )
148
116
dbesdk_response = self ._transformer .batch_write_item_output_transform (
149
117
BatchWriteItemOutputTransformInput (
150
- original_input = dynamodb_input ,
118
+ original_input = kwargs ,
151
119
sdk_output = sdk_response ,
152
120
)
153
121
).transformed_output
154
122
self ._copy_sdk_response_to_dbesdk_response (sdk_response , dbesdk_response )
155
- # self._maybe_transform_response_to_python_dict(dbesdk_response)
156
123
return dbesdk_response
157
124
158
125
def batch_get_item (self , ** kwargs ):
159
- # dynamodb_input = self._maybe_transform_request_to_dynamodb_item(item_key = "Key", **kwargs)
160
- dynamodb_input = kwargs
161
126
transformed_request = self ._transformer .batch_get_item_input_transform (
162
127
BatchGetItemInputTransformInput (
163
- sdk_input = dynamodb_input
128
+ sdk_input = kwargs
164
129
)
165
130
).transformed_input
166
131
sdk_response = self ._client .batch_get_item (** transformed_request )
167
132
dbesdk_response = self ._transformer .batch_get_item_output_transform (
168
133
BatchGetItemOutputTransformInput (
169
- original_input = dynamodb_input ,
134
+ original_input = kwargs ,
170
135
sdk_output = sdk_response ,
171
136
)
172
137
).transformed_output
173
138
self ._copy_sdk_response_to_dbesdk_response (sdk_response , dbesdk_response )
174
- # self._maybe_transform_response_to_python_dict(dbesdk_response)
175
139
return dbesdk_response
176
140
177
141
def scan (self , ** kwargs ):
178
- # dynamodb_input = self._maybe_transform_request_to_dynamodb_item(item_key = "Key", **kwargs)
179
- dynamodb_input = kwargs
180
142
transformed_request = self ._transformer .scan_input_transform (
181
143
ScanInputTransformInput (
182
- sdk_input = dynamodb_input
144
+ sdk_input = kwargs
183
145
)
184
146
).transformed_input
185
147
sdk_response = self ._client .scan (** transformed_request )
186
148
dbesdk_response = self ._transformer .scan_output_transform (
187
149
ScanOutputTransformInput (
188
- original_input = dynamodb_input ,
150
+ original_input = kwargs ,
189
151
sdk_output = sdk_response ,
190
152
)
191
153
).transformed_output
192
154
self ._copy_sdk_response_to_dbesdk_response (sdk_response , dbesdk_response )
193
- # self._maybe_transform_response_to_python_dict(dbesdk_response)
194
155
return dbesdk_response
195
156
196
157
def transact_get_items (self , ** kwargs ):
197
- # dynamodb_input = self._maybe_transform_request_to_dynamodb_item(item_key = "Key", **kwargs)
198
- dynamodb_input = kwargs
199
158
transformed_request = self ._transformer .transact_get_items_input_transform (
200
159
TransactGetItemsInputTransformInput (
201
- sdk_input = dynamodb_input
160
+ sdk_input = kwargs
202
161
)
203
162
).transformed_input
204
163
sdk_response = self ._client .transact_get_items (** transformed_request )
205
164
dbesdk_response = self ._transformer .transact_get_items_output_transform (
206
165
TransactGetItemsOutputTransformInput (
207
- original_input = dynamodb_input ,
166
+ original_input = kwargs ,
208
167
sdk_output = sdk_response ,
209
168
)
210
169
).transformed_output
211
170
self ._copy_sdk_response_to_dbesdk_response (sdk_response , dbesdk_response )
212
- # self._maybe_transform_response_to_python_dict(dbesdk_response)
213
171
return dbesdk_response
214
172
215
173
def transact_write_items (self , ** kwargs ):
216
- # dynamodb_input = self._maybe_transform_request_to_dynamodb_item(item_key = "Key", **kwargs)
217
- dynamodb_input = kwargs
218
174
transformed_request = self ._transformer .transact_write_items_input_transform (
219
175
TransactWriteItemsInputTransformInput (
220
- sdk_input = dynamodb_input
176
+ sdk_input = kwargs
221
177
)
222
178
).transformed_input
223
179
sdk_response = self ._client .transact_write_items (** transformed_request )
224
180
dbesdk_response = self ._transformer .transact_write_items_output_transform (
225
181
TransactWriteItemsOutputTransformInput (
226
- original_input = dynamodb_input ,
182
+ original_input = kwargs ,
227
183
sdk_output = sdk_response ,
228
184
)
229
185
).transformed_output
230
186
self ._copy_sdk_response_to_dbesdk_response (sdk_response , dbesdk_response )
231
- # self._maybe_transform_response_to_python_dict(dbesdk_response)
232
187
return dbesdk_response
233
188
234
189
def query (self , ** kwargs ):
235
- # dynamodb_input = self._maybe_transform_request_to_dynamodb_item(item_key = "Key", **kwargs)
236
- dynamodb_input = kwargs
237
190
transformed_request = self ._transformer .query_input_transform (
238
191
QueryInputTransformInput (
239
- sdk_input = dynamodb_input
192
+ sdk_input = kwargs
240
193
)
241
194
).transformed_input
242
195
sdk_response = self ._client .query (** transformed_request )
243
196
dbesdk_response = self ._transformer .query_output_transform (
244
197
QueryOutputTransformInput (
245
- original_input = dynamodb_input ,
198
+ original_input = kwargs ,
246
199
sdk_output = sdk_response ,
247
200
)
248
201
).transformed_output
249
202
self ._copy_sdk_response_to_dbesdk_response (sdk_response , dbesdk_response )
250
- # self._maybe_transform_response_to_python_dict(dbesdk_response)
251
203
return dbesdk_response
252
204
253
205
def __getattr__ (self , name ):
254
- if hasattr ( self . _client , name ):
255
- print ( f'calling underlyign client { name = } ' )
256
- return getattr ( self . _client , name )
257
- # __getattr__ doesn't find protected methods by default.
258
- elif name in self ._get_protected_methods ():
206
+ # Before calling __getattr__, the class will look at its own methods.
207
+ # Any methods defined on the class are called before getting to this point.
208
+
209
+ # __getattr__ doesn't find a class' protected methods by default.
210
+ if name in self ._get_protected_methods ():
259
211
return getattr (self , name )
212
+ # If the class doesn't override a boto3 method, defer to boto3 now.
213
+ elif hasattr (self ._client , name ):
214
+ return getattr (self ._client , name )
260
215
else :
261
- raise KeyError ( "idk still " )
216
+ raise AttributeError ( f"' { self . __class__ . __name__ } ' object has no attribute ' { name } ' " )
0 commit comments